Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Swift/Swift BASIC

[Swift] Struct, Class ๋ถ€์‹œ๊ธฐ (์ฐจ์ด์ , class ์™€ ARC, stackํ• ๋‹น, heapํ• ๋‹น)

๊ฐ์ž ๐Ÿฅ” 2022. 4. 30. 15:39
๋ฐ˜์‘ํ˜•

์ด์ „์— Struct์™€ Class์— ๋Œ€ํ•œ ๊ฐœ๋…๊ณผ ๋‘ ๊ฐœ์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ํฌ์ŠคํŒ…ํ–ˆ๋˜ ์ ์ด ์žˆ๋‹ค. ์Šค์œ„ํ”„ํŠธ์˜ 'ใ……' ๋„ ๋ชจ๋ฅผ ๋•Œ ์ •๋ฆฌํ–ˆ๋˜ ๊ธ€์ด๋ผ ๋„์ €ํžˆ ์ง€๊ธˆ์™€์„œ ์ƒ๊ฐํ–ˆ์„๋•Œ ๋„์›€์ด ๋˜์ง€ ์•Š...์•˜๊ธฐ ๋•Œ๋ฌธ์— struct์™€ class์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ ๋‹ค๋ค„๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์ตœ๊ทผ์— SwiftUI๋กœ ๋งŽ์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ Struct๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค. ๊ทธ ์ด์œ ์— ๋Œ€ํ•ด์„œ ๋ฉ˜ํ† ๋‹˜์ด "struct๋Š” ์ดˆ๊ธฐํ™”๋ฅผ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ’์ด ์ค„์–ด๋“ค๊ณ , stack์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋น ๋ฅด๊ณ  ๊ฐ€๋ณ๋‹ค" ๋ผ๊ณ  ์žฅ์ ์— ๋Œ€ํ•ด์„œ ๋ง์”€ํ•ด์ฃผ์…จ๋‹ค. ์ด ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ์ž์„ธํ•œ ์ดํ•ด๋ฅผ ์œ„ํ•ด ํ•ด๋‹น ํฌ์ŠคํŒ…์„ ๋‹ค์งํ–ˆ๋‹ค.


์šฐ์„  ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜๋ฉด "Class๋Š” ์ฐธ์กฐํƒ€์ž…์ด๊ณ , ARC๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅด ํ•œ๋‹ค. Struct๋Š” ๊ฐ’ํƒ€์ž…์ด๋‹ค."๋ผ๋Š”๊ฒŒ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์ด๋‹ค. ์ด๊ฒŒ ๊ณผ์—ฐ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์–ด๋–ค์˜๋ฏธ๊ฐ€ ์žˆ์„์ง€ ๊ถ๊ธˆํ•ด์กŒ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ SwiftUI๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ด์ƒํ• ์ •๋„๋กœ Struct๊ฐ€ ๋งŽ์ด ์“ฐ์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋„๋Œ€์ฒด ์–ด๋–ค ๋ถ€๋ถ„์—์„œ ์–ด๋–ป๊ฒŒ class์™€ ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๊ฑด์ง€๋„ ๊ถ๊ธˆํ•ด์กŒ๋‹ค.

๊ทธ๋Ÿฐ ์˜๋ฏธ๋กœ ๋‹ค์‹œํ•œ๋ฒˆ ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

โ–ถ๏ธ Struct(๊ตฌ์กฐ์ฒด) ์™€ Class์˜ ๊ณตํ†ต์ 

  • ๊ฐ’์„ ์ €์žฅํ•  ํ”„๋กœํผํ‹ฐ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•ฉ์ˆ˜์  ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‚ด๋ถ€ ๊ฐ’์— . ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•ด ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • extension์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Protocol์„ ์ฑ„ํƒœํ•˜์—ฌ ๊ธฐ๋Šฅ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค

 

๐Ÿ“Œ ์ฐจ์ด์ 

โ–ถ๏ธ Struct(๊ตฌ์กฐ์ฒด)

  • ๊ฐ’ํƒ€์ž…์ด๋‹ค.
  • ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜๋ฅผ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ตฌ์กฐ์ฒด๊ฐ€ ํ• ๋‹น๋œ๋‹ค.
    ์ฆ‰, ๊ฐ™์€ ๊ตฌ์กฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ ๋’ค ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋”๋ผ๋„ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

