๐ ์ฝ์ฝ์์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ชจ๋ธ
Stack์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ์๋์ผ๋ก ์ ๊ฑฐ๋๊ธฐ ๋๋ฌธ์ ํน๋ณํ ๊ด๋ฆฌ๊ฐ ํ์์๋ค. ํ์ง๋ง Heap์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ํ์ํ์ง ์์ ์์ ์ ์ง์ ์ ๊ฑฐํด์ผ ํ๋ค. ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ชจ๋ธ์ ํ์ ์ ์ฅ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ค. ๋ค์ ๋งํ๋ฉด ํด๋์ค ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ค. ๋ฐ๋ผ์ ์ด๋ฒ ํฌ์คํธ์์ ์ธ๊ธํ๋ ์ธ์คํด์ค๋ ๋ชจ๋ ํด๋์ค ์ธ์คํด์ค ์ด๋ค.
Objective-C๋ MRC, ARC, Swift๋ Objective-C์ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ชจ๋ธ์ธ ARC๋ฅผ ์ฌ์ฉํ๋ค. ๊ด๋ฆฌ๋ชจ๋ธ์ด ์ธ์ด์ ์ํ๋ ๊ฑด ์๋๊ณ ์ ํ์ด ์ ๊ณตํ๋ ๊ฐ๋ฐ ํ๊ฒฝ์ธ ์ฝ์ฝ์์ ์ํด์๋ค๊ณ ๋ณด๋ ๊ฒ์ด ์ ํํ๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ชจ๋ธ์ ์ดํดํ๊ธฐ ์ํด์๋ ์์ ์ ์ฑ (Ownership Policy) ์ ์ฐธ์กฐ ์นด์ดํธ(Reference Count) ๋ฅผ ๋จผ์ ์ดํดํด์ผ ํ๋ค. ์ธ์คํด์ค๋ ํ๋ ์ด์์ ์์ ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ง๋๋ค. ๋ฐ๋๋ก ์์ ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ ๊ฑฐ ์์ ์ ํ์ ํ๊ธฐ ์ํด ์์ ์ ์๋ฅผ ํ์ ํ๋๋ฐ ์ด๊ฒ์ ์ฐธ์กฐ์นด์ดํธ๋ผ๊ณ ํ๋ค. ์ฆ, ์ฐธ์กฐ์นด์ดํธ๊ฐ 1์ด์์ด๋ฉด ์ธ์คํด์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ์ ์ง๋๊ณ 0์ด๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐ๋๋ค. ์์ ์๊ฐ retain ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์์ ๊ถ์ ์ป์ผ๋ฉด ์ฐธ์กฐ์นด์ดํธ๊ฐ +1์ด ๋๊ณ , release ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์์ ๊ถ์ ํฌ๊ธฐํ๋ฉด ์ฐธ์กฐ์นด์ดํธ๊ฐ -1์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐธ์กฐ์นด์ดํธ๊ฐ 0์ด๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์ฆ์ ์ ๊ฑฐ๋๋ค.
๐ฟ MRC(Manual Reference Counting)
MRC ๋ชจ๋ธ์์๋ ์์ ์ ์ฑ ๊ณผ ๊ด๋ จ๋ ๋ชจ๋ธ์ ์ง์ ์ฝ๋๋ก ๊ตฌํํ๋ค. ํ์ง๋ง ์์ ์ ์ฑ ์ ๊ตฌํํ๋ ๊ฒ์ ๋งค์ฐ ๋งค์ฐ!! ์ด๋ ต๋ค. ARC์ ๋นํด ๋ง์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๊ณ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฅ๊ฐ ๋ ํ๋ฅ ๋ ๋๋ค. ๊ทธ๋์ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ด ๋ฎ์์ง๊ณ ๋๋ฒ๊น ์ด ์ด๋ ค์์ง๋ค. ์ด๋ฐ ๋ฌธ์ ๋ก ARC๊ฐ ๋์ ๋์๋ค. ARC(Automatic Reference Counting) ์ด๋ฆ์์ ์ฒ๋ผ ์๋์ผ๋ก ์์ ์ ์ฑ ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ค.
๐ฟ ARC(Automatic Reference Counting)
์์ ์ ์ฑ ๊ณผ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ MRC์ ๋์ผํ๋ค. ํ์ง๋ง ์ปดํ์ผ๋ฌ๊ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ง์ ์์ฑํ ํ์๊ฐ ์๋ค. ๋ฐ๋ผ์ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ๋ ๋์์ง๊ฒ ๋๋ค. Objective-C๋ MRC, ARC ๋ ๋ค ์ง์ํ์ง๋ง ํน๋ณํ ์ด์ ๊ฐ ์๋ค๋ฉด ARC๋ฅผ ์ฌ์ฉํ๋ค.
์ฐ์ ๊ฐํ ์ฐธ์กฐ์ ๋ํด ์์๋ณด์.
๊ธฐ๋ณธ์ ์ผ๋ก ์ธ์คํด์ค์ ์์ ์๋ ๊ฐํ ์ฐธ์กฐ๋ก ์ฐ๊ฒฐ๋๋ค. ๋ค์ ์ ๋ฆฌํ์๋ฉด ๋์์ ์์ ํ ๋๋ง๋ค ์ฐธ์กฐ ์นด์ดํธ๊ฐ 1์ฉ ์ฆ๊ฐํ๊ณ ์์ ๋ฅผ ํฌ๊ธฐํ ๋๋ง๋ค ์ฐธ์กฐ ์นด์ดํธ๊ฐ 1์ฉ ๊ฐ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ 0์ด ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ์ธ์คํด์ค๋ ์ ๊ฑฐ๋๋ค.
class Person {
var name = "Ahyeon"
deinit {
print("person deinit")
}
๋ค์ ์ฝ๋๋ ์๋ฉธ์๊ฐ ๊ตฌํ๋์ด ์๋ค. ์๋ฉธ์๋ ์ธ์คํด์ค๊ฐ ํด์ ๋๊ธฐ ์ ์ ํธ์ถ๋๋ค.
var person1: Person?
var person2: Person?
var person3: Person?
person1 = Person()
person2 = person1
person3 = person1
person1, person2, person3๊ฐ Person Instance์ ๊ฐํ ์ฐธ์กฐ๋ก ์ฐ๊ฒฐ๋๋ค.
์์์ ์ธ์คํด์ค๋ฅผ ์์ ํ ๋ retain ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค๊ณ ํ๋๋ฐ ์ฝ๋์ ์๋ค. Swift์์๋ ARC๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ๋ฌ๊ฐ ์ฝ๋๋ฅผ ๋ถ์ํ ํ ์๋์ผ๋ก ์ถ๊ฐํด์ค๋ค.
person1 = nil
person2 = nil
์ด๋ฒ์๋ person1, person2 ๋ณ์์ nil์ ์ ์ฅํ๋ค. nil์ ์ ์ฅํ๋ค๋ ๊ฒ์ ์์ ๊ถ์ ํฌ๊ธฐํ๋ ๊ฒ๊ณผ ๊ฐ๊ณ ์์ ๊ถ์ ํฌ๊ธฐํ๋ฉด ์ฆ์ ๊ฐํ ์ฐธ์กฐ๊ฐ ์ ๊ฑฐ๋๊ณ ์ฐธ์กฐ์นด์ดํธ๊ฐ 1์ฉ ๊ฐ์ํ๋ค.
person3 = nil
์ด์ ๋ง์ง๋ง์ผ๋ก person3 ๋ณ์์ nil์ ์ ์ฅํด๋ณด์. ๊ทธ๋ฌ๋ฉด ๋ง์ง๋ง ์์ ๊ถ์์๋ person3์ด ์์ ๊ถ์ ํฌ๊ธฐํ๋ฉฐ ์ฐธ์กฐ์นด์ดํธ๊ฐ 0์ด ๋๊ณ ์ด ์์ ์ ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ฉธ๋๋ค. ๋ฐ๋ผ์ deinit()์ด ํธ์ถ๋๊ณ person deinit ๋ก๊ทธ๊ฐ ์ถ๋ ฅ๋๋ค.
'Swift' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Swift | Array capacity, reserveCapacity (3) | 2021.10.20 |
---|---|
Swift | ๊ฐํ ์ฐธ์กฐ์ ์ฝํ ์ฐธ์กฐ! ์ํ ์ฐธ์กฐ ์ฌ์ดํด ํด๊ฒฐ๋ฐฉ๋ฒ (0) | 2021.09.01 |
Swift | ๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ์ฐจ์ด (0) | 2021.08.31 |
Swift | ํด๋ก์ (0) | 2021.08.22 |