iOS

[ iOS ] ์ž๋™ ์ฐธ์กฐ ์นด์šดํŒ…, ARC (Automatic Reference Counting)

Forest Yun 2024. 3. 27. 16:04
728x90

 

์ž๋™ ์ฐธ์กฐ ์นด์šดํŒ… Automatic Reference Counting

Swift๋Š” ์•ฑ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ถ”์ ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ž๋™ ์ฐธ์กฐ ์นด์šดํŒ…(ARC)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ARC์— ์˜ํ•ด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š๋Š” ์ธ์Šคํ„ด์Šค๋Š” ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ• ๋‹น ํ•ด์ œ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•˜์ง€๋งŒ ํด๋ž˜์Šค ๋“ฑ๊ณผ ๊ฐ™์ด ์ฐธ์กฐํƒ€์ž…์˜ ๊ฒฝ์šฐ ์ฐธ์กฐ ๊ด€๊ณ„์— ์˜ํ•ด ์ž๋™ ๋ฉ”๋ชจ๋ฆฌ๊ด€๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋‚ญ๋น„๋˜๋Š”๋ฐ, ์ด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(memory leak)๋ผ๊ณ  ํ•œ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด, ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์—†๋Š” ์ง์ด ๋ฐฉ ํ•œ ์ผ ์— ๊ณ„์† ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

ARC ์˜ ์ž‘๋™์›๋ฆฌ 

ํด๋ž˜์Šค์˜ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ, ARC๋Š” ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์ฒญํฌ์— ํ• ๋‹นํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ธ์Šคํ„ด์Šค๊ฐ€ ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋ฉด ์‚ฌ์šฉ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ํ•ด์ œํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์ธ์Šคํ„ด์Šค๋ฅผ ํ• ๋‹นํ–ˆ๋˜ ๋ณ€์ˆ˜์— nil์„ ํ• ๋‹นํ•˜๋ฉด, ๋ณ€์ˆ˜๋Š” ๋”์ด์ƒ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ• ๋‹น ํ•ด์ œ๋œ๋‹ค. 

var person: Person? = Person()
person = nil // ์œ„์—์„œ ์ƒ์„ฑํ•œ Person ์ธ์Šคํ„ด์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ•ด์ œ ๋œ๋‹ค.

 

 

์œ„์˜ ์˜ˆ์‹œ๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ๋ณด๊ฒŒ ๋˜๋ฉด, Person ์ธ์Šคํ„ด์Šค๋Š” ๋ณ€์ˆ˜ person์˜ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด์„œ ์œ ์ง€๋˜๊ณ  ์žˆ๋˜ ๊ฒƒ์ด๋‹ค. ์ด ์ฐธ์กฐ๋Š” ์ธ์Šคํ„ด์Šค ์œ ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ•ํ•œ ์ฐธ์กฐ(strong reference)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ฆ‰, ๊ฐ•ํ•œ ์ฐธ์กฐ๊ฐ€ ๋‚จ์•„์žˆ๋Š” ํ•œ ํ• ๋‹น ํ•ด์ œ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

(์ฐธ์กฐ = ๊ฐ•ํ•œ ์ฐธ์กฐ)

 

 

ARC ์˜ ๋™์ž‘

๋งŒ์•ฝ ์œ„ Person ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜, ์ƒ์ˆ˜๊ฐ€ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ person ๋ณ€์ˆ˜๊ฐ€ ๋”์ด์ƒ Person ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์ง€ ์•Š๋”๋ผ๋„ ๋‹ค๋ฅธ ์ฐธ์กฐ๋“ค์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์œ ์ง€๋˜๊ฒŒ ๋œ๋‹ค.

 

์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด, ๋ณ€์ˆ˜ jack์ด ๋” ์ด์ƒ Person ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ ์ƒ์ˆ˜ charles๊ฐ€ ๋ณ€์ˆ˜ jack๊ณผ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์œ ์ง€๋œ๋‹ค. ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€, ๋ณ€์ˆ˜ rene๋Š” ๋‹ค๋ฅธ Person ์ธ์Šคํ„ด์Šค๋ฅผ ํ™€๋กœ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€์ˆ˜ rene์— nil์„ ํ• ๋‹นํ•˜๋ฉด ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

var jack: Person? = Person()
var charles: Person? = jack

var rene: Person? = Person()

jack = nil // Person ์ธ์Šคํ„ด์Šค ๋ฉ”๋ชจ๋ฆฌ ์œ ์ง€
rene = nil // Person ์ธ์Šคํ„ด์Šค ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํ•ด์ œ

 

 

 

์œ„ ์ฝ”๋“œ๋ฅผ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์„ฑ์ด ๋œ๋‹ค. 

 

 

Person ํด๋ž˜์Šค์˜ name ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ณ€์ˆ˜ jack๊ณผ charles๊ฐ€ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

 

์ถœ๋ ฅ๋ฌธ๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค. jack์— ํ• ๋‹นํ–ˆ๋˜ Person ์ธ์Šคํ„ด์Šค๋Š” charles๋„ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š์•„์•ผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ• ๋‹น์ด ํ•ด์ œ๋œ๋‹ค.

 

 

์ด์ฒ˜๋Ÿผ ARC๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜, ์ƒ์ˆ˜, ํ”„๋กœํผํ‹ฐ์˜ ์ˆ˜๋ฅผ ์„ธ์–ด ๊ฐ์ฒด์˜ ๋ผ์ดํ”„ํƒ€์ž„๊ณผ ๊ด€๊ณ„๋ฅผ ๋ชจ๋ธ๋งํ•œ๋‹ค. 

 

 

 

์ž๋™ ์ฐธ์กฐ ์นด์šดํŒ…

 

728x90