โ–ถ๏ธ Class(ํด๋ž˜์Šค)

  • ์ฐธ์กฐํƒ€์ž…์ด๋‹ค.
  • ARC๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ๊ฐ™์€ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•œ ๋’ค ๊ฐ’์„ ๋ณ€๊ฒฝ์‹œํ‚ค๋ฉด, ํ• ๋‹นํ•œ ๋ชจ๋“  ๋ณ€์ˆ˜์— ์˜ํ–ฅ์„ ์ค€๋‹ค.
  • ์ƒ์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ํƒ€์ž…์บ์ŠคํŒ…์„ ํ†ตํ•ด์„œ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ํƒ€์ž…์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • deinit์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”๋ชจ๋ฆฌํ• ๋‹น์„ ํ•ด์ œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์ด ๊ฐ’ํƒ€์ž… vs ์ฐธ์กฐํƒ€์ž…์ด๋‹ค. ์ด ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ๋กœ ์‚ดํŽด๋ณด์ž.

์ด์ฒ˜๋Ÿผ ํด๋ž˜์Šค๋Š” ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’์„ ํ• ๋‹นํ•˜๋›๋ผ๋„, ์ฐธ์กฐ๋œ ํด๋ž˜์Šค ๊ทธ ์ž์ฒด์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ๋‹ค. class์˜ count์— 3์„ ํ• ๋‹นํ•˜๊ณ , class2 count์—๋Š” 4๋ฅผ ํ• ๋‹นํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ์ถœ๋ ฅํ•ด๋ณด๋‹ˆ, ๋’ค๋Šฆ๊ฒŒ ํ• ๋‹นํ•œ 4๊ฐ€ ๋ชจ๋“  class ์ธ์Šคํ„ด์Šค์— ๋“ค์–ด๊ฐ€์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋”๋ถˆ์–ด์„œ ์•„๋ฌด๊ฐ’๋„ ํ• ๋‹นํ•ด์ฃผ์ง€ ์•Š์•˜๋˜ class3.count ์—๋„ 4๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. ์ด๊ฒŒ ๋ฐ”๋กœ class์˜ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ด ํŠน์ง•์ธ ์ฐธ์กฐํƒ€์ž…์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

๋ฐ˜๋ฉด์— struct ๋Š” ์ƒˆ๋กœ์šด๋ณ€์ˆ˜์— ๊ตฌ์กฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋ฉด, ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋˜์–ด ๋งค๋ฒˆ ์ƒˆ๋กœ์šด ๊ตฌ์กฐ์ฒด๊ฐ€ ํ• ๋‹น๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ’์„ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ณ€๊ฒฝํ•ด๋„, ๊ทธ ์ธ์Šคํ„ด์Šค๋งŒ์˜ ๊ณ ์œ ์˜ ๊ฐ’์„ ๊ฐ–๋Š”๋‹ค. --> ๊ฐ’ํƒ€์ž…

 

๊ทธ๋Ÿผ ์—ฌ๊ธฐ์„œ ๋ฉ”๋ชจ๋ฆฌ ์ด์•ผ๊ธฐ๊ฐ€ ๋‚˜์˜ค๋Š”๋ฐ ๋„๋Œ€์ฒด ARC๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค๋Š”๊ฒŒ ๋ฌด์Šจ๋œป์ผ๊นŒ

 

โ–ถ๏ธ Class ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ : ARC

 ์ฐธ์กฐํƒ€์ž…์€ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋Š”์ง€๊ฐ€ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ผ๊ณ  ํ•œ๋‹ค. ์ ์ ˆํ•œ ์‹œ์ ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฉด ํ•œ์ •์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ž์›์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋Š” ์„ฑ๋Šฅ์ €ํ•˜๋กœ ์ด์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

swift๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋ฒ•์ธ ARC(Automatic Reference Counting)์„ ์‚ฌ์šฉํ•œ๋‹ค.

