๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

swift ๋ฌธ๋ฒ•๐Ÿ–ค

[SWIFT] ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

์ฐธ์กฐํ˜•์‹์€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๊ตฌ๋ถ„ ๊ฐ’ ํ˜•์‹ ์ฐธ์กฐ ํ˜•์‹
ํƒ€์ž…  Value Type  Reference Type
๋ฉ”๋ชจ๋ฆฌ ์ƒ์˜ ์ €์žฅ ์œ„์น˜ Stack
(ํ•„์š”์‹œ์— ํ•ญ์ƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ’์ด ๋ณต์‚ฌ๋˜์–ด ์ „๋‹ฌ ๊ฐ’์— ์ €์žฅ)
Heap
(ํ•„์š”์‹œ์— ํ•ญ์ƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ๋ฅผ ์ „๋‹ฌ ๊ฐ’์˜ ์ €์žฅ)
(์ฃผ์†Œ๋Š” Stack์— ์ €์žฅ)
๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๋ฐฉ์‹  ์Šคํƒ์˜ ์Šค์ฝ”ํ”„๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ž๋™ ์ œ๊ฑฐ RC(Refence Counting, ์ฐธ์กฐ ์ˆซ์ž)์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌ
๊ฐ ํ˜•์‹์˜ ํƒ€์ž… ์˜ˆ์‹œ  ์Šค์œ„ํ”„ํŠธ ๊ธฐ๋ณธ ํƒ€์ž… ํด๋ž˜์Šค, ํด๋กœ์ €

 

๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ?

์ฝ”๋“œ (ํ”„๋กœ๊ทธ๋žจ)  ๋ฐ์ดํ„ฐ  ํž™ โญ๏ธ ์Šคํƒ
๋ช…๋ น์–ด / ํ”„๋กœ๊ทธ๋žจ ์ „์—ญ๋ณ€์ˆ˜ /
ํƒ€์ž…(static/class) ๋ณ€์ˆ˜
๋™์ ํ• ๋‹น 
(์ผ๋ฐ˜์ ์œผ๋กœ ์˜ค๋žซ๋™์•ˆ ๊ธด์‹œ๊ฐ„ ๋™์•ˆ ์ €์žฅ) 
(๋น„์–ด์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐพ์•„์„œ ํ• ๋‹นํ•˜๋Š” ํ–‰์œ„) 
ํ•จ์ˆ˜์‹คํ–‰์„ ์œ„ํ•œ ์ž„์‹œ์  ๊ณต๊ฐ„
์•ฑ(ํ”„๋กœ๊ทธ๋žจ)์˜ ๋ชจ๋“  ์ฝ”๋“œ(text) ๊ณตํ†ต์œผ๋กœ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ํฌ๊ณ , ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ , ๋น ๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ
  ์•ฑ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ๋ถˆ๋ณ€ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž˜ ๊ด€๋ฆฌํ•ด์•ผํ•จ ์•Œ์•„์„œ ์ž๋™ ๊ด€๋ฆฌ๋จ

 

๋™์ ํ• ๋‹น์ด๋ž€?

๋น„์–ด์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐพ์•„์„œ ํ• ๋‹นํ•˜๋Š” ํ–‰์œ„

๋น„์–ด์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ ํž™ ์˜์—ญ์„ ๋ชจ๋‘ ์Šค์บ”ํ•˜๊ธฐ ๋–„๋ฌธ์— ๋А๋ฆด ์ˆ˜ ๋ฐ–์— ์—†์Œ

 

- Heap ์˜์—ญ์— ํ• ๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ๋Š” ๊ด€๋ฆฌํ•ด์•ผ ํ•˜์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๊ฐ€ ๋œ๋‹ค.

- ํ• ๋‹น์ด ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ˆ„์ˆ˜(Mamory Leak) ํ˜„์ƒ์ด ๋ฐœ์ƒ

 

์Šค์œ„ํ”„ํŠธ์—์„œ๋Š” reference Counting(์ฐธ์กฐ ์ˆซ์ž)๋ฅผ ์„ธ๋Š” ๊ฒƒ์„ ํ†ตํ•ด , ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ / ์ปดํŒŒ์ผ์‹œ์— ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ์‹œ์ ์„ ๊ฒฐ์ •

 

๋ฉ”๋ชจ๋ฆฌ๋Š” RC(reference counting)์— ์˜ํ•ด ๊ด€๋ฆฌ๋œ๋‹ค.

Objective-C Swift
MRC (manual ์ˆ˜๋™ RC) ARC(Automatic RC)
ARC   

 

