์ ์ธ
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
'iOS ๐ > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ(async/await, actor, sendable) (0) | 2023.12.20 |
---|---|
[SwiftUI/Swift] ์ค์ํํธ ํ๋กํผํฐ ๋ํผ Property wrapper ๊ธฐ์ด (0) | 2023.01.24 |
์ ์ธ
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
'iOS ๐ > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ(async/await, actor, sendable) (0) | 2023.12.20 |
---|---|
[SwiftUI/Swift] ์ค์ํํธ ํ๋กํผํฐ ๋ํผ Property wrapper ๊ธฐ์ด (0) | 2023.01.24 |