๊ตฌ์กฐ์ฒด(struct)์ ํด๋์ค(class)
๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฉ๋์ ๋ง๊ฒ ๋ฌถ์ด ํํํ๊ณ ์ ํ ๋ ์ ์ฉํจ
๊ตฌ์กฐ์ฒด์ ํด๋์ค๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ์ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ ์๋ค.
ํด๋์ค๋ ๊ตฌ์กฐ์ฒด๋ฅผ ์ ์ํ๋ค == ํ๋์ ์๋ก์ด ์ฌ์ฉ์ ์ ์ ๋ฐ์ดํฐ ํ์ ์ ๋ง๋ค์ด ์ฃผ๋ ๊ฒ
๊ตฌ์กฐ์ฒด vs. ํด๋์ค
๊ตฌ์กฐ์ฒด์ ํด๋์ค ๋น๊ต(๊ณต์๋ฌธ์ ๋ฒ์ญ, WWDC ์๋ฃ ์ฐธ๊ณ )
๊ณตํต์
- ๊ฐ์ ์ ์ฅํ ํ๋กํผํฐ๋ฅผ ์ ์ํ ์ ์๋ค.
- ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฉ์๋๋ฅผ ์ ์ํ ์ ์๋ค.
- ์๋ธ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ํ ์ ์๋ค.
- ์ด๋์ ๋ผ์ด์ ๋ฅผ ํตํด ์ด๊ธฐ ์ํ๋ฅผ ์ค์ ํ ์ ์๋ค.
- extension์ ์ฌ์ฉํด ๊ธฐ๋ฅ์ ํ์ฅํ ์ ์๋ค.
- ํน์ ์ข ๋ฅ์ ํ์ค ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋กํ ์ฝ์ ์ค์ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
์ฐจ์ด์
class
- ์ฐธ์กฐ ํ์ (Reference Type)
- ์์์ด ๊ฐ๋ฅํ๋ค.
- ํ์ ์บ์คํ ์ ํตํด ๋ฐํ์์ ํด๋์ค ์ธ์คํด์ค์ ํ์ ์ ์ฒดํฌํ ์ ์๋ค.
- deinitializer๋ฅผ ํตํด ํด๋์ค ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํด์ ํ ์ ์๋ค.
- ARC๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
struct
- ๊ฐ ํ์ (Value Type)
+ WWDC ์๋ฃ๋ฅผ ์ฐธ๊ณ ํด struct์ class๋ฅผ ๋ฉ๋ชจ๋ฆฌ ์ธก๋ฉด์์ ๋น๊ตํด๋ณด๊ธฐ
1. ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ํ ๋น๋๋ ์์น
- struct๋ stack ์์ญ์ ์ ์ฅ๋จ
stack ์์ญ์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ๋ค์ ์ปดํ์ผ ํ์์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋จ -> ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐ๋ก ํ์์์
์ํ์ ์ผ๋ก ํ ๋น๊ณผ ํด์ ๊ฐ ๋น ๋ฅด๊ณ Thread Safeํจ
- class๋ heap ์์ญ์ ์ฃผ์ ๊ฐ์ด ์ ์ฅ๋จ
ํ ์์ญ์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ๋ ์ปดํ์ผ ํ์์ด ์๋ ๋ฐํ์์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋จ
ํ ์์ญ์ ํ๋์ ํ๋ก์ธ์ค์ ์ค๋ ๋๋ค์ด ๊ณต์ ํ๋ ์์ญ์ด๊ธฐ ๋๋ฌธ์ Thread Safeํ์ง ์์
ํ ์์ญ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ผ๋ก ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ค๋ฒํค๋๊ฐ ์์
2. ํด๋์ค๋ ARC๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
struct๋ ์ปดํ์ผ ํ์์ ํ ๋นํ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๊ฐ ํ์์์
reference count๋ ์ค๋ฒํค๋๋ฅผ ์ผ์ผํค๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋๋จธ์ ์ฑ๋ฅ ๊ฐ์ ํ์ํจ
์ฑ๋ฅ ๊ฐ์ ๋ฐฉ๋ฒ? final ํค์๋ ์ฌ์ฉ!
Value ํ์ (๊ฐ ํ์ ) vs Reference ํ์ (์ฐธ์กฐ ํ์ )
Valueํ์ ๊ณผ Referenceํ์ ์ ๋ฐ์ดํฐ ์ ๋ฌ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์๋ค.
- Value: ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ๊ฐ์ ๋ณต์ฌํ์ฌ ์ ๋ฌ
- Reference: ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ์ ๋ฌ
Struct๋ Value ํ์
(๊ฐ ํ์
)์ด๋ฏ๋ก ๊ฐ์ ๋ณต์ฌํ์ฌ ์ ๋ฌ
๋ฐ๋ผ์ second๋ first๋ฅผ ๋๊ฐ์ด ๋ณต์ฌํ ๋ณ๋์ ์ธ์คํด์ค๊ฐ ๋๋ ๊ฒ
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ second์ ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝํด๋ first์ ํ๋กํผํฐ ๊ฐ์๋ ์ํฅ์ด ์๋ค.
struct ValueType {
var property = 1
}
class ReferenceType {
var property = 1
}
var first = ValueType()
var second = first
second.property = 2
print(first.property) // 1
print(second.property) // 2
Class๋ Reference ํ์
(์ฐธ์กฐ ํ์
)์ด๋ฏ๋ก ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ์ ๋ฌ
๋ฐ๋ผ์ third์ fourth๋ ๋ณ๋๋ก ์กด์ฌํ๋ ๊ฒ์ด ์๋๋ผ ๊ฐ์ ์์น(๋ฉ๋ชจ๋ฆฌ ์ฃผ์)๋ฅผ ๊ฐ๋ฆฌํค๊ณ ์๋ ๊ฒ
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ fourth์ ํ๋กํผํฐ ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด third์ ํ๋กํผํฐ ๊ฐ๋ ๋ณ๊ฒฝ๋๋ค.
var third = ReferenceType()
var fourth = third
fourth.property = 2
print(third.property) // 2
print(fourth.property) // 2
mutating ํค์๋
๊ธฐ๋ณธ์ ์ผ๋ก, ๊ฐ ํ์ ์ ํ๋กํผํฐ๋ ๋ด๋ถ์์ ์ธ์คํด์ค ๋ฉ์๋๋ฅผ ํตํด ๋ด๋ถ์ ๊ฐ์ ์์ ํ ์ ์๋ค.
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX // error
y += deltaY // error
}
}
ํ์ง๋ง ํน์ ๋ฉ์๋ ๋ด์์ ๊ฐ ํ์ ์ธ ๊ตฌ์กฐ์ฒด(struct) ํน์ ์ด๊ฑฐํ(enum)์ ์์ฑ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ํ์ํ ๊ฒฝ์ฐ,
func ์์ mutating ํค์๋๋ฅผ ์ฌ์ฉํด์ ํด๋น ๋ฉ์๋๊ฐ mutating ๋ฉ์๋๋ผ๋ ๊ฒ์ ๋ช ์ํ์ฌ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
๋ํ, mutating ๋ฉ์๋์์๋ ์์์ self ํ๋กํผํฐ์ ์์ ํ ์๋ก์ด ์ธ์คํด์ค๋ฅผ ํ ๋นํ ์ ์๋ค.
(mutating ๋ฉ์๋๊ฐ ์ข ๋ฃ๋ ๋ ๋ค์ ๊ธฐ์กด์ ๊ฐ์ผ๋ก ๋ณ๊ฒฝ๋จ)
๋ด๋ถ์์ ๊ฐ ๋ณ๊ฒฝํ๊ธฐ
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
x += deltaX
y += deltaY
}
}
var somePoint = Point(x: 1.0, y: 1.0)
somePoint.moveBy(x: 2.0, y: 3.0) // x: 3.0, y: 4.0 ์ผ๋ก ๋ณ๊ฒฝ๋จ
mutating ํค์๋๋ฅผ ๋ถ์ฌ ์ธ์คํด์ค ๋ฉ์๋์์ ๊ตฌ์กฐ์ฒด ๋ด๋ถ์ ๊ฐ(x, y)์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
โ ๏ธ ์ฃผ์ํ ์ : mutating ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ๋น์ฐํ ์์(let) ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์์
์๋ก์ด ์ธ์คํด์ค ํ ๋น
struct Point {
var x = 0.0, y = 0.0
mutating func moveBy(x deltaX: Double, y deltaY: Double) {
self = Point(x: x + deltaX, y: y + deltaY)
}
}
์ธ์คํด์ค ๋ฉ์๋์์ self๋ฅผ ํตํด ๋ด๋ถ์์ ์๋ก์ด ์ธ์คํด์ค ํ ๋น
mutating moveBy(x:y:) ๋ฉ์๋๋ x, y ๊ฐ์ด ํ๊ฒ ์์น๋ก ์ค์ ๋ ์ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ง๋ฆ
'๐ ๊ธฐ๋ก > TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] 20231129 (1) | 2023.11.29 |
---|---|
[TIL] 20231128 (3) | 2023.11.29 |
[TIL] 20231124 (1) | 2023.11.25 |
[TIL] 20231122 (0) | 2023.11.22 |
[TIL] 20231121 (0) | 2023.11.21 |