ARC

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋„ฃ์ง€ ์•Š๊ณ , ์ปดํŒŒ์ผ๋Ÿฌ(Xcode)๊ฐ€ ์•Œ์•„์„œ ๋„ฃ์–ด์คŒ (๋ฉ”๋ชจ๋ฆฌ ์•ˆ์ •์„ฑ ์ฆ๊ฐ€) 
  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ ๋–„๋ฌธ์—, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž˜๋ชป ์ž…๋ ฅํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ RC๋ฐฉ์‹์„ ์ž˜๋ชป ์ธ์‹ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ (๊ฐœ๋ฐœ์ž๊ฐ€ RC๋ฅผ ์ž˜ ์•Œ๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ )

 

MRC

  • ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ˆ˜๋™ ๊ด€๋ฆฌ 
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ ์ฝ”๋“œ๊นŒ์ง€ ์‚ฝ์ž…ํ•ด์•ผํ•จ ( ์‹ค์ˆ˜ํ•  ๊ฐ€๋Šฅ์„ฑ ๋†’์Œ )

 

 

RC๋Š” ๋ง ๊ทธ๋Œ€๋กœ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ๋“ค์ด ๋ช‡ ๊ฐœ๊ฐ€ ์žˆ๋ƒ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜์ด๋‹ค. 

๋”ฐ๋ผ์„œ RC == 0 ์ด ๋˜์—ˆ์„ ๋•Œ๋Š” ์ฐธ์กฐํ•˜์ง€ ์•Š๋Š” ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ•ด์ œ๊ฐ€ ๋œ๋‹ค.

 

๊ฐ•ํ•œ ์ฐธ์กฐ ์‚ฌ์ดํด (Strong Reference Cycle)

  • ๊ฐ์ฒด๊ฐ€ ์„œ๋กœ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๊ฐ•ํ•œ ์ฐธ์กฐ ์‚ฌ์ดํด
  • ๊ฐ์ฒด๋“ค์ด ์„œ๋กœ๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ๋‹ค๋ฉด ํ•ญ์ƒ 1์ด์ƒ์ด ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€
  • ์•„๋ฌด๋ฆฌ ๊ฐœ๋ฐœ์ž๊ฐ€ nil๊ฐ’์„ ์ค˜์„œ ๋งค๋ชจ๋ฆฌํ•ด์ œ๋ฅผ ์‹œํ‚ค๊ณ ์ž ํ•˜์—ฌ๋„ ํ•ด์ œ ์•ˆ๋จ ( ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜: memory leak ) 

 

๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋Š” RC๋ฅผ ๊ณ ๋ คํ•˜์—ฌ, ์ฐธ์กฐ ํ•ด์ œ ์ˆœ์„œ๋ฅผ ์ฃผ์˜ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผํ•จ

 

 

๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜(Memory Leak)์˜ ํ•ด๊ฒฐ๋ฐฉ์•ˆ

  Weak Reference (์•ฝํ•œ ์ฐธ์กฐ) Unowned Reference (๋น„์†Œ์œ  ์ฐธ์กฐ)
๋ฐฉ์‹ weak ํ‚ค์›Œ๋“œ  unowned ํ‚ค์›Œ๋“œ
์˜ˆ์‹œ weak var pet: Dog?
( nil ์ž๋™ ํ• ๋‹น )
unowned var pet: Dog?
(Swift 5์ดํ›„, ์˜ต์…”๋„ ์„ ์–ธ ๊ฐ€๋Šฅ, nil ์ž๋™ํ• ๋‹น x)
์ฐจ์ด์ 
์†Œ์œ ์ž์— ๋น„ํ•ด, ์งง์€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง„ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
(์ธ์Šคํ„ด์Šค๊ฐ€ nil๋กœ ํ™•์ธ ๊ฐ€๋Šฅ,
 nil์ธ ๊ฒฝ์šฐ ์ž‘์—…์„ ์ค‘๋‹จํ•˜๋Š” ๊ฒƒ ๊ฐ€๋Šฅ)
์†Œ์œ ์ž์— ๋น„ํ•ด, ๊ธธ๊ฑฐ๋‚˜ ๊ฐ™์€ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ฐ€์ง„ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ
(์ธ์Šคํ„ด์Šค๊ฐ€ nil๋กœ ํ™•์ธ ๋ถˆ๊ฐ€๋Šฅ, 
 ์‹ค์ œ ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋˜์—ˆ๋‹ค๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ)
