iOS/Swift

[Swift] Class์™€ Struct์— ๋Œ€ํ•ด์„œ

๊ฒฝํ‘ธ 2023. 4. 7. 14:30
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”~

 

์˜ค๋Š˜์€ ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค : )

 

Class์™€ Struct

Class์™€ Struct๋Š” ๋ชจ๋‘ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด๋ฉฐ, ๊ฐ๊ฐ์˜ ํŠน์ง•๊ณผ ์žฅ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Class์™€ Struct์˜ ๊ณตํ†ต์ , ์ฐจ์ด์ , ์–ด๋– ํ•œ ์ƒํ™ฉ์—์„œ class๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€, struct๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Class

- Class๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. Class๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์‚ฌํ•œ ์†์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋™์ž‘์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Class๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ƒ์†, ์บก์Šํ™”, ๋‹คํ˜•์„ฑ ๋“ฑ์˜ ํŠน์ง•์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Struct

- Struct๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Struct๋Š” Class์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ, Struct๋Š” ๊ฐ’ ํƒ€์ž…(Value Type)์ด๋ฉฐ Class๋Š” ์ฐธ์กฐ ํƒ€์ž…(Reference Type)์ž…๋‹ˆ๋‹ค. Struct๋Š” ํด๋ž˜์Šค์™€๋Š” ๋‹ฌ๋ฆฌ ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

Class์™€ Struct์˜ ๊ณตํ†ต์ 

  • ์†์„ฑ(Property)์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ดˆ๊ธฐํ™”(Initialization)๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ”„๋กœํ† ์ฝœ(Protocol)์„ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Class์™€ Struct์˜ ์ฐจ์ด์ 

  • Class๋Š” ์ฐธ์กฐ ํƒ€์ž…(Reference Type)์ด๋ฉฐ, Struct๋Š” ๊ฐ’ ํƒ€์ž…(Value Type)์ž…๋‹ˆ๋‹ค.
  • Class๋Š” ์ƒ์†์„ ์ง€์›ํ•˜์ง€๋งŒ Struct๋Š” ์ƒ์†์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • Class๋Š” ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•˜๊ณ , ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Struct๋Š” ๋ณต์‚ฌ๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•˜๋ฉฐ, ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

์–ด๋– ํ•œ ์ƒํ™ฉ์—์„œ Class๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€, Struct๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€?

Class์™€ Struct๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ ๊ฐ๊ฐ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Class

  • ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๊ณต์œ ํ•ด์•ผ ํ•  ๋•Œ
  • ๋‹ค๋ฅธ ๊ฐ์ฒด์™€์˜ ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•  ๋•Œ
  • ์ƒ์†์„ ์ง€์›ํ•  ๋•Œ

Struct

  • ๊ฐ„๋‹จํ•œ ๊ฐ’ ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ
  • ์ƒ์†์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ
  • ๋ณต์‚ฌ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ

 

์˜ˆ๋ฅผ ๋“ค์–ด, ์ž๋™์ฐจ๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ž๋™์ฐจ๋Š” ๋ชจ๋ธ๋ช…, ์ƒ‰์ƒ, ์ตœ๋Œ€ ์†๋„ ๋“ฑ์˜ ์†์„ฑ์„ ๊ฐ€์ง€๋ฉฐ, ์šด์ „์ž๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด์™€ ๊ด€๊ณ„๋ฅผ ๋งบ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

struct Driver {
    var name: String
    var age: Int
}

// ์šด์ „์ž์™€ ์ž๋™์ฐจ์˜ ๊ด€๊ณ„
class Car {
    var model: String
    var color: String
    var maxSpeed: Int
    var driver: Driver?
    
    init(model: String, color: String, maxSpeed: Int) {
        self.model = model
        self.color = color
        self.maxSpeed = maxSpeed
    }
}

var driver = Driver(name: "๊ฒฝํ‘ธ", age: 20)
var car = Car(model: "JEEP", color: "Black", maxSpeed: 200)
car.driver = driver

์ด๋•Œ, ์ž๋™์ฐจ๋Š” Class๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์šด์ „์ž๋Š” Struct๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

 

์ž๋™์ฐจ๋ฅผ Class๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•œ ์ด์œ ๋Š”, ์ž๋™์ฐจ๋Š” ๋ณต์žกํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์†์„ฑ์„ ๊ฐ€์ง€๋ฉฐ, ์ด๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์—๊ฒŒ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ž๋™์ฐจ์˜ ์ƒ‰์ƒ์„ ๋ณ€๊ฒฝํ•˜๋ฉด, ํ•ด๋‹น ์ž๋™์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์šด์ „์ž๋‚˜ ์„œ๋น„์Šค์„ผํ„ฐ์—์„œ ๋ชจ๋‘ ๋ณ€๊ฒฝ๋œ ์ƒ‰์ƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ž๋™์ฐจ ์ •๋ณด๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์ ๊ณ , ๊ฐ์ฒด ๊ฐ„ ์ฐธ์กฐ๊ฐ€ ๋งŽ์ด ์ผ์–ด๋‚  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฏ€๋กœ  Class๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

 

๋ฐ˜๋ฉด์— ์šด์ „์ž๋Š” ๋‹จ์ˆœํžˆ ์ด๋ฆ„, ๋‚˜์ด, ์šด์ „ํ•˜๋Š” ์ž๋™์ฐจ ์ •๋ณด๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์ˆ˜์ •ํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ๊ฐ์ฒด๋“ค์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ’ ํƒ€์ž…์ธ Struct๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์šด์ „์ž ์ •๋ณด๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’ ํƒ€์ž…์ธ Struct๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ๋ณต์‚ฌ๊ฐ€ ์ ๊ฒŒ ์ผ์–ด๋‚˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ ์œผ๋กœ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

Class ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ

    • ์ฐธ์กฐ(Reference)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, weak, unowned์™€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • Strong Reference Cycle์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๊ฐ์ฒด๋ฅผ ์„œ๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ Strong Reference Cycle์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” weak ๋˜๋Š” unowned๋กœ ์„ ์–ธ๋œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, closure์—์„œ [weak self]๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Strong Reference Cycle์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ARC์— ๋Œ€ํ•ด์„œ ์ ์–ด๋’€๋˜ ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค. ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

[Swift] ARC(Automatic Reference Counting)์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

์•ˆ๋…•ํ•˜์„ธ์š”~ ์˜ค๋Š˜์€ ARC์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ARC๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ์ค‘์—์„œ Heap ์˜์—ญ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋Œ€ํ•ด์„œ ๋จผ์ € ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ

pooh-footprints.tistory.com

 

 

์กฐ๊ธˆ ๋” ์ž์„ธํ•˜๊ฒŒ ๋œฏ์–ด๋ณด๊ณ  ๋‚ด์šฉ์„ ๋งŽ์ด ์ถ”๊ฐ€ํ•ด์•ผ๊ฒ ๋„ค์š”.

์˜ค๋Š˜์€ ์—ฌ๊ธฐ๊นŒ์ง€ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค : )

๊ทธ๋Ÿผ ์ด๋งŒ ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป ๐Ÿ‘‹๐Ÿป

๋ฐ˜์‘ํ˜•