๐Ÿฆ… Swift

Structures and Classes

Kiwi๐Ÿ’ป 2022. 6. 22. 18:43

ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ์ „ํ†ต์ ์œผ๋กœ ๊ฐ์ฒด๋กœ ์•Œ๋ ค์ ธ ์žˆ์œผ๋‚˜, ์Šค์œ„ํ”„ํŠธ์˜ ๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋ณด๋‹ค ํ›จ์”ฌ ๊ธฐ๋Šฅ์ ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์žฅ์˜ ๋Œ€๋ถ€๋ถ„์€์˜ ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ์ ์ธ ์„ค๋ช…์ด๊ธฐ ๋•Œ๋ฌธ์—,์ผ๋ฐ˜์ ์ธ ์šฉ์–ด์ธ ์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค.

๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค์˜ ๋น„๊ต (Comparing Structures and Classes)

๊ณตํ†ต์ 

  • ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ํ”„๋กœํผํ‹ฐ ์ •์˜
  • ๊ธฐ๋Šฅ ์ œ๊ณต์„ ์œ„ํ•œ ๋ฉ”์„œ๋“œ ์ •์˜
  • ์„œ๋ธŒ ์Šคํฌ๋ฆฝํŠธ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์— ์ ‘๊ทผ์„ ์ œ๊ณตํ•˜๋Š” ์„œ๋ธŒ ์Šคํฌ๋ฆฝํŠธ ์ •์˜
  • ์ดˆ๊ธฐํ™” ์ƒํƒœ๋ฅผ ์„ค์ •ํ•˜๊ธฐ ์œ„ํ•œ ์ดˆ๊ธฐํ™” ์ •์˜
  • ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ๋„˜์–ด ๊ธฐ๋Šฅ์  ํ™•์žฅ์„ ์œ„ํ•œ ํ™•์žฅ
  • ํŠน์ • ์ข…๋ฅ˜์˜ ํ‘œ์ค€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ ์ค€์ˆ˜

ํด๋ž˜์Šค๋งŒ ๊ฐ€๋Šฅํ•œ ๊ธฐ๋Šฅ

  • ์ƒ์† (Inheritance) : ํด๋ž˜์Šค์˜ ์—ฌ๋Ÿฌ ์†์„ฑ์„ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ๋ฌผ๋ ค ์คŒ
  • ํƒ€์ž… ์บ์ŠคํŒ… (Type casting) : ๋Ÿฐํƒ€์ž„์— ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…์„ ํ™•์ธ
  • ์†Œ๋ฉธ์ž (Deinitializers) : ํ• ๋‹น๋œ ์ž์›์„ ํ•ด์ œ(free up) ์‹œํ‚ด
  • ์ฐธ์กฐ ์นด์šดํŠธ (Reference counting) : ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์— ํ•˜๋‚˜ ์ด์ƒ์˜ ์ฐธ์กฐ๊ฐ€ ๊ฐ€๋Šฅ

ํด๋ž˜์Šค๊ฐ€ ์ง€์›ํ•˜๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์€ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ์ฆ๋Œ€์‹œํ‚จ๋‹ค.

์ •์˜ ๊ตฌ๋ฌธ (Definition Syntax)

๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๊ตฌ๋ฌธ์€ ๋น„์Šทํ•˜๋‹ค. ๊ตฌ์กฐ์ฒด ์„ ์–ธ์˜ ํ‚ค์›Œ๋“œ๋Š” struct, ํด๋ž˜์Šค ์„ ์–ธ ํ‚ค์›Œ๋“œ๋Š” class ์ด๋‹ค.

struct SomeStructure {
    // structure definition goes here
}
class SomeClass {
    // class definition goes here
}
struct Resolution {
    var width = 0
    var height = 0
}
class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค (Structure and Class Instances)

let someResolution = Resolution()
let someVideoMode = VideoMode()

๊ตฌ์กฐ์ฒด๋‚˜ ํด๋ž˜์Šค์˜ ์ด๋ฆ„์„ ์“ฐ๊ณ  ๋’ค์— () ๋ฅผ ๋ถ™์—ฌ์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ดˆ๊ธฐ ๊ฐ’์€ default ๊ฐ’์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค.

ํ”„๋กœํผํ‹ฐ ์ ‘๊ทผ (Accessing Properties)