์ฐธ์กฐ ์ธ์Šคํ„ด์Šค์˜ ์†Œ๋ฉธ nil๋กœ  ์ดˆ๊ธฐํ™” nil๋กœ ์ดˆ๊ธฐํ™” x
๊ณตํ†ต์  ๊ฐ€๋ฅดํ‚ค๋Š” ์ธ์Šคํ„ด์Šค์˜ RC์˜ ์ˆซ์ž๋ฅผ ์˜ฌ๋ผ๊ฐ€์ง€ ์•Š๊ฒŒ ํ•จ(์ธ์Šคํ„ด์Šค ์‚ฌ์ด์˜ ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐ)
weak/unowned๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค์— ์ ‘๊ทผ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ธ์Šคํ„ด์Šค๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅ 

โŒ–unowned ์‚ฌ์šฉ์‹œ ํ•œ๋ฒˆ ๋” ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ฒƒ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ๋กœ๋Š” weakํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•ฝํ•œ ์ฐธ์กฐ๋ฅผ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ

 

๋น„์†Œ์œ  ์ฐธ์กฐ

  • ์ฐธ์กฐ ์ธ์Šคํ„ด์Šค๊ฐ€ ์‚ฌ๋ผ์กŒ์„๋•Œ, nil๋กœ ์ดˆ๊ธฐํ™”๊ฐ€ ๋˜์ง€ ์•Š์•„์„œ weak๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ
  • nil๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด nil์„ ํ• ๋‹นํ•ด์ฃผ๋Š” ์ž‘์—…์ด ํ•„์š”ํ•จ
  • unowned๊ฐ€ weak๋ณด๋‹ค ์ฒ˜๋ฆฌ ์†๋„๊ฐ€ ๋น ๋ฆ„
  • ์‹ค์ œ ์—…๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„  unowned๋ฅผ ์ž˜ ํŒŒ์•…ํ•˜๋Š”๊ฒŒ ์ค‘์š”
๋ณ€์ˆ˜ / ํƒ€์ž… let var Optional Non-Optional
strong
(๊ธฐ๋ณธ ์„ ์–ธ ํ‚ค์›Œ๋“œ)
o o o o
weak ํ‚ค์›Œ๋“œ x
(๊ฐ€๋ณ€ํ•ด์•ผํ•จ)
o o x
(nil์„ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ)
unowned ํ‚ค์›Œ๋“œ o o o
(Swift 5 ~ )
0

* weak ์‚ฌ์šฉ์‹œ๋งŒ ์ฃผ์˜ํ•˜๋ฉด ๋จ (๋‚˜๋จธ์ง„ ๋‹ค ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ)

 

 

โญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธ ( ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ€๋Š” ๋ถ€๋ถ„ ๋‹ค์‹œ ๊ณต๋ถ€ํ•ด์•ผํ• ๋“ฏ )

ํด๋กœ์ €์—์„œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

์บก์ณํ˜„์ƒ

  • ํด๋กœ์ €๋Š” (ํด๋กœ์ €์˜ ์ฃผ๊ธฐ๋™์•ˆ ์‚ฌ์šฉ์ด ํ•„์š” ์—†์–ด์งˆ๋•Œ๊นŒ์ง€) ํž™ (Heap) ์˜์—ญ์— ์กด์žฌํ•ด์•ผํ•˜๊ณ , ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ ์™ธ๋ถ€์— ์กด์žฌํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์กฐ๊ฑด ์บก์ณ ํ˜„์ƒ์ด ๋ฐœ์ƒ
  • ํด๋กœ์ €๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•  ์™ธ๋ถ€์˜ ๋ณ€์ˆ˜๋ฅผ ์บก์ณํ•จ
  • ๊ฐ’ํƒ€์ž… (์ฐธ์กฐ๋ฅผ ์บก์ณ) - ์บก์ณ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ, ํด๋กœ์ € ์™ธ๋ถ€์— ์กด์žฌํ•˜๋Š” ๋ฐธ๋ฅ˜ํƒ€์ž…์˜ ์ฐธ์กฐ (๋ณ€์ˆ˜์˜ ์ฃผ์†Œ)๋ฅผ ์บก์ณ(์ €์žฅ)ํ•œ๋‹ค.      (์™ธ๋ถ€์š”์ธ์— ์˜ํ•ด ํ•ด๋‹น ๊ฐ’์ด ๋ณ€ํ–ˆ์„ ๋•Œ์—๋„ ๊ณ„์† ์ฐธ์กฐ)
  • ์ฐธ์กฐํƒ€์ž… (๋ณ€์ˆ˜์ฐธ์กฐ๋ฅผ ์บก์ณ) - ์บก์ณ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ, ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์บก์ณ(์ €์žฅ)ํ•œ๋‹ค.

