Struct
๊ตฌ์กฐ์ฒด์ ๊ฒฝ์ฐ ๊ฐ ํ์ ์ด๋ค. ๊ฐ ํ์ (Value Type) ์ ํด๋น ํ์ ์ ์ธ์คํด์ค๊ฐ ๋ณต์ฌ๋ ๋ ์ธ์คํด์ค์ ์ค์ ๋ฐ์ดํฐ๊ฐ ๋ณต์ฌ๋๋ค. ์ด๋ ํ๋์ ์ธ์คํด์ค๋ฅผ ์์ ํ๋๋ผ๋ ๋ค๋ฅธ ๋ณต์ฌ๋ณธ์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ฐ์ ์ ์ฅ์ ์คํ์์ ์ผ์ด๋๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ์์ ์๋์ผ๋ก ์ ๊ฑฐ๋๋ค. ํด๋น ์ธ์คํด์ค๋ฅผ let์ผ๋ก ์ ์ธ ์ ์ ์ฅ ์์ฑ์ด ์ ๋ถ ์์๋ก ์ ์ฅ๋๋ค. ๋ ๋ฉค๋ฒ์์ด์ฆ ์ด๋์ ๋ผ์ด์ ๋ฅผ ์๋์ผ๋ก ์ ๊ณตํ๋ฉฐ, ๋ฉ์๋ ๋ด์์ ์์ฑ ๋ณ๊ฒฝ์ด ์์น์ ์ผ๋ก ๋ถ๊ฐ๋ฅํ๋ค. ๋ค๋ง mutating ํค์๋๋ก ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๊ธด ํ๋ค. ์๋ฉธ์๋ ์กด์ฌํ์ง ์์ผ๋ฉฐ ์์์ด ๋ถ๊ฐ๋ฅํ๋ค.
struct Student {
var name: String
var gender: String
init(name: String, gender: String) {
self.name = name
self.gender = gender
}
func printInfo() {
print("ํ์์ ์ด๋ฆ์ \\(name)์ด๊ณ ์ฑ๋ณ์ \\(gender)์
๋๋ค")
}
}
var Brooklyn = Student(name: "Brooklyn", gender: "Female")
ํด๋น ์ฝ๋๋ ๊ตฌ์กฐ์ฒด๋ก ์ด๋ฃจ์ด์ ธ ์๊ณ , ๊ฐ๊ฐ์ ํ๋กํผํฐ๋ String์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ด ๊ฐํ์ ์ผ๋ก ๊ด๋ฆฌ๋ ๊ฒ ๊ฐ์๋ฐ ์ ์ด๋ค์ ์ฐธ์กฐํ์ ์ด ๋๋ ๊ฑธ๊น? String ํ์ ์ ๋ด๋ถ์ ์ผ๋ก ์ต์ ํ๋ฅผ ์ํด Copy-On-Write ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ๋ค. String์ด ์์ ๋ ๋ ๊น์ง๋ ๋ฐ์ดํฐ์ ๋ณต์ฌ๋ณธ์ ๋ง๋ค์ง ์๊ณ ์๋ณธ ๋ฐ์ดํฐ์ ๋ํ ์ฐธ์กฐ๋ฅผ ์ ์งํ๋ค.
์ด ์ต์ ํ ๋ฐฉ์์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ํจ์จ์ ์ผ๋ก ๋ง๋ค๊ณ ์ฑ๋ฅ์ ํฅ์ ์ํจ๋ค. ์ฆ Brooklyn์ด๋ผ๋ ์ธ์คํด์ค๋ ์คํ์ ์กด์ฌํ์ง๋ง, ๋ด๋ถ์ ์ฐธ์กฐ ํ์ ๋ณ์๋ค์ ๊ฐ๊ฐ ์์ ๋๋ ์์ ์ Heap์ ์ ์ฅ๋๋ฉด์ ๋ ๊ฐ์ ์ฐธ์กฐ ์นด์ดํธ ๊ด๋ฆฌ๊ฐ ํ์ํ๋ค. ๊ทธ๋ฌ๊ธฐ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ํํ๊ฒ ๋๋ค๋ฉด, ์ฐธ์กฐ ์นด์ดํธ์ ๋ํ ์ค๋ฒํค๋๋ฅผ ์ค์ด๋ ๋ฐฉ์์ผ๋ก ์ค๊ณํด์ผํ๋ค.
๊ทธ๋ฌ๋ฉด ํด๋น ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋ง ํด๋ณด์.
enum Gender {
case male
case female
}
struct Student {
var name: String
var gender: Gender
func printInfo() {
print("ํ์์ ์ด๋ฆ์ \(name)์ด๊ณ ์ฑ๋ณ์ \(gender)์
๋๋ค")
}
}
var Brooklyn = Student(name: "Brooklyn", gender: .female)
์ด๋ ๊ฒ ์ฝ๋๋ฅผ ๋ฐ๊พธ๋ฉด ๊ฐํ์ ์ธ enum ์ ์ฌ์ฉํ์ฌ ๋ด๋ถ ์ฐธ์กฐ ์นด์ดํ ์ ์ค์ผ ์ ์๋ค. gender์ ๊ฒฝ์ฐ ์ธ์คํด์ค์ ๋ฐ์ดํฐ๊ฐ ์คํ์์ ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ค.
/**
์๋ ์๋ฆฌ
1. moveBy๊ฐ ํธ์ถ๋๋ฉด ํ์ฌ์ Point ์ธ์คํด์ค๋ ์์ ๋ณต์ฌ๋ณธ์ผ๋ก ๋ณต์ ๋จ
2. x, y ํ๋กํผํฐ๋ ์ด ์์ ๋ณต์ฌ๋ณธ์์ deltaX, deltaY ๋งํผ ์ฆ๊ฐ
3. ๋ฉ์๋๊ฐ ์ข
๋ฃ๋๋ฉด ์์ ๋ณต์ฌ๋ณธ์ด Counter ์ธ์คํด์ค๋ฅผ ๋์ฒดํจ
**/
struct Point {
var x: Int
var y: Int
mutating func moveBy(x deltaX: Int, y deltaY: Int) {
x += deltaX
y += deltaY
}
}
Class
ํด๋์ค์ ๊ฒฝ์ฐ ์ฐธ์กฐ ํ์ ์ด๋ค. ๊ฐ์ ์ ์ฅ์ Heap์์ ์ด๋ฃจ์ด์ง๋ฉฐ, ์ฃผ์ ์ ๋ฌ์ ๋ฐฉ์์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ค. ๋ฉ๋ชจ๋ฆฌ์ ๊ฒฝ์ฐ ARC๋ก ๊ด๋ฆฌ๋๋ค. ์ธ์คํด์ค๋ฅผ let์ผ๋ก ์ ์ธํ๋ฉด ํด๋น ์ธ์คํด์ค๊ฐ ๊ณ ์ ๋์ด, ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋ค. ๋ ํธ์ ์์ฑ์๊ฐ ์กด์ฌํ๋ฉฐ, ๋ฉ์๋ ๋ด์์ ์์ฑ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. ์๋ฉธ์๊ฐ ์กด์ฌํ๋ฉฐ ์์์ด ๊ฐ๋ฅํ๋ค.
class Student {
var name: String
var gender: String
init(name: String, gender: String) {
self.name = name
self.gender = gender
}
func printInfo() {
print("ํ์์ ์ด๋ฆ์ \(name)์ด๊ณ ์ฑ๋ณ์ \(gender)์
๋๋ค")
}
}
var Brooklyn = Student(name: "Brooklyn", gender: "Female")
์ด ๊ฒฝ์ฐ์๋ Brooklyn ์ธ์คํด์ค๊ฐ Heap์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ผ๋ณด๋ ํํ๊ฐ ๋๊ณ , ์ฐธ์กฐ ์นด์ดํ ์ด ํ ๋ฒ ์ผ์ด๋๊ฒ ๋๋ค.
SwiftUI์์ Struct๋ฅผ ์ฌ์ฉํ๋ ์ด์
์ฌ๊ธฐ์ ๊ถ๊ธ์ฆ์ด ์๊ฒผ๋ค. ๊ทธ๋ฌ๋ฉด SwiftUI์์ ์ Struct๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๊น?
๐ ์ด์
- ๊ฐ ํ์ ์ ํน์ฑ: ๊ตฌ์กฐ์ฒด๋ ๊ฐํ์ ์ด๋ค. ์ด๋ ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๊ฐ ๋ณต์ฌ๋ ๋, ์ค์ ๊ฐ์ด ๋ณต์ฌ๋๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ๊ฐ ์ธ์คํด์ค๋ ๋ ๋ฆฝ์ ์ธ ์ํ๋ฅผ ์ ์งํ๋ค. ์ด๋ฌํ ํน์ฑ ๋๋ถ์ UI ์ปดํฌ๋ํธ์ ์ํ๊ฐ ๋ค๋ฅธ ์ปดํฌ๋ํธ์ ์ํด ์๋์น ์๊ฒ ๋ณ๊ฒฝ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์๋ค.
- ๋ถ๋ณ์ฑ ์ง์: SwiftUI๋ UI์ ์ํ๋ฅผ ๋ถ๋ณ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ์ ํธํ๋ค. ํ๋กํผํฐ๋ค์ด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ณ์ด๋ฉฐ, ์ํ ๋ณ๊ฒฝ์ด ํ์ํ ๊ฒฝ์ฐ ๋ช ์์ ์ผ๋ก mutating ํจ์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, ์๋ก์ด ๊ตฌ์กฐ์ฒด ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ ์ทจํ๊ธฐ ๋๋ฌธ์ UI๋ฅผ ๋ ์์ ์ ์ด๊ณ ๋ฒ๊ทธ๋ฅผ ์ค์ด๋ ๋ฐ ๋์์ด ๋๋ค.
- ์ฑ๋ฅ ์ต์ ํ: ๊ตฌ์กฐ์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก ์คํ์ ํ ๋น๋๋ฉฐ, ํด๋์ค์ ํ ํ ๋น๊ณผ ์ฐธ์กฐ ์นด์ดํ ์ผ๋ก ์ธํด ๊ฒช๋ ์ค๋ฒํค๋๊ฐ ์๋ค. ๊ทธ๋ฌ๊ธฐ์ SwiftUI๋ ๋งค์ฐ ๋น ๋ฅธ ์๋๋ก ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํ๊ณ ๋ ๋๋งํ ์ ์๋ค.
- UI ์ ์ธ์ ์ ๋ฐ์ดํธ: SwiftUI๋ ์ ์ธ์ UI ์ ๋ฐ์ดํธ ๋ฐฉ์์ ์ฌ์ฉํ๋ค. ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ๋ทฐ์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์๋ก์ด ๊ตฌ์กฐ์ฒด๊ฐ ์์ฑ๋๊ณ ์๋ก์ด ๊ตฌ์กฐ์ฒด๊ฐ ์์ฑ๋๊ณ SwiftUI ํ๋ ์์ํฌ๋ ์ด๋ฅผ ํตํด UI๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธ ํ๊ธฐ ๋๋ฌธ์ ํธ๋ฆฌํ๋ค.
- ์บก์ํ: ๊ฐ ํ์ ์ ์ฌ์ฉํ๋ฉด ๊ฐ ๋ทฐ ๋๋ ์ปดํฌ๋ํธ์ ์ํ๊ฐ ์์ ํ ์บก์ํ ๋๊ธฐ ๋๋ฌธ์ ์ํ ์ค์ผ์ ์ํ์ด ์ค์ด๋ ๋ค.
'iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ARC ์์๋ณด๊ธฐ (0) | 2024.07.06 |
---|---|
Design Pattern in Swift [ ์์ฑ ํจํด ] (0) | 2023.04.17 |
[Swift] ์ด๋ฏธ์ง๋ฅผ ์ํ ์ด๋ฏธ์ง๋ก ๋ณ๊ฒฝํ๊ณ ํ ๋๋ฆฌ ์ค์ ํ๋ ๋ฐฉ๋ฒ (0) | 2022.07.05 |
[1day - 6day TIL] 100 days of swift (0) | 2022.04.30 |
[3/18 - 3/22 TIL] Coursera - LearnQuestIntroduction to Programming in Swift 5 (0) | 2022.03.22 |