print("The width of someVideoMode is \(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is 0"

๊ตฌ๋ถ„์ž (.)๋กœ VideoMode ์˜ resolution ํ”„๋กœํผํ‹ฐ์— width ํ”„๋กœํผํ‹ฐ์™€ ๊ฐ™์ด ์„œ๋ธŒ ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ตฌ์กฐ์ฒด์™€ ์—ด๊ฑฐํ˜•์€ ๊ฐ’ ํƒ€์ž… (Structures and Enumerations Are Value Types)

๊ฐ’ ํƒ€์ž… (value type)์ด๋ž€ ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜์— ํ• ๋‹น๋  ๋•Œ๋‚˜ ํ•จ์ˆ˜์— ์ „๋‹ฌ๋  ๋•Œ ๋ณต์‚ฌ๋˜๋Š” ๊ฐ’์„ ๋œปํ•œ๋‹ค. Int, String, Bool, Float, Double, Array, Dictionary ๋ชจ๋‘ ๊ฐ’ํƒ€์ž…์ด๋‹ค. Swift์˜ ๋ชจ๋“  ๊ตฌ์กฐ์ฒด์™€ ์—ด๊ฑฐํ˜• ๋˜ํ•œ ๊ฐ’ํƒ€์ž…์ด๋‹ค. ์ฆ‰, ๋ชจ๋“  ๊ตฌ์กฐ์ฒด, ์—ด๊ฑฐํ˜• ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ’ํƒ€์ž…์ด๊ณ , ๊ทธ๊ฒƒ๋“ค์˜ ํ”„๋กœํผํ‹ฐ๋Š” ํ•ญ์ƒ ๋ณต์‚ฌ๋˜๋ฉฐ ์ „๋‹ฌ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

NOTEโ—๏ธ
๋ฐฐ์—ด, ๋”•์…”๋„ˆ๋ฆฌ, ๋ฌธ์ž์—ด๊ณผ ๊ฐ™์€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์˜ํ•ด ์ •์˜๋œ ์ปฌ๋ ‰์…˜ ํƒ€์ž…์€ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด ๋ณต์‚ฌ๋น„์šฉ์„ ์ค„์ธ๋‹ค. ์ด๋Ÿฌํ•œ ์ปฌ๋ ‰์…˜์€ ์›๋ณธ์„ ์ฆ‰์‹œ ๋ณต์‚ฌํ•˜์ง€์•Š๊ณ , ์›๋ณธ ์ธ์Šคํ„ด์Šค์™€ ๋ณต์‚ฌ๋ณธ ์‚ฌ์ด์— ์ €์žฅ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ๋งŒ์•ฝ ๋ณต์‚ฌ๋ณธ ๊ฐ’์ด ์ˆ˜์ •๋˜๋ ค๊ณ  ํ•˜๋ฉด ์ˆ˜์ • ์ง์ „์— ์›๋ณธ์„ ๋ณต์‚ฌํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์—์„œ๋Š” ์ฆ‰์‹œ ๋ณต์‚ฌ๋œ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd

์œ„๋Š” hd๋ผ๋Š” ์ƒ์ˆ˜๋ฅผ ์„ ์–ธํ•œ ํ›„ ํ’€ HD ๋น„๋””์˜ค (1920 ํ”ฝ์…€ ๋„ˆ๋น„์™€ 1080 ํ”ฝ์…€ ๋†’์ด)์˜ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” Resolution ์ธ์Šคํ„ด์Šค๋ฅผ ์„ค์ •ํ•œ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  cinema๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  hd ์˜ ํ˜„์žฌ ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค. Resolution ์€ ๊ตฌ์กฐ์ฒด ์ด๋ฏ€๋กœ ๊ธฐ์กด ์ธ์Šคํ„ด์Šค์˜ ๋ณต์‚ฌ๋ณธ ์ด ๋งŒ๋“ค์–ด์ง€๊ณ  ์ด ์ƒˆ ๋ณต์‚ฌ๋ณธ์ด cinema์— ํ• ๋‹น๋œ๋‹ค. hd ์™€ cinema ๊ฐ€ ํ˜„์žฌ ๊ฐ™์€ ๋„ˆ๋น„์™€ ๋†’์ด๋ฅผ ๊ฐ€์ง€์ง€๋งŒ 2๊ฐœ๋Š” ์™„๋ฒฝํ•˜๊ฒŒ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์ด๋‹ค.

cinema.width = 2048
print("cinema is now \(cinema.width) pixels wide")
// Prints "cinema is now 2048 pixels wide"
print("hd is still \(hd.width) pixels wide")
// Prints "hd is still 1920 pixels wide"

๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ถ„๋ฆฌ๋œ ์ธ์Šคํ„ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— cinema์— ๋„ˆ๋น„๋ฅผ 2048 ๋กœ ์„ค์ •ํ•ด๋„ hd์— ์ €์žฅ๋œ ๋„ˆ๋น„์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž… (Classes Are Reference Types)

๊ฐ’ํƒ€์ž…๊ณผ ๋‹ฌ๋ฆฌ, ์ฐธ์กฐํƒ€์ž…์€ ๋ณ€์ˆ˜๋‚˜ ์ƒ์ˆ˜์— ํ• ๋‹นํ•  ๋•Œ๋‚˜ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•  ๋•Œ, ๋ณต์‚ฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ธฐ์กด๊ณผ ๋™์ผํ•œ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

let tenEighty = VideoMode()
tenEighty.resolution = hd
tenEighty.interlaced = true
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0

tenEighty๋ฅผ ์ƒ์ˆ˜ alsoTenEighty์— ํ• ๋‹นํ•œ ํ›„, alsoTenEighty์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด alsoTenEighty์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’๋„ ์ˆ˜์ •๋˜์ง€๋งŒ, tenEighty์˜ ๊ฐ’๋„ ์ˆ˜์ •๋œ๋‹ค.

์‹๋ณ„ ์—ฐ์‚ฐ์ž (Identity Operators)

ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ ์ƒ์ˆ˜์™€ ๋ณ€์ˆ˜์—์„œ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒ์ˆ˜์™€ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ์‹๋ณ„ ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋™์ผ ์ธ์Šคํ„ด์Šค (Identical to) (===)
  • ๋™์ผํ•˜์ง€ ์•Š์€ ์ธ์Šคํ„ด์Šค (Not identical to) (!==)
if tenEighty === alsoTenEighty {
  print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")
}
// "tenEighty and alsoTenEighty refer to the same VideoMode instance." ๋ฅผ ์ธ์‡„ํ•จ

'๐Ÿฆ… Swift' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Methods  (0) 2022.07.04
Properties  (0) 2022.07.04
Enumerations  (0) 2022.06.15
Closures  (0) 2022.06.15
Functions  (0) 2022.06.01