์บก์ณ๋ฆฌ์ŠคํŠธ

๋ฌธ๋ฒ•
(ํŒŒ๋ผ๋ฏธํ„ฐ ์—†๋Š” ๊ฒฝ์šฐ)

{ [์บก์ณํ•  ๋ณ€์ˆ˜๋ช…: ์บก์ณ๋ฆฌ์ŠคํŠธ] in
  ์ฝ”๋“œ ์ž‘์„ฑ 
}
(ํŒŒ๋ผ๋ฏธํ„ฐ ์žˆ๋Š” ๊ฒฝ์šฐ)
{ [์บก์ณํ•  ๋ณ€์ˆ˜๋ช…: ์บก์ณ๋ฆฌ์ŠคํŠธ] (ํŒŒ๋ผ๋ฏธํ„ฐ) -> ๋ฆฌํ„ดํ˜• in
  ์ฝ”๋“œ ์ž‘์„ฑ 
}
  • ํด๋กœ์ € ์•ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ์บก์ณ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๋ฌธ๋ฒ•
  • ์•ฝํ•œ์ฐธ์กฐ(Weak Reference)์™€ ๋น„์†Œ์œ  ์ฐธ์กฐ(Unowned Reference) ์„ ์–ธ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์žฅ์น˜ (ํด๋กœ์ € ๋‚ด๋ถ€์—์„œ ๊ฐ•ํ•œ ์ฐธ์กฐ ์‚ฌ์ดํด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ)
  • ๊ฐ’ํƒ€์ž… (์ฐธ์กฐ๋ฅผ ์บก์ณ) - ์บก์ณ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ, ๋ณ€์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์บก์ณ(์ €์žฅ)ํ•œ๋‹ค.(์™ธ๋ถ€์ ์ธ ์š”์ธ์— ์˜ํ•œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ ๋ฐฉ์ง€)
  • ์ฐธ์กฐํƒ€์ž… (์ฐธ์กฐ๋ฅผ ์ง์ ‘ ์บก์ณ) - ์บก์ณ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์ง์ ‘์ ์œผ๋กœ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ์บก์ณํ•œ๋‹ค.
  • ์บก์ณ๋ฆฌ์ŠคํŠธ์—์„œ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. (๋‚ด๋ถ€์—์„œ ๋ณ€์ˆ˜๋ช… ๋ฐ”๊ฟ”์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ) 
  ๊ฐ’ํƒ€์ž… (Value Type) ์ฐธ์กฐ ํƒ€์ž… (Value Type) 
์บก์ณ

let closure = {
print ("๋ฐธ๋ฅ˜๊ฐ’ ์ถœ๋ ฅ: \(num)")
}
let refCapture = {
print ("์ฐธ์กฐ๊ฐ’ ์ถœ๋ ฅ: \(x.num)")
}
ํด๋กœ์ € ์™ธ๋ถ€์— ์กด์žฌํ•˜๋Š” ํƒ€์ž…์˜ ์ฐธ์กฐ(๋ณ€์ˆ˜ ์ฃผ์†Œ)๋ฅผ ์บก์ณ 
(์™ธ๋ถ€์š”์ธ์— ์˜ํ•ด ํ•ด๋‹น ๊ฐ’์ด ๋ณ€ํ–ˆ์„ ๋•Œ๋„ ๊ณ„์† ์ฐธ์กฐ)
์บก์ณ๋ฆฌ์ŠคํŠธ
let closure = {[num] in 
print("๋ฐธ๋ฅ˜๊ฐ’ ์ถœ๋ ฅ:\(num)")
}
let refCapture = {[x] in 
print("์ฐธ์กฐ๊ฐ’ ์ถœ๋ ฅ:\(x.num)")
}
ํด๋กœ์ € ์™ธ๋ถ€์— ์กด์žฌํ•˜๋Š” ์ฐธ์กฐ ํƒ€์ž…์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ๋‚ด๋ถ€์— ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉ
(์™ธ๋ถ€์š”์ธ์— ์˜ํ•ด ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์˜ ํ•ด์ œ๋ฅผ ๋ฐฉ์ง€ํ•  ๋•Œ ์‚ฌ์šฉ)
-> ๊ฐ€๋ฅดํ‚ค๋Š” ์ธ์Šคํ„ด์Šค์˜ RC๋ฅผ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ํ•จ์œผ๋กœ์จ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋  ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐฉ์ง€
  weak(์•ฝํ•œ)/unowned(๋น„์†Œ์œ ) ์ฐธ์กฐ ์„ ์–ธ์ด ๊ฐ€๋Šฅ
