์„ ์–ธ

struct ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ตฌ์กฐ์ฒด๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•  ๋•Œ class ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

struct Animal {
    var name: String
    var location: Float
}

์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์™€ ๋™์ผํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. 

let dog = Animal(name: "Dog", location: 24.566)

 

ํ”„๋กœํ† ์ฝœ ์ฑ„ํƒ

ํด๋ž˜์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

struct MyApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

SwiftUI์—์„œ ์•ฑ์ด ์‹คํ–‰๋  ๋•Œ ์ฒ˜์Œ ์‹คํ–‰๋˜๋Š” @main ์ด ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‚ดํŽด ๋ณด๋ฉด

ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๊ตฌ์กฐ์ฒด๊ฐ€ ํ•˜๋‚˜ ์„ ์–ธ๋˜์–ด ์žˆ๊ณ  App ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

protocol AnimalAction {
    func run()
}
struct Animal: AnimalAction {
    var name: String
    var location: Float
    
    func run() { }
}

ํ”„๋กœํ† ์ฝœ์„ ์„ ์–ธํ•œ ๋’ค ๊ตฌ์กฐ์ฒด์— ์ฑ„ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค์™€ ๋™์ผํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

ํ™•์žฅ

struct Animal: AnimalAction {
    var name: String
    var location: Float
}

extension Animal {
    func run() { }
}

ํด๋ž˜์Šค์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ extension์„ ์‚ฌ์šฉํ•œ ํ™•์žฅ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. 

 

๊ตฌ์กฐ์ฒด์˜ ํŠน์ง• : ๊ฐ’ ํƒ€์ž…(value type)

๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋Š” ๊ฐ’ ํƒ€์ž…์ž…๋‹ˆ๋‹ค. (ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…) ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋˜๊ฑฐ๋‚˜ ๋ณต์‚ฌ๋  ๋•Œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ณต์‚ฌ๋ณธ์ด ์ƒ์„ฑ๋˜๊ณ  ์ด ๋ณต์‚ฌ๋ณธ์ด ์ „๋‹ฌ ๋ฉ๋‹ˆ๋‹ค.

struct Person {
    var name: String
    var age: Int
    var address: String? = nil
}

์˜ˆ์‹œ๋กœ Person์ด๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. 

let kim = Person(name: "Kim", age: 16)
let min = Person(name: "Min", age: 23)

๋‘ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ๊ฐ kim๊ณผ min์ด๋ผ๋Š” ๋ณ€์ˆ˜๋ช…์œผ๋กœ ์ƒ์„ฑํ•ด ์ค๋‹ˆ๋‹ค. 

var min2 = min
min2.name = "min2"

min ์ธ์Šคํ„ด์Šค๋ฅผ min2 ์ธ์Šคํ„ด์Šค์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ min ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ min ๊ฐ์ฒด์˜ ๊ฐ’์ด ๋ณต์‚ฌ ๋˜์–ด ๊ทธ ๋ณต์‚ฌ๋œ ๊ฐ’์„ min2์—๊ฒŒ ์ „๋‹ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

min2์˜ name์„ min2๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

print(min)
print(min2)

///Person(name: "Min", age: 23, address: nil)
///Person(name: "min2", age: 23, address: nil)

min2์˜ ๊ฐ’์„ ๋ฐ”๊พธ์–ด๋„ min์˜ ๊ฐ’์€ ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด์˜ ์ฐจ์ด์ž…๋‹ˆ๋‹ค. 

 

๊ตฌ์กฐ์ฒด ํŠน์ง• : ํ•˜์œ„ ํด๋ž˜์Šค

๊ตฌ์กฐ์ฒด์—์„œ๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํด๋ž˜์Šค์—์„œ ์กด์žฌํ•˜๋˜ ์ƒ์†์˜ ๊ฐœ๋…์ด ๊ตฌ์กฐ์ฒด์—์„œ๋Š” ์—†์Šต๋‹ˆ๋‹ค. 

์ƒ์†์˜ ๊ฐœ๋…์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— as?, as!, is์™€ ๊ฐ™์€ ํƒ€์ž… ์บ์ŠคํŒ…์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์—๋Ÿฌ๋‚˜ ๊ฒฝ๊ณ ๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์—์„œ ํƒ€์ž„ ์‹๋ณ„์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

  • ๊ตฌ์กฐ์ฒด๋Š” ์ฃผ๋กœ ํด๋ž˜์Šค ๋ณด๋‹ค ์ž‘์€ ๋ฒ”์œ„์—์„œ ์‚ฌ์šฉ๋จ
  • ๊ตฌ์กฐ์ฒด๊ฐ€ ํด๋ž˜์Šค๋ณด๋‹ค ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋” ์•ˆ์ •์ 
    • ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๊ตฐ๋ฐ์—์„œ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ณด๋‹ค ๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ๋” ์•ˆ์ •์ 
  • ์ƒ์†์ด๋‚˜ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉ

 

์ฐธ๊ณ  ์‚ฌ์ดํŠธ ๋ฐ ๋„์„œ

SwiftUI ๊ธฐ๋ฐ˜์˜ iOS ํ”„๋กœ๊ทธ๋ž˜๋ฐ - ๋‹ ์Šค๋ฏธ์Šค/์ œ์ดํŽ

https://stackoverflow.com/questions/24232799/why-choose-struct-over-class