Swift ๊ณต๋ถ๋ฅผ ํ๋ค๋ณด๋ฉด ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ผ๋ก ์์์ผ ํ ๊ฒ๋ค ์ค ํ๋์ธ Class(ํด๋์ค)์ Struct(๊ตฌ์กฐ์ฒด)์ ๋ํด ์์๋ณด๋ ค๊ณ ํ๋ค.
ํด๋์ค์ ๊ตฌ์กฐ์ฒด๋ Swift ๋ฟ๋ง ์๋๋ผ ๊ฐ์ฒด์งํฅ ์ธ์ด์์ ์์ฃผ ๋ณผ ์ ์๋ค.
๊ทธ๋งํผ ์ค์ํ๊ธฐ ๋๋ฌธ์ ์ค๋ ์ด ๊ฐ๋ ๋ค์ ๋ํด ์ฝ๋์ ๊ฐ์ด ์์ธํ๊ฒ ์ ๋ฆฌํด๋ณผ๊ฒ์ด๋ค.
ํด๋์ค์ ๊ตฌ์กฐ์ฒด์ ์ฐจ์ด์
ํด๋์ค๋ ์ฐธ์กฐ ํ์ , ๊ตฌ์กฐ์ฒด๋ ๊ฐ ํ์ ์ด๋ค.
์ฐธ์กฐ ํ์ : reference type
๊ฐ ํ์ : value type
์ฒ์์๋ ๋๋์ฒด ์ฐธ์กฐ๊ฐ ๋ญ๊ณ ๊ฐ์ด ๋ญ์ผ? ๋ญ๊ฐ ๋ฌ๋ผ?๐ค ๋ผ๋ ์๋ฌธ์ด ๋ค ์ ์๋ค.
๋น์ฐํ ๋๋ ๊ทธ๋ฌ๋ค.
C์ธ์ด์์์ ํฌ์ธํฐ๋ฅผ ์๋ฉด ์กฐ๊ธ ์ดํด๊ฐ ์ฝ๋ค. ์ผ๋จ ์ฐธ์กฐ ํ์ ๊ณผ ๊ฐ ํ์ ์ ๋ํด์๋ ๋ฐ์์ ๋ค์ ์ค๋ช ํ๊ฒ ๋ค.
ํด๋์ค (Class)
- ์ฐธ์กฐ ํ์ (reference type)์ด๋ค.
- ARC๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ๊ฐ์ ํด๋์ค ์ธ์คํด์ค๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๋ณ์์ ํ ๋นํ ๋ค ๊ฐ์ ๋ณ๊ฒฝ์ํค๋ฉด ํ ๋นํ ๋ชจ๋ ๋ณ์์ ์ํฅ์ ์ค๋ค.
- ์์์ด ๊ฐ๋ฅํ๋ค.
- ํ์ ์บ์คํ ์ ํตํด ๋ฐํ์์์ ํด๋์ค ์ธ์คํด์ค์ ํ์ ์ ํ์ธํ ์ ์๋ค.
Class ์ฝ๋๋ฅผ ๋ณด์.
class MyClass {
var cnt : Int = 10
deinit {
print("CLEAR")
}
}
var cnt1 = MyClass()
var cnt2 = cnt1
var cnt3 = cnt1
cnt3.count = 999
print(cnt1.count) //999
print(cnt3.count) //999
//cnt3์ ๋ณ๊ฒฝํ์ง๋ง ์ฐธ์กฐ ํ์
์ด๋ฏ๋ก cnt1๋ ๋ณ๊ฒฝ์ด ๋๋ค.
cnt1.count๊ฐ 10์ด ๋์ฌ ๊ฒ ๊ฐ์ง๋ง, ์ค์ ๋ก ์ถ๋ ฅํด๋ณด๋ฉด 999๊ฐ ๋์จ๋ค.
ํด๋์ค๋ ์ฐธ์กฐ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๋ณ์์ ์ํฅ์ ์ฃผ๊ธฐ ๋๋ฌธ์ cnt3์ ๊ฐ์ 999๋ก ๋ฐ๊พธ๋ฉด cnt1์๋ ์ํฅ์ ์ค๋ค.
Heap ์์ญ
Heap ์์ญ์๋ ์ปดํ์ผ ๋จ๊ณ์์ ์์ฑ๊ณผ ํด์ ๋ฅผ ์ ์ ์๋ ์ฐธ์กฐ ํ์ ์ ๊ฐ์ฒด๊ฐ ํ ๋น๋๋ค.
- ํด๋์ค(ํ)๋ ๋ฐ์ดํฐ ์์ญ์ ์ ์ฅ๋๋ค.
- ํด๋์ค์ ๊ฐ์ฒด๋ ํ ์์ญ์ ์ ์ฅ๋๋ค.
- ์คํ์๋ ํ ์์ญ์ ์ ์ฅ๋ ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ์ ์ฅํ๊ฒ ๋๋ค.
๋ฐ์ดํฐ | ํ | ์คํ |
class ์ ์ฅ | class ๊ฐ์ฒด ์ ์ฅ | class ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ์ ์ฅ |
๊ตฌ์กฐ์ฒด (Struct)
- ๊ฐ ํ์ (value type)์ด๋ค.
- ๊ตฌ์กฐ์ฒด ๋ณ์๋ฅผ ์๋ก์ด ๋ณ์์ ํ ๋นํ ๋๋ง๋ค ์๋ก์ด ๊ตฌ์กฐ์ฒด๊ฐ ํ ๋น๋๋ค. ์ฆ, ๊ฐ์ ๊ตฌ์กฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๋ณ์์ ํ ๋นํ ๋ค ๊ฐ์ ๋ณ๊ฒฝ์์ผ๋ ๋ค๋ฅธ ๋ณ์์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
๊ตฌ์กฐ์ฒด ์ฝ๋๋ฅผ ๋ณด์.
struct MyStruct {
var cnt : Int = 10
}
var cnt1 = MyStruct()
var cnt2 = cnt1
var cnt3 = cnt1
cnt2.count = 20
cnt3.count = 30
print(cnt1.count) //10
print(cnt2.count) //20
print(cnt3.count) //30
๊ตฌ์กฐ์ฒด๋ ๊ฐ ํ์ ์ด๋ฏ๋ก ํญ์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋์ด ๊ฐ์ ๋ณ๊ฒฝํด๋ ๋ค๋ฅธ ๋ณ์์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
Stack ์์ญ
๊ตฌ์กฐ์ฒด๋ ์ธ์ ์๊ธธ์ง, ์ธ์ ์ฌ๋ผ์ง์ง ์ปดํ์ผ ๋จ๊ณ์์ ์ ์ ์๊ธฐ ๋๋ฌธ์ stack ์์ญ์ ์ ์ฅ์ด ๋๋ค.
- ๊ตฌ์กฐ์ฒด(ํ)๋ ๋ฐ์ดํฐ ์์ญ์ ์ ์ฅ๋๋ค.
- ํจ์ ์คํ ์ ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ๋ ๋ง๋ค ์คํ ์์ญ์ ๊ตฌ์กฐ์ฒด์ ์ธ์คํด์ค๋ฅผ ์ ์ฅํ๋ค.
- Stack์ LIFO๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ์๋ฃ๊ตฌ์กฐ ํน์ฑ ์ ๋ช ๋ น์ด ํ๋๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น, ํด์ ํ ์ ์๋ค. ๊ทธ๋์ ์ปดํ์ผ ๋จ๊ณ์์ ์ธ์ ์์ฑ๋๊ณ ํด์ ๋๋์ง ์ ์ ์๋ ๊ตฌ์กฐ์ฒด์ ๊ฐ์ ๊ฐ๋ค์ด ์คํ์ ์ ์ฅ๋๋ค.
Class(ํด๋์ค)์ Struct(๊ตฌ์กฐ์ฒด) ์ let๊ณผ var
๋ณดํต ์ฐ๋ฆฌ๊ฐ ์๋ let์ ์์์ด๊ณ , ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค. var์ ๋ณ์์ด๊ณ , ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค.
ํ์ง๋ง, class์ struct์์์ let์ ๋ค๋ฅด๋ค.
ํด๋์ค๋ let ์ผ๋ก ์ ์ธํด๋ ๊ทธ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ ์ฃผ์๊ฐ์ด๊ธฐ ๋๋ฌธ์ ํด๋์ค ๋ด๋ถ์ ๋ณ์๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค.
๊ตฌ์กฐ์ฒด๋ let ์ผ๋ก ์ ์ธํ๋ฉด ๊ทธ ์์ฒด๊ฐ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๊ตฌ์กฐ์ฒด ๋ด๋ถ์ ๋ณ์๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค.
์ฐธ์กฐ ํ์ - Reference Type
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์น๋ฅผ ์ ๋ฌ (์ฃผ์๊ฐ)
๊ฐ ํ์ - Value Type
๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ ๋ ๊ฐ์ ๋ณต์ฌํ์ฌ ์ ๋ฌ
๊ทธ๋ผ Class(ํด๋์ค)์ Struct(๊ตฌ์กฐ์ฒด) ์ค ์ด๋ค ๊ฒ์ ์ฌ์ฉํด์ผ ํ ๊น?
๋จ์ํ ๋ฐ์ดํฐ ๊ฐ์ ๋ณด์ ํ ๋๋ ๊ตฌ์กฐ์ฒด๊ฐ ๋ซ๋ค.
๋ง์ฝ ๋ฐ์ดํฐ์์ ์์์ ๊ตฌ์กฐ๊ฐ ํ์ํ๋ฉด ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ค.
'๐ฑ Mobile > iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS - Swift] Final ํค์๋ (0) | 2023.11.16 |
---|---|
[iOS - Swift] ์ ๊ทผ ์ ์ด์(open, public, internal, fileprivate, private), setter (0) | 2023.10.16 |
[iOS - Swift] Auto Layout Constraint์ Priority์ ๋ํด์ (15) | 2023.08.29 |
[iOS - Swift] Any, AnyObject์ ์ฐจ์ด์ ์? (0) | 2023.08.26 |
[iOS - Swift] Singleton Pattern ์ฑ๊ธํค ํจํด์ด๋? (0) | 2023.08.24 |