- ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฌ๋ฆฌ Swift๋ ์ฌ์ฉ์ ์ ์ ๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ๋ํด ๋ณ๋์ ์ธํฐํ์ด์ค์ ๊ตฌํ ํ์ผ์ ๋ง๋ค ํ์๊ฐ ์์ต๋๋ค. Swift์์ ๋จ์ผ ํ์ผ๋ก ๊ตฌ์กฐ์ฒด ๋๋ ํด๋์ค๋ฅผ ์ ์ํ๋ฉด ํด๋น ํด๋์ค ๋๋ ๊ตฌ์กฐ์ฒด์ ๋ํ ์ธ๋ถ ์ธํฐํ์ด์ค๊ฐ ์๋์ผ๋ก ๋ค๋ฅธ ์ฝ๋์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ ๋ค์๊ณผ ๊ฐ์ ๊ณตํต์ ์ ๊ฐ์ง๋๋ค.
- ๊ฐ์ ์ ์ฅํ๋ ํ๋กํผํฐ ์ ์
- ๊ธฐ๋ฅ ์ ๊ณต์ ์ํ ๋ฉ์๋ ์ ์
- ์๋ธ ์คํฌ๋ฆฝํธ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ฐ์ ์ ๊ทผ์ ์ ๊ณตํ๋ ์๋ธ ์คํฌ๋ฆฝํธ ์ ์
- ์ด๊ธฐํ ์ํ๋ฅผ ์ค์ ํ๊ธฐ ์ํ ์ด๊ธฐํ ์ ์
- ๊ธฐ๋ณธ ๊ตฌํ์ ๋์ด ๊ธฐ๋ฅ์ ํ์ฅ์ ์ํ ํ์ฅ
- ํน์ ์ข ๋ฅ์ ํ์ค ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋กํ ์ฝ ์ค์
๊ตฌ์กฐ์ฒด๋ struct ํค์๋๋ก ํด๋์ค๋ class ํค์๋๋ก ์์ํด ์ ์ํ ์ ์์ต๋๋ค. ๊ตฌ์กฐ์ฒด๋ ํด๋์ค์ ๋ณ์๋ฅผ ์์ฑ(property)์ด๋ผ๊ณ ํ๊ณ ํจ์๋ฅผ ๋ฉ์๋(method)๋ผ๊ณ ํฉ๋๋ค.
class Dog {
var name = "๊ฐ์์ง"
var weight = 0
func sit() {
print("์์์ต๋๋ค.")
}
func layDown() {
print("๋์ ์ต๋๋ค.")
}
}
struct Bird {
var name = "์"
var weight = 0.0
func fly() {
print("๋ ์๊ฐ๋๋ค.")
}
}
ํด๋์ค์ ๊ตฌ์กฐ์ฒด ๋๋ค ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์ด๋ธ ๊ฒ์ ์ธ์คํด์ค(instance)๋ผ๊ณ ํ๊ณ ์ธ์คํด์ค๋ ์ค์ ๋ก ๋ฉ๋ชจ๋ฆฌ์ ํ ๋น๋์ด ๊ตฌ์ฒด์ ์ค์ฒด๋ฅผ ๊ฐ์ถ ๊ฒ์ ๋๋ค. ๊ตฌ์กฐ์ฒด์ ํด๋์ค ๋ชจ๋ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์ํด ์ด๊ธฐํ ๊ตฌ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ํํ๋ ๊ตฌ์กฐ์ฒด๋ ํด๋์ค ์ด๋ฆ ๋ค์ ๋น ์๊ดํธ๋ฅผ ๋ถ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ๋ชจ๋ ํ๋กํผํฐ๊ฐ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด๊ธฐํ๋๋ ํด๋์ค ๋๋ ๊ตฌ์กฐ์ฒด์ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฌํ ์ธ์คํด์ค์ ํ๋กํผํฐ์ ์ ๊ทผํ๊ธฐ ์ํด ์ ๊ตฌ๋ฌธ(.)์ ์ฌ์ฉํฉ๋๋ค.
var bori = Dog()
var aBird = Bird()
bori.weight = 0.3
bori.weight // 0.3
aBird.fly() // ๋ ์๊ฐ๋๋ค.
๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ์ฐจ์ด์ ์ ๊ณต๋ถํ๋ฉด์ ๊ทธ๋ฅ ๊ทธ๋ ๊ตฌ๋ ํ๋ฉด์ ๋์ด๊ฐ๋ ๋ถ๋ถ๋ค์ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ์ ์ฐ๊ด์ง์ด ์ ์ฐจ์ด๊ฐ ์๊ธฐ๋ ์ง๋ฅผ ํ์คํ๊ฒ ์๊ฒ๋์๊ณ ์ด๋ฅผ ๊ณต๋ถํ๊ณ ์ ๋ฆฌํด๋ณด์์ต๋๋ค.
ํ๋ก๊ทธ๋จ์ด ์คํํ๊ฒ ๋๋ฉด OS๋ ๋ฉ๋ชจ๋ฆฌ์ ๊ณต๊ฐ์ ํ ๋นํด์ฃผ๋๋ฐ ํ ๋นํด์ฃผ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ Code, Data, Heap, Stack 4๊ฐ์ง๊ฐ ์์ต๋๋ค.
Code ์์ญ์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์์ค์ฝ๋๊ฐ ๊ธฐ๊ณ์ด ํํ๋ก ๋ค์ด ๊ฐ๋ ๋ถ๋ถ์ผ๋ก CPU๊ฐ ์์ฐจ์ ์ผ๋ก ํ์ค์ฉ ์คํํฉ๋๋ค. ํ๋ก๊ทธ๋จ ์คํ ์ค ์ฝ๋๊ฐ ๋ฐ๋๋ฉด ์๋๋ Read-Only๋ก ์ ์ฅ๋ฉ๋๋ค.
Data ์์ญ์ ์ ์ญ๋ณ์๋ ํ์ ์์ฑ์ด ํ ๋น๋๋ ์์ญ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์์๊ณผ ๋์์ ํ ๋น๋๊ณ , ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋์ด์ผ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ฉธ๋๋ ์์ญ์ ๋๋ค.
Heap ์์ญ์ ์ฌ์ฉ์์ ์ํด ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ๋์ ์ผ๋ก ํ ๋น๋๊ณ ํด์ ๋๋ฉฐ ํด๋์ค์ ๊ฐ์ฒด๋ ํด๋ก์ ๊ฐ์ ์ฐธ์กฐํ์ ์ ๊ฐ์ด ํ ๋น๋ฉ๋๋ค. ์ฌ์ฉํ๊ณ ๋ ํ์๋ ๋ฉ๋ชจ๋ฆฌ ํด์ ๋ฅผ ํด์ค์ผ ํ์ง๋ง ์ค์ํํธ๋ ARC๋ฅผ ํตํด ํ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ์ด์ ์ธ๋ชจ ์์ด์ง๋ฉด(์ฐธ์กฐ๋์ง ์์ผ๋ฉด) ์๋์ผ๋ก ํด์ ํด์ค๋ค๊ณ ํฉ๋๋ค. ARC๋ ๋์ค์ ๊ผญ ๊ณต๋ถํด์ ์ ๋ฆฌํด๋ด์ผ๊ฒ ์ด์
Stack ์์ญ์ ํจ์์ ์คํ์ ํ์ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๊ณ ์ฌ์ฉ ์๋ฃ ํ์๋ ์ ์ฅ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋ฉ๋๋ค.
์คํ์์ญ์ CPU๊ฐ ํจ์จ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๊ธฐ์ ์ต์ ํ๊ฐ ๋์ด์์ด ์๋๊ฐ ๋น ๋ฅด๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ํด์ ํ์ง ์์๋ ๋๋ ๋ฐ๋ฉด ํ ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ด๋ฆฌํด์ผํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๋์์ ์ํ์ฑ์ด ์๊ณ ํ ๋น/ํด์ ์์ ์ผ๋ก ์ธํด ์๋๊ฐ ์คํ์ ๋นํด ๋๋ฆฝ๋๋ค. ๋ ์คํ์์ญ์ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ๋ํ ์ ํ์ด ์์ง๋ง ํ ์์ญ์ ์ปดํจํฐ์ ๋จ์์๋ ๋ฉ๋ชจ๋ฆฌ ๋ด์์๋ ๋ฉ๋ชจ๋ฆฌ ํฌ๊ธฐ์ ๋ํ ์ ํ์ด ์์ต๋๋ค.
Swift์ Type์ ํฌ๊ฒ Value Type(๊ฐ ํ์ )๊ณผ Reference Type(์ฐธ์กฐ ํ์ )์ผ๋ก ๋๋ฉ๋๋ค. ๊ฐ ํ์ ์ ๋ณ์ ๋๋ ์์์ ํ ๋น๋ ๋๋ ํจ์๋ก ์ ๋ฌ๋ ๋ ๋ณต์ฌ ๋๋ ๊ฐ์ธ ํ์ ์ด๊ณ ์ฐธ์กฐ ํ์ ์ ๋ณต์ฌ๋ณธ ๋์ ์ ์กด์ฌํ๋ ๊ฐ์ ์ธ์คํด์ค์ ๋ํ ์ฐธ์กฐ๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
๊ตฌ์กฐ์ฒด๋ Value Type(๊ฐ ํ์ ), ํด๋์ค๋ Reference Type(์ฐธ์กฐ ํ์ )์ ๋๋ค. ์ด๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์กฐ ๊ด๋ จํด์ ์๊ธฐ๋ฅผ ํด๋ณด๋ฉด ๊ฐ ํ์ ์ธ ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค(๊ทธ ์ค ํ๋กํผํฐ. ๋ฉ์๋๋ ๋ฐ์ดํฐ ์์ญ์ ์ ์ฅ๋๋ค.)๋ Stack ์์ญ์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ , ์ฐธ์กฐ ํ์ ์ธ ํด๋์ค์ ์ธ์คํด์ค๋ Heap ์์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ ํจ์๋ฅผ ์คํํ๊ฒ ๋๋ฉด Heap์ ์ฃผ์๋ฅผ ์ ๋ฌํด์ค๋๋ค. ๊ตฌ์กฐ์ฒด๋ ํด๋์ค ์์ฒด๋ ๋ฐ์ดํฐ ์์ญ์ ์ ์ฅ๋ผ์.
Value Type ๊ฐ -> Stack์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น Reference Type ๊ฐ -> Heap์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น
์ถ๊ฐ) Value Type์ด Heap์, Reference Type ์ด Stack์ ์ ์ฅ๋๋ ์ํฉ๋ ์๋ค๊ณ ํฉ๋๋ค. ์ฐธ๊ณ
class Person {
var name = "์ฌ๋"
}
struct Animal {
var name = "๋๋ฌผ"
}
var p = Person() // x1234 <- Heap์ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํด
p.name // ์ฌ๋
var a = Animal()
a.name // ๋๋ฌผ
var p2 = p // (ํด๋์ค) // x1234 <- ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ๋ณต์ฌ๋์ ๋ด๊น
p.name = "ํ๋ฆฌ"
p.name // ํด๋ฆฌ
p2.name // ํด๋ฆฌ
var a2 = a // (๊ตฌ์กฐ์ฒด)
a.name = "๊ฐ์์ง"
a.name // ๊ฐ์์ง
a2.name // ๋๋ฌผ
์ด๋ฐ ์ฐจ์ด๊ฐ ์ธ์คํด์ค ์ ์ธ์ ์์(let)๋ ๋ณ์(var)๋ก ์์ฑํ ๋์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
- ์ธ์คํด์ค ์์(let)์ผ๋ก ์ ์ธ์ ๊ตฌ์กฐ์ฒด -> ์ ์ฅ ์์ฑ์ด ์ ๋ถ ์์๋ก ์ ์ธ๋จ ํด๋์ค -> ๊ฐ๋ฅดํค๋ ์ธ์คํด์ค ๊ณ ์ (์ ์ฅ ์์ฑ์ ๊ฐ let/var ์ ์ธ์ ๋ฐ๋ฆ)
- ์ธ์คํด์ค ๋ณ์(var)๋ก ์ ์ธ์์๋ ๊ตฌ์กฐ์ฒด๋ ์ ์ฅ ์์ฑ์ ๊ฐ let/var ์ ์ธ์ ๋ฐ๋ฅธ๋ค.
๊ทธ๋ฆฌ๊ณ ์์์์๋ ์ฐจ์ด๋ฅผ ๋ณด์ ๋๋ค. ๊ตฌ์กฐ์ฒด๋ ์์์ด ๋ถ๊ฐ๋ฅํ ๋ฐ๋ฉด์ ํด๋์ค๋ ์์์ด ๊ฐ๋ฅํฉ๋๋ค. ํด๋์ค๋ง์ด ์์ ๊ฐ๋ฅํฉ๋๋ค. ์์์ ๋ํด์๋ ๋ค์์ ๋ ์์ธํ ๋ค๋ค๋ณผ๊ฒ์.
-
์ฐ๊ด๋ ๋ฐ์ดํฐ๋ค์ ๋จ์ํ ๋ฌถ๋ ๊ฒ์ด ๋ชฉ์ ์ผ ๋๋ ๊ตฌ์กฐ์ฒด๊ฐ ๋ซ์ต๋๋ค.
-
๊ตฌ์กฐ์ฒด์ ์ ์ฅ๋ ์ ์ฅ ์์ฑ๋ค์ด ๊ฐ ํ์ ์ด๋ฉฐ ์ฐธ์กฐํ๋ ๊ฒ๋ณด๋ค ๋ณต์ฌํ๋ ๊ฒ์ด ํฉ๋นํ ๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
ํด๋น ๋ชจ๋ธ์ serializeํด์ ์ ์กํ๊ฑฐ๋ ํ์ผ๋ก ์ ์ฅํ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ฉด ํด๋์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
-
Objectice-C์ ์ํธ ์ด์ฉ์ฑ์ ์ํ ๋๋ ํด๋์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- Objective-C์์ ์ง์ํ๋ API๋ฅผ ์ฌ์ฉํด์ผ ํ ๋๋ Objective-C์ ํด๋์ค๋ฅผ ์์๋ฐ์ ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ํด๋์ค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
-
๊ณ ์ ํ ๊ฐ์ ์ ์ดํด์ผ ํ ๋๋ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ธ์.
- ํด๋์ค๋ ์ฐธ์กฐ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ์ค์ํํธ์์ ๊ณ ์ ํ ๊ฐ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค. ์ฐธ์กฐ ํ์ ์ ์ฌ์ฉํ๋ฉด ์ฑ์ ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฉํ๋๋ผ๋ ํ ์์ญ์์ ์ ์ฉํ ์์ ์ด ๋ค๋ฅธ ์์ญ์์๋ ์ ์ฉ๋ฉ๋๋ค. ์ฃผ๋ก ํ์ผ ๊ด๋ฆฌ๋ ๋คํธ์ํฌ ์ฐ๊ฒฐ๊ณผ ๊ฐ์ ์์ ์ ๋ค๋ฃฐ ๋ ํด๋์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
[์ฐธ๊ณ ]
- https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html
- https://developer.apple.com/documentation/swift/choosing_between_structures_and_classes
- https://sihyungyou.github.io/iOS-Memory-Architecture/
- https://sujinnaljin.medium.com/ios-swift%EC%9D%98-type%EA%B3%BC-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%A0%80%EC%9E%A5-%EA%B3%B5%EA%B0%84-25555c69ccff