(๊ฐ•ํ•œ ์ฐธ์กฐ ์‚ฌ์ดํด ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ)

๊ฐ์ฒด ๋‚ด์—์„œ ํด๋กœ์ € ์‚ฌ์šฉ์‹œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ (์ผ๋ฐ˜์ ์œผ๋กœ ํด๋กœ์ €๋Š” ๊ฐ์ฒด ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”โญ๏ธ)

  1. ์—ฌ๋Ÿฌ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ , ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ์™€ ํž™์˜์—ญ์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ณต์œ 
  2. ํด๋กœ์ €๊ฐ€ ์‹คํ–‰์ค‘์ธ ๋™์•ˆ ์˜ค๋žซ๋™์•ˆ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ , ํž™ ์˜์—ญ์— ์ €์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•  ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๋ณด๊ด€ํ•œ๋‹ค. 
  3. ํด๋กœ์ €๋Š” ์ด๋•Œ ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์˜ stack์˜์—ญ์—์„œ ์ž‘๋™ํ•˜๋Š”๋ฐ, ํด๋กœ์ €๊ฐ€ ์‹คํ–‰์ด ์™„๋ฃŒ๋๋‹ค๋ฉด stack์—์„œ ์ œ๊ฑฐ๋œ๋‹ค. 
  4. ์‹คํ–‰ ์Šคํƒ์—์„œ ์ผ์ด ์ข…๋ฃŒ๋˜์–ด์„œ , ์ผ์„ ๋”์ด์ƒ ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์ง€๋ฉด ์‹ค์ œ ํž™์— ์ €์žฅ๋˜์–ด ์žˆ๋˜ ํด๋กœ์ €๋„ ์‚ฌ๋ผ์ง„๋‹ค.

๐Ÿ”  stack์—์„œ ํด๋กœ์ €๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋™์•ˆ heap์˜์—ญ์— ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ์ด์œ ๋Š”?

๊ฐ์ฒด ๋‚ด์— ํด๋กœ์ €๊ฐ€ ๊ตฌํ˜„์ด ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋กœ์ €๊ฐ€ ๋‚ด๋ถ€์—์„œ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํด๋กœ์ €๊ฐ€ ๋™์ž‘์„ ํ•˜๋Š” ์ƒํ™ฉ์—๋Š” RC๊ฐ€ 1์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์‚ฌ๋ผ์ง€์ง€ ์•Š๊ณ  ๋‚จ์•„์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

 

  • ํด๋กœ์ € ๋‚ด์—์„œ ๊ฐ์ฒด(์ฐธ์กฐ ํƒ€์ž…)์˜ ์†์„ฑ ๋ฐ ๋ฉ”์„œ๋“œ ์ ‘๊ทผ์€ ๋ฐ˜๋“œ์‹œ selfํ‚ค์›Œ๋“œ ์‚ฌ์šฉ
    • ํด๋กœ์ € ์™ธ๋ถ€์— ์กด์žฌํ•˜๋Š” ์ฐธ์กฐ ํƒ€์ž…์˜ ์ฃผ์†Œ๋ฅผ ์บก์ณํ•จ  (== ๊ฐ•ํ•œ ์ฐธ์กฐ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Strong Referencw Cycle ๋ฐœ์ƒ ๊ฐ€๋Šฅ)
  • ํด๋กœ์ €๋ฅผ ๊ฐ์ฒด ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๋Œ€๋ถ€๋ถ„ weak๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. (ํด๋กœ์ €์˜ ๊ฐ•ํ•œ ์ฐธ์กฐ ํ•ด๊ฒฐ : ์บก์ณ๋ฆฌ์ŠคํŠธ + ์•ฝํ•œ/๋น„์†Œ์œ  ์ฐธ์กฐ)
    • weakํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ๊ฐ€๋“œ๋ฌธ์„ ํ†ตํ•ด early exit์„ ์‹œ์ผœ์ค€๋‹ค. (๊ฐ์ฒด ์—†์œผ๋ฉด ์ผ ์ข…๋ฃŒ)
  • ํž™ ์˜์—ญ์—์„œ ํด๋กœ์ €๊ฐ€ ๊ฐ์ฒด ๋‚ด๋ถ€์— ์žˆ์–ด๋„ ํด๋กœ์ €์™€ ๊ฐ์ฒด๋Š” ๋…๋ฆฝ์ ์ธ ์š”์†Œ๋ผ๊ณ  ์ทจ๊ธ‰ํ•˜๋ฉฐ, ํด๋กœ์ €๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ•จ