โ Struct Class ๋น๊ต
iOS๊ฐ๋ฐ์๋ก ๋ฉด์ ์ ์ค๋นํ๋ค๋ณด๋ฉด Struct์ Class์ ์ฐจ์ด์ ์ด๋ผ๋ ์ง๋ฌธ์ ์์ฃผ ์ ํ๊ฒ ๋๋ค๊ณ ํ๋ค. ๊ทธ๋์ ํฌ์คํ ์ ํด๋ณด๊ณ ์ ํ๋ค. ๋จผ์ ๊ฐ๋จํ๊ฒ ์ฐจ์ด์ ์ ๋ณด์๋ฉด, "Struct๋ ๊ฐํ์ , Class๋ ์ฐธ์กฐํ์ " ์ ๋์ด๋ค. ์ด ์ง๋ฌธ์ ํตํด ARC๋ฅผ ํตํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, ์ฐธ์กฐํ์ ๊ณผ ๊ฐ ํ์ ์ ์ฐจ์ด์ ๋ฑ์ ํจ๊ป ๋ตํ ์ ์์๊ฒ ๊ฐ๋ค.
์ฌ์ค Struct์ Class์ '์ฐจ์ด์ '๋ง ์๊ฐํ๋ค๋ฉด ๋ฌธ๋ฒ์ ์๋ ๋ด์ฉ์ ๊ณง์ด๊ณง๋๋ก ์ธ์ฐ๊ณ ๊ณต๋ถํด๋ ๋ ๊ฒ์ด๋ค.
ํ์ง๋ง ์ด ์ง๋ฌธ์ด ๋ฉด์ ์์ ์์ฃผ ๋์จ๋ค๋๊ฒ์ ๋ํด์ ์๊ฐํด๋ณธ๋ค๋ฉด, iOS๊ฐ๋ฐ์์๊ฒ ์ด๋ค ์๋ฏธ๋ฅผ ๊ฐ๋ ์ง๋ฌธ์ธ์ง ์กฐ๊ธ ๋ ์๊ฐํด๋ณผ ํ์๊ฐ ์๋ค. ๊ฒฐ๊ตญ "๊ฐ๋ฐ์๊ฐ ๊ฐ์ฅ ์ค์ํ๊ฒ ๊ณ ๋ คํด์ผ ํ ๊ฒ ์ค ํ๋๋ ์ฑ๋ฅ์ด๊ณ , Struct์ Class์ ์ฐจ์ด์ ์ ์ดํดํ๋ค๋ฉด ์ฑ๋ฅ๊ฐ์ ์๋ ๋์์ด ๋ ๊ฒ์ด๋ค" ๋ผ๋ ๊ฒ์ด๋ค.
์ฆ, ๋ฉด์ ์์ 'Class์ Struct์ ์ฐจ์ด์ ์ ๋ฌด์์ธ๊ฐ์?'๋ผ๊ณ ์ง๋ฌธ์ด ๋ค์ด์ค๋ ๊ฒ์ ๋จ์ํ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์์ ๋จธ๋ฌด๋๊ฒ ์๋๋ผ, ์กฐ๊ธ ๋ ๊น๊ฒ ๊ณต๋ถํ๊ณ ์ดํดํ๊ณ ์๋์ง, ๊ฒฐ๊ตญ ๊ทธ๋ ๊ฒ ์ดํดํ ๊ฒ์ ํตํด ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋์ง ํ๋จํ๊ธฐ ์ํด์๊ฐ ์๋๊นํ๋ค.
์ฐ์ ๊ณต์์ ์ธ Struct์ Class์ ๊ณตํต์ ๊ณผ ์ฐจ์ด์ ์ ๋ํด์ ์์๋ณด์.
โ Class & Struct ๊ณตํต์
- ๊ฐ์ ์ ์ฅํ ํ๋กํผํฐ๋ฅผ ์ ์ธํ ์ ์๋ค.
- ํจ์์ ๊ธฐ๋ฅ์ ํ๋ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๋ค.
- ์์ฑ์๋ฅผ ์ฌ์ฉํด ์ด๊ธฐ ์ํ๋ฅผ ์ค์ ํ ์ ์๋ค.
- ๋ด๋ถ ๊ฐ์ .๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํ ์ ์๋ค.
- extension์ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋ค.
- Protocol์ ์ฑํํ์ฌ ๊ธฐ๋ฅ์ ์ค์ ํ ์ ์๋ค.
โ Class & Struct ์ฐจ์ด์
Struct
- ๊ฐ ํ์ ์ด๋ค.
- ๊ตฌ์กฐ์ฒด ๋ณ์๋ฅผ ์๋ก์ด ๋ณ์์ ํ ๋นํ ๋๋ง๋ค ์๋ก์ด ๊ตฌ์กฐ์ฒด๊ฐ ํ ๋น๋๋ค.
- ์ฆ ๊ฐ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๋ณ์์ ํ ๋นํ ๋ค ๊ฐ์ ๋ณ๊ฒฝ์ํค๋๋ผ๋ ๋ค๋ฅธ ๋ณ์์ ์ํฅ์ ์ฃผ์ง ์๋๋ค ( ๊ฐ ์์ฒด๋ฅผ ๋ณต์ฌ )
Class
- ์ฐธ์กฐํ์ ์ด๋ค.
- ARC๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ๊ฐ์ ํด๋์ค ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๋ณ์์ ํ ๋นํ ๋ค ๊ฐ์ ๋ณ๊ฒฝ์ํค๋ฉด ํ ๋นํ ๋ชจ๋ ๋ณ์์ ์ํฅ์ ์ค๋ค ( ๋ฉ๋ชจ๋ฆฌ๋ง ๋ณต์ฌ )
- ์์์ด ๊ฐ๋ฅํ๋ค.
- ํ์ ์บ์คํ ์ ํตํด ๋ฐํ์์์ ํด๋์ค ์ธ์คํด์ค์ ํ์ ์ ํ์ธํ ์ ์๋ค.
- deinit์ ์ฌ์ฉํ์ฌ ํด๋์ค ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํด์ ํ ์ ์๋ค.
์ฐธ์กฐํ์ ๊ณผ ๊ฐํ์ ์ ์ฐจ์ด ๋น๊ต์ฝ๋
class SimpleClass {
var count: Int = 0
deinit {
print("ํ ๋น ํด์ ")
}
}
struct SimpleStruct {
var count: Int = 0
}
var class1 = SimpleClass()
var class2 = class1
var class3 = class2
class3.count = 3
print(class1.count) // class3์ ๊ฐ์ ๋ณ๊ฒฝํ์ง๋ง ์ฐธ์กฐ ํ์
์ด๋ฏ๋ก class1๋ ๋ณ๊ฒฝ๋จ
var struct1 = SimpleStruct()
var struct2 = struct1
var struct3 = struct2
struct2.count = 2
struct3.count = 3
print(struct1.count) // 0
print(struct2.count) // 2 <- ๊ตฌ์กฐ์ฒด๋ ๊ฐ ํ์
์ด๋ฏ๋ก ํญ์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ค.
print(struct3.count( // 3
์ด์ฒ๋ผ ํด๋์ค๋ ์ฐธ์กฐ ํ์ ์ด๋ผ ๊ฐ์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ํ ๋นํ ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝ์ํค๋ฉด ์ฐธ์กฐ๋ ๊ฐ์ฒด์ ๊ฐ์ด ๋ณ๊ฒฝ๋๊ณ , ๊ตฌ์กฐ์ฒด๋ ๊ฐ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๊ตฌ์กฐ์ฒด ๊ฐ์ฒด๋ฅผ ํ ๋นํ๋๋ผ๋ ๋งค๋ฒ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋์ด ๊ฐ์ ๋ณ๊ฒฝํ๋๋ผ๋ ๋ค๋ฅธ ๊ตฌ์กฐ์ฒด ๋ณ์์ ์ํฅ์ ์ฃผ์ง ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
โ Class์ ARC, Retain Cycle
๊ฐ๋จํ๊ฒ Swift์์ ์ฐธ์กฐ ํ์ ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ํ ARC๋ก ๊ฐ๋จํ๊ฒ ์ฝ๋๋ก ํ์ธํด๋ณด์.
// ARC
print("ARC\n")
var calssARC1 : SimpleClass? = SimpleClass()
print(CFGetRetinCount(classARC1)) // ๋ณ์์ ํ ๋นํ ๊ฐ์ฒด์ ๊ฒฝ์ฐ 2๊ฐ ๊ธฐ๋ณธ๊ฐ
var classARC2 : classARC1
print(CFGetRetainCount(classARC1)) // ์ฐธ์กฐ ์นด์ดํธ๊ฐ 1์ฆ๊ฐํ 3์ด ๋๋ค.
classARC1 = nil
print(CFGetRetinCount(classARC2)) // ์ฐธ์กฐ ์นด์ดํธ๊ฐ 1๊ฐ์ํ์ฌ 2๊ฐ ๋๋ค.
classARC2 = nil // ์ฐธ์กฐ ์นด์ดํธ๊ฐ 1 ๊ฐ์ํ์ฌ ๋ ์ด์ ์ฐธ์กฐํ๋ ๊ณณ์ด ์์ผ๋ฏ๋ก deinit ์คํ
์์ ๊ฐ์ด ํด๋์ค ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ๊ณณ์์ ์ฐธ์กฐํ๊ฒ ๋๋ฉด, ์๋ ์ธ์คํด์ค๋ฅผ ํด์ ํ๋๋ผ๋ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ๋จ์์์ด deinit์ด ์คํ๋์ง ์๋๋ค. ์ฐธ์กฐ๋๋ ๋ชจ๋ ๊ฐ๋ค์ ํด์ ํด์ค์ผ ๋น๋ก์ deinit์ด ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด๋ฌํ ํน์ง๋๋ฌธ์ RetainCycle์ด ๋ฐ์ํ๊ธฐ๋ ํ๋ค. ํด๋น ์ฝ๋๋ ๋ณด๊ณ ๊ฐ๊ฒ ๋ค.
// retain cycle
class StrongRefClassA {
var classB : StrongRefClassB?
deinit {
print("ClassA ํ ๋น ํด์ ")
}
}
class StrongRefClassB {
var classA : StrongRefClassA?
deinit {
print("ClassB ํ ๋น ํด์ ")
}
}
var classA: StrongRefClassA? = StrongRefClassA()
var classB: StrongRefClassB? = StrongRefClassB()
print(CFGetRetainCount(classA)) // reference count = 2 (๊ธฐ๋ณธ๊ฐ)
print(CFGetRetainCount(classB)) // reference count = 2 (๊ธฐ๋ณธ๊ฐ)
classA?.classB = classB
classB?.classA = classA
print(CFGetRetainCount(classA)) // reference count = 3
print(CFGetRetainCount(classB)) // reference coutn = 3
classA = nil
print(CFGetRetainCount(classB?.classA)) // reference count = 2 (๊ธฐ๋ณธ๊ฐ)
classB = nil // <- ๋ ์ด์ classA, classB์ ๋ฐ์ดํฐ์ ์ ๊ทผ ํ ์ ์์ง๋ง deinit ์คํ๋์ง ์์์ -> ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์
์์ ๊ฐ์ด ๋ ์ด์ classA, classB์ ์ ๊ทผํ ๋ฐฉ๋ฒ์ด ์๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋์ง ์์ deinit์ด ์คํ๋์ง ์์๋ค. ์ด๋ ๊ฒ ๋๋ฉด ๋ฉ๋ฌด๋ฆฌ ๋์๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ์ด๋ weak, unowned ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด ํด๊ฒฐํ ์ ์๋๋ฐ, ์ฌ๊ธฐ์๋ ๊ฐ๋จํ๊ฒ ์ฝ๋๋ก๋ง ๋ณด๊ณ ๋์ด๊ฐ๊ฒ๋ณด๊ฒ ๋ค. ARC์ ๋ํ ์์ธํ ๋ด์ฉ์ ๋ฐ๋ก ์ ๋ฆฌํ๊ฒ ๋ค.
class StrongRefClassA {
weak var classB: StrongRefClassB?
deinit {
print("ClassA ํ ๋น ํด์ ")
}
}
class StrongRefClassB {
weak var calssA: StrongRefClassA?
deinit {
print("classB ํ ๋น ํด์ ")
}
}
var classA: StrongRefClassA? = StrongRefClassA()
var classB: StrongRefClassB? = StrongRefClassB()
print(CFGetRetainCount(classA)) // refrence count = 2 ( ๊ธฐ๋ณธ๊ฐ )
print(CFGetRetainCount(classB)) // refrence count = 2 ( ๊ธฐ๋ณธ๊ฐ )
classA?.classB = classB
classB?.calssA = classA
print(CFGetRetainCount(classA)) // refrence count = 2 ( ๊ธฐ๋ณธ๊ฐ )
print(CFGetRetainCount(classB)) // refrence count = 2 ( ๊ธฐ๋ณธ๊ฐ ) -> ์ฝํ ์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ์นด์ดํธ ์ฆ๊ฐ
classA = nil // deinit ์คํ๋จ
classB = nil // deinit ์คํ๋จ -> ์ธ์คํด์ค๊ฐ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋จ -> ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ์ํ์ง ์์
์ด๋ ๊ฒ weak์ฐธ์กฐ๋ฅผ ์ฌ์ฉํ๋ฉด retain cycle์ ๋ฐฉ์ง ํ ์ ์๋ค.
์ฌ๊ธฐ๊น์ง๊ฐ ์ค์ํํธ ๊ณต์ ๋ฌธ์์์ ์ธ๊ธ๋๋ ๋ด์ฉ์ด๋ค. ํ์ง๋ง ์ด๋ฌํ ํน์ง๋ค ๋๋ฌธ์ ๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๋ ์์น๊ฐ ๋ค๋ฅธ๋ฐ, ๊ตฌ์กฐ์ฒด๋ ์ธ์ ์๊ธฐ๊ณ , ์ฌ๋ผ์ง์ง ์ปดํ์ผ ๋จ๊ณ์์ ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ Stack ๊ณต๊ฐ์ ํ ๋น๋๊ณ , ํด๋์ค๋ ์ฐธ์กฐ๊ฐ ์ด๋์ ์ด๋ป๊ฒ ๋ ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ Heap์ด๋ผ๋ ๊ณต๊ฐ์ ํ ๋นํ๊ฒ ๋๋ค.
๊ทธ๋ผ ๋ ํ ๋น์ ์ฐจ์ด๋ฅผ ์ดํด๋ณด๋๋ก ํ๊ฒ ๋ค.
โ ํ ๋น์ ์ฐจ์ด
Stack ํ ๋น
์คํ์ LIFO( Last In First Out ) ํํ์ ์๋ฃ๊ตฌ์กฐ๋ก ๊ฐ์ฅ ๋ง์ง๋ง์ ๋ค์ด๊ฐ ๊ฐ์ฒด๊ฐ ๊ฐ์ฅ ๋จผ์ ๋์ค๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์๋ฃ๊ตฌ์กฐ ํน์ฑ์ ํ๋์ ๋ช ๋ น์ด๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น, ํด์ ํ ์ ์๋ค. ๋ํ ์ปดํ์ผ ๋จ๊ณ์์ ์ธ์ ์์ฑ๋๊ณ ํด์ ๋๋์ง ์ ์ ์๋ ๊ตฌ์กฐ์ฒด์ ๊ฐ์ ๊ฐ๋ค์ด ์คํ์ ์ ์ฅ๋๊ฒ ๋๋ค.
์ค๋ ๋๋ค์ ๊ฐ๊ฐ ๋ ๋ฆฝ์ ์ธ ์คํ๊ณต๊ฐ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ์ํธ ๋ฐฐ์ ๋ฅผ ์ํ ์์์ด ํ์ํ์ง ์๋๋ค. ์ฆ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ๋ค๋ ๋ง์ด ๋๋ค. ์ด๋ฌํ ํน์ง ๋๋ฌธ์ ์คํ์ ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ์ด Heap์ ๊ฐ์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋น ๋ฅด๋ค๊ณ ํ ์ ์๋ค.
Heap ํ ๋น
Heap์๋ ์ปดํ์ผ ๋จ๊ณ์์ ์์ฑ๊ณผ ํด์ ๋ฅผ ์ ์ ์๋ ์ฐธ์กฐ ํ์ ์ ๊ฐ์ฒด๊ฐ ํ ๋น๋๋ค. ์ฆ ์ค์ํํธ์์๋ ํด๋์ค ๊ฐ์ฒด๊ฐ ํ์ ํ ๋น ๋๊ฒ ๋๋ค. Heap์ Stack๋ณด๋ค ๊ด๋ฆฌ๊ฐ ์ด๋ ต๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ณผ ํด์ ๊ฐ ํ๋์ ๋ช ๋ น์ด๋ก ์ฒ๋ฆฌ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์๊น Stack์์๋ pop, push๋ผ๋ ํ๋์ ๋ช ๋ น์ด๋ก ํ ๋น, ํด์ ๊ฐ ์ด๋ฃจ์ด์ก์ง๋ง Heap์ ์ฐธ์กฐ ๊ณ์ฐ๋ ํด์ค์ผ ํ๋ฏ๋ก Stack๋ณด๋ค ๋ณต์กํ๋ค.
๋ํ Heap์ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ ๋๋ก๋ถํฐ ์์ ํ์ง ์๋ค. ์ด๋ฅผ ๊ด๋ฆฌํด์ฃผ๊ธฐ ์ํ Lock๊ณผ ๊ฐ์ ์์๋ ํ์ํ๊ฒ ๋๊ณ ์ด๋ ๊ณง ์ค๋ฒํค๋๋ก ์ด์ด์ง๊ฒ ๋๋ค.
์ด๋ ๊ฒ Stack, Heap ํ ๋น์ ์ฐจ์ด์ ๊ณผ Swift์ Class, Struct ๊ฐ๋ค์ด ์ด๋์ ์ ์ฅ๋๋์ง ์๊ฒ๋์๋ค.
๊ทผ๋ฐ ์ฝ๋ฉ์ ํ๋ค๋ณด๋ฉด ํด๋์ค์ ๊ตฌ์กฐ์ฒด๋ฅผ ํผํฉํด์ ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์๋ฅผ๋ค์ด ํด๋์ค์์ ๊ตฌ์กฐ์ฒด ํ๋๊ฐ ์๋ค๊ฑฐ๋, ๊ตฌ์กฐ์ฒด ์์ ํด๋์ค ํ๋๊ฐ ์๋ค๊ฑฐ๋ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
์ด๋ฅผ ๋๋๊ฒ ๋๋ฉด ๊ฒฐ๊ตญ 2๊ฐ์ง ๊ฒฝ์ฐ๋ก ๋๋์ด ๋ณผ ์ ์๋ค.
- ๊ฐ ํ์
์ ํฌํจํ๋ ์ฐธ์กฐ ํ์
- ๊ฐ๋จํ๊ฒ Class์์ Struct ํ๋กํผํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ด๋ค.
- ์ด ๊ฒฝ์ฐ ์ฐธ์กฐ ํ์ ์ด ํ ๋น ํด์ ๋๊ธฐ ์ ์ ๊ฐ ํ์ ๋ ํ ๋น ํด์ ๋์ง ์๊ฒ ํ๊ธฐ ์ํด์ ๊ฐ ํ์ ๋ ํ์ ์ ์ฅํ๋ค.
- ์์ ๊ฒฝ์ฐ ๋ง๊ณ ๋ Swift์์๋ ํด๋ก์ ๋ด๋ถ์์ ์ฌ์ฉํ๋ ๊ฐ ํ์ ๋ ์์ ๊ฒฝ์ฐ์ ํด๋นํ๋ค.
- ์ฐธ์กฐ ํ์
์ ํฌํจํ๋ ๊ฐ ํ์
- Struct์์ Class ํ๋กํผํฐ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ์ด๋ค .
- ์ด ๊ฒฝ์ฐ ๊ฐ ํ์ ์ ํ์ ํ ๋น๋์ง ์์ง๋ง ๋ด๋ถ์ ์ฐธ์กฐ ํ์ ์ด ์๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฒ๋ฆฌํด์ค์ผ ํ๋ค.
โ ๊ฐ ํ์ ์ Copy-on-assignment, Copy-on-write
๊ฐ ํ์ ์ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ๋ฉด ๋ณต์ฌ๋ฅผ ํ๊ฒ ๋๋ค. ์ฆ, ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ์ ๊ฐ์ ๋ณต์ฌํ๊ฒ ๋๋๋ฐ ์ด๋ฅผ Copy-on-assignment๋ผ๊ณ ํ๋ค.
์ด์ ๋ค๋ฅด๊ฒ Copy-on-wirte๋ ๋ค๋ฅธ ๋ณ์์ ํ ๋นํ๋ฉด ์ผ๋จ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ง ์๊ณ ๊ฐ์ ๊ณณ์ ๋ณธ๋ค. ๊ทธ๋ฌ๋ค ํด๋น ๊ฐ์ ๋ณ๊ฒฝํ ๋ ์ค์ ๋ก๋ฉ๋ชจ๋ฆฌ์ ๊ฐ์ ๋ณต์ฌํ๊ณ ๊ฐ์ ๋ณ๊ฒฝํ๊ฒ ๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ต์ ํํด์ฃผ๊ธฐ ์ํจํ๋ฉฐ Swift์์๋ Int, Double, String, Array, Set, Dictionary์์๋ง ์ฌ์ฉํ๊ณ ์๋ค. ์ฐธ์กฐ ํ์ ์ ํฌํจํ๊ณ ์๋ ๊ฐ ํ์ ์ ์ด๋ฌํ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ๋ฅผ ํ ์ ์๋ค. ๋ฌผ๋ก ์ต์ง๋ก ๋ง๋ค ์ ์์ง๋ง ์ด๋ ๋ง์ ์ค๋ฒํค๋๋ฅผ ๋ฐ์์ํจ๋ค.
๊ทธ๋์ ์ธ์ Struct๋ฅผ ์ฐ๊ณ , ์ธ์ Class๋ ์ฐ๋๊ฒ์ด ์ข์๊น ?
- ๋จ์ํ ๋ฐ์ดํฐ ๊ฐ์ ๋ณด์ ํ๊ณ ์ํด์๋ ๊ตฌ์กฐ์ฒด๊ฐ ๋ซ๋ค.
- ๋ฉ๋ชจ๋ฆฌ์ ์คํ์ ํฌ๊ธฐ๊ฐ ํฌ์ง ์๊ธฐ ๋๋ฌธ์ ์์ ๊ฐ์ ๊ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
- Objective-C์ ์ํธ ์ด์ฉ์ฑ์ ์ํ ๋๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
๐ ์๋ฒ์์ JSON ์ ๋ณด๊ฐ์ ๊ฒ์ ๊ฐ์ ธ์ฌ๋ ๊ตฌ์กฐ์ฒด ( Struct ) ๋ฅผ ์ด๋ค.
Why ? Struct๋ ์ด๋์ ์ฌ์ฉํด๋ ๊ฐ์ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ ์์ ํ๋ค.
์ด๊ฒ์ ์ฌ๋ฌ๋ฒ ๋ง๋ค์ด๋, ์ต์ด ์๋ณธ์ด ๋ฐ๋์ด๋ ๋ณต์ฌ๋ณธ๋ค์ด ๋ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ ์ธ์ ํจ์๋ ๊ธฐ๋ฅ๋ค์ ์งํฉ ํน์ ์์์ด ํ์ํ ๊ฒฝ์ฐ ํด๋์ค ( Class ) ๋ฅผ ์ฌ์ฉํ๋ค.
์ด๋ ๊ฒ Swift์ ๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ๋ํด์ ์์๋ณด์๋ค.
'๐ iOS > Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS][Swift] Dismiss Live Activities on App Termination ( feat. Semaphore ) (0) | 2025.01.09 |
---|---|
[Swift][iOS] GCD API ๋์ ๋ฐฉ์๊ณผ ํ์์ฑ (1) (0) | 2023.06.13 |
[Swift][iOS] QOS (0) | 2023.06.13 |
[Swift] Dispatch Queue (0) | 2023.01.27 |