ARC๊ฐ€ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” Reference Counting (์ฐธ์กฐ ํšŸ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฑฐ)๋Š” ์ฐธ์กฐํƒ€์ž…์ธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—๋งŒ ์ ์šฉ๋œ๋‹ค. ๊ตฌ์กฐ์ฒด๋‚˜ enum์€ ๊ฐ’ํƒ€์ž…์œผ๋กœ ๋‹ค๋ฅธ๊ณณ์—์„œ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ARC๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.]

 

ARC๋ž€?

์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๋ฐฉ์‹์ด๋‹ค. ์ž๋™์œผ๋กœ ๊ทธ๋ƒฅ ์ž‘๋™ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด์„œ ์‹ ๊ฒฝ์„ ๋œ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

โ–ถ ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ

ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ํ•ด๋‹น ์ธ์Šคํ„ด์Šค์˜ ์ •๋ณด๋Š” HeapObject๋ผ๋Š” Struct๋กœ ๊ด€๋ฆฌ๋œ๋‹ค. ARC์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ Swift Runtime์ด๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๋ฐ, Swift Runtime์€ ๋™์  ํ• ๋‹น ๋˜๋Š” ๋ชจ๋“  ๋ชจ๋“  object๋ฅผ HeapObject๋ผ๋Š” struct๋กœ ํ‘œํ˜„ํ•œ๋‹ค. ๋˜ํ•œ HeapObject์—์„œ๋Š” Swift์—์„œ ๊ฐ์ฒด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ, ์ฆ‰ reference count์™€ type meta data๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค. heap ํ• ๋‹น์— ๋Œ€ํ•ด์„œ๋Š” ์กฐ๊ธˆ๋งŒ ๋ฐ‘์—์„œ ๋‹ค์‹œ ์•Œ์•„๋ณด์ž.

โ–ถ ์ธ์Šคํ„ด์Šค ํ•ด์ œ

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

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

๊ทธ๋Ÿผ ์ด์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด์„œ ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ์ดํ•ดํ•ด๋ณด์ž.

  • line 42 ์—์„œ ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 2๊ฐ€ ์ถœ๋ ฅ๋๋‹ค. ์›๋ž˜ ์ฐธ์กฐ ์นด์šดํŠธ๋Š” 2๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด๋‹ค. 
  • line 45 ์—์„œ๋Š” 3์ด ์ถœ๋ ฅ๋๋‹ค. line 44 ์—์„œ ํ•œ๋ฒˆ ๋” ์ฐธ์กฐ๋ฅผ ํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— +1์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • line 48 ์—์„œ๋Š” -1 ๋œ 2๊ฐ€ ์ถœ๋ ฅ๋๋‹ค. line 47 ์—์„œ nil์„ ์ฃผ์–ด ์ฐธ์กฐํ•˜๋‚˜๋ฅผ ํ•ด์ œํ•ด์ฃผ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ์ฐธ์กฐํ•ด์ œ๋ฅผ ํ•ด์ฃผ์—ˆ๋”๋‹ˆ ์ฐธ์กฐ์นด์šดํŠธ๊ฐ€ 1 ๊ฐ์†Œํ•˜์—ฌ ๋”์ด์ƒ ์ฐธ์กฐํ•˜๋Š” ๊ณณ์ด ์—†์œผ๋ฏ€๋กœ deinit์ด ์‹คํ–‰๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ํŠน์ง• ๋•Œ๋ฌธ์— retain Cycle์ด ๋ฐœ์ƒํ•˜๊ธฐ๋„ ํ•œ๋‹ค. 

์ด ์ฝ”๋“œ์—์„œ ๋งˆ์ง€๋ง‰์— "ํ• ๋‹นํ•ด์ œ"๊ฐ€ ์ถœ๋ ฅ๋˜์ง€ ์•Š์•˜๋‹ค. ๋” ์ด์ƒ classA, classB์— ์ ‘๊ทผํ•  ๋ฐฉ๋ฒ•์ด ์—†๋Š”๋ฐ๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 0์ด ๋˜์ง€ ์•Š์•„์„œ deinit์ด ์‹คํ–‰๋˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

์ด๋Š” weak unowned ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿผ ์งค๋ง‰ํ•˜๊ฒŒ ๋‚˜๋งˆ weak ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

line 114, 115๋ฅผ ๋ณด๋ฉด, ์ฐธ์กฐ๋ฅผ ํ•œ๋ฒˆ ๋” ํ•ด์ฃผ์—ˆ๋Š”๋ฐ๋„ ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์•˜๋‹ค. ์ด๋Š” weak์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด๋‹ค. 

์ด์ฒ˜๋Ÿผ weak ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด retain cycle์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์ง• ๋•Œ๋ฌธ์— class์™€ struct ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๋Š” ์œ„์น˜๊ฐ€ ๋‹ค๋ฅด๋‹ค. ๊ตฌ์กฐ์ฒด๋Š” ์–ธ์ œ ์ƒ๊ธฐ๊ณ , ์‚ฌ๋ผ์งˆ์ง€ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ์˜ stack ๊ณต๊ฐ„์— ํ• ๋‹น๋˜๊ณ , ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ๊ฐ€ ์–ด๋””์„œ ์–ด๋–ป๊ฒŒ ๋ ์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— heap ์ด๋ผ๋Š” ๊ณต๊ฐ„์— ํ• ๋‹น๋˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ stack ํ• ๋‹น๊ณผ heap ํ• ๋‹น์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž.

 

โ–ถ stack ํ• ๋‹น

stack ์€ LIFO ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. (์ฐธ๊ณ ) ์ž๋ฃŒ๊ตฌ์กฐ ํŠน์„ฑ์ƒ ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น, ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์–ธ์ œ ์ƒ์„ฑ๋˜๊ณ  ์–ธ์ œ ํ•ด์ œ๋˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์ฒด์™€ ๊ฐ™์€ ๊ฐ’๋“ค์ด ์Šคํƒ์— ์ €์žฅ๋˜๊ฒŒ ๋œ๋‹ค.

์Šค๋ ˆ๋“œ๋“ค์€ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์ธ stack ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ˜ธ ๋ฐฐ์ œ๋ฅผ ์œ„ํ•œ ์ž์›์ด ํ•„์š”ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜๋‹ค๋Š” ๋ง์ด ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ํŠน์ง• ๋•Œ๋ฌธ์— stack ๊ฐ’๋“ค์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด heap ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฅผ ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.

โ–ถ heap ํ• ๋‹น

heap ์—์„œ๋Š” ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ƒ์„ฑ๊ณผ ํ•ด์ œ๋ฅผ ์•Œ์ˆ˜ ์—†๋Š” ์ฐธ์กฐ ํƒ€์ž…์˜ ๊ฐ์ฒด๊ฐ€ ํ• ๋‹น๋œ๋‹ค.์ฆ‰, swift ์—์„œ๋Š” ํด๋ž˜์Šค ๊ฐ์ฒด๊ฐ€ ํž™์— ํ• ๋‹น๋œ๋‹ค. heap์€ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ํ•ด์ œ๊ฐ€ ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— stack ๋ณด๋‹ค ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๋‹ค. stack ์—์„œ๋Š” pop, push ๋ผ๋Š” ๋ช…๋ น์–ด๋กœ ๊ฐ’์„ ํ• ๋‹น, ํ•ด์ œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, heap ์€ ์ฐธ์กฐ ๊ณ„์‚ฐ๋„ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ, ๋ณต์žกํ•˜๋‹ค.

๋˜ heap์€ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. ์ด๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๊ธฐ ์œ„ํ•œ lock ๊ณผ ๊ฐ™์€ ์ž์›๋„ ํ•„์š”ํ•˜๊ฒŒ ๋˜๊ณ , ์ด๋Š” ๊ณง ์˜ค๋ฒ„ํ—ค๋“œ๋กœ ์ด์–ด์ง€๊ฒŒ ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ stackํ• ๋‹น์ด๋ƒ, heapํ• ๋‹น์ด๋ƒ์— ๋”ฐ๋ผ ๊ฐ’์ด ์–ด๋””์— ์ €์žฅ๋˜๋Š”์ง€์— ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

 

๐Ÿ“Œ ๊ฐ’ํƒ€์ž…์˜ Copy-on-assignment, Copy-on-write 

์•ž์—์„œ struct์™€ ๊ฐ™์€ ๊ฐ’ํƒ€์ž…์€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ณต์‚ฌ๋œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค์˜ ๊ฐ’์„ ๋ฐ”๊พธ์–ด๋„, ๊ทธ ์ธ์Šคํ„ด์Šค์—๋งŒ ์ €์žฅ๋œ๋‹ค๊ณ .

์ด๋ ‡๊ฒŒ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๊ฐ™์€ ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ์“ฐ๋Š” ๋ฐฉ์‹์„ copy on assignment ๋ผ๊ณ  ํ•œ๋‹ค.

๋ฐ˜๋ฉด์— copy on write๋Š” ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ผ๋‹จ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ , ๊ฐ™์€ ๊ณณ์„ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ํ•ด๋‹น ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด ๊ทธ๋•Œ! ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๊ณ  ๊ฐ’์„ ๋ณ€๊ฒฝํ•œ๋‹ค. swift ์—์„œ๋Š” Int, String, Double, Array, Set, Dictonary์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.

 

๐Ÿ“Œ Struct, Class ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ƒ?

์ง€๊ธˆ๊นŒ์ง€ ๋‘๊ฐœ์˜ ์ฐจ์ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์•˜๋‹ค. ๊ทธ๋Ÿผ ์–ธ์ œ ์–ด๋Š ์‹œ์ ์—์„œ struct๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , class ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ?

  • ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์„ ๋ณด์œ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” struct๋ฅผ ์“ฐ๋Š”๊ฒŒ ์ข‹๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ์˜ stack์€ ํฌ๊ธฐ๊ฐ€ ํฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ž‘์€ ๊ฐ’์„ ๊ฐ–๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • objective-C ์™€ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์›ํ•  ๋•Œ๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

ํ•ด๋‹น ๊ธ€์„ ํฌ์ŠคํŒ…ํ•˜๊ณ  ๊ณต๋ถ€ํ•˜๋ฉด์„œ, ๋‹จ์ˆœํžˆ swift ๊ณต์‹ ๋ฌธ์„œ์— ๋‚˜์™€์žˆ๋Š” ๋‚ด์šฉ๋งŒ ์ž˜ ์•Œ๊ณ  ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹ˆ๋ผ, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์„ฑ๋Šฅ๊ฐœ์„ ์„ ํ•  ์ˆ˜ ์žˆ์„์ง€, ์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ๋” ์ข‹์€ ์ฝ”๋“œ์ผ์ง€, ์–ด๋Š ์ƒํ™ฉ์—์„œ ์–ด๋–ค ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ• ์ง€ ์กฐ๊ธˆ ๋” ๊นŠ๊ฒŒ ๊ณ ๋ฏผํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด์•ผ ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

 

๐Ÿ“– Reference

https://velog.io/@ssionii/Swift-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B4%80%EB%A6%AC-a.k.a-ARC-%EC%97%90-%EB%8C%80%ED%95%B4-%EC%95%84%EB%9D%BC%EB%B3%B4%EC%9E%90-ARC%EB%9E%80

 

Swift ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์— ๋Œ€ํ•ด ์•„๋ผ๋ณด์ž - (1) ARC๋ž€?

์ฐธ์กฐ ํƒ€์ž…์€ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜๋Š”์ง€๊ฐ€ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋‹ค. ์ ์ ˆํ•œ ์‹œ์ ์— ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฉด ํ•œ์ •์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ž์›์„

velog.io

https://icksw.tistory.com/256

 

[Swift] Class์™€ Struct์˜ ์ฐจ์ด์ ?

์•ˆ๋…•ํ•˜์„ธ์š” Pingu์ž…๋‹ˆ๋‹ค.๐Ÿง ์˜ค๋Š˜์€ iOS ๊ฐœ๋ฐœ์— ์“ฐ์ด๋Š” Swift ์–ธ์–ด์—์„œ Class, Struct์˜ ์ฐจ์ด์ ์ด๋ผ๋Š” ์ฃผ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ๊ธ€์„ ์จ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. iOS ๊ฐœ๋ฐœ์ž๋กœ ๋ฉด์ ‘์„ ์ค€๋น„ํ•˜๋‹ค ๋ณด๋ฉด Class, Struct์˜ ์ฐจ์ด์ ์ด๋ผ

icksw.tistory.com

 

๋ฐ˜์‘ํ˜•