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

iOS/WWDC

WWDC24) Swift์˜ ์„ฑ๋Šฅ ์‚ดํŽด๋ณด๊ธฐ

๋ฐ˜์‘ํ˜•

c์–ธ์–ด : ๋กœ์ปฌ ๋ณ€์ˆ˜ ์Šคํƒ์— ํ• ๋‹น, ํž™ ํ• ๋‹น์€ ํ˜ธ์ถœ์„ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ด๋ฃจ์–ด์ง.

 

func main(args: [String]) {
  let arr = args.map { Int($0) ?? 0 }
}

- swift ๋Š” ์•ˆ์ •์„ฑ ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜์ง„ ์•Š์Œ.

- ๋Œ€์‹  ๋‹ค์–‘ํ•œ ์ถ”์ƒํ™” ๊ธฐ๋Šฅ, ํด๋กœ์ €, ์ œ๋„ค๋ฆญ ๋“ฑ ์ง€์›.

 

 

 

๐Ÿง  1. ์„ฑ๋Šฅ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€?

  • ์„ฑ๋Šฅ์€ ๋‹จ์ผ ์ง€ํ‘œ๋กœ ์ธก์ •ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ๋‹ค์ฐจ์›์ ์ด๊ณ  ๋งฅ๋ฝ์— ๋”ฐ๋ผ ๋‹ค๋ฆ„.
  • ๋ณดํ†ต์€ ๊ฑฐ์‹œ์ ์ธ ์ฐจ์›์—์„œ ์„ฑ๋Šฅ์„ ๋‹ค๋ฃธ. ์•ฑ ์ค‘๋‹จ, ui ๋ฐ˜์‘ ๋А๋ฆผ ๋“ฑ๋“ฑ.. 
  • ์ผ๋ฐ˜์ ์œผ๋กœ ํ•˜ํ–ฅ์‹ ๋ถ„์„ ๋„๊ตฌ (์˜ˆ: Instruments)๋กœ ๋ณ‘๋ชฉ์„ ์ฐพ๊ณ , ๋กœ์šฐ ๋ ˆ๋ฒจ๊นŒ์ง€ ๋‚ด๋ ค๊ฐ€๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌพ.
  • ํ•˜์ง€๋งŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ตœ์ ํ™”ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋А๋ฆด ๋•Œ, ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜๋Š”์ง€ ์ดํ•ดํ•ด์•ผ ํ•จ.

 


 

โš™๏ธ 2. Swift ๋กœ์šฐ ๋ ˆ๋ฒจ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” 4๋Œ€ ์š”์†Œ

- swift ์—๋Š” powerful optimizer๊ฐ€ ์žˆ์Œ.

- compiler๊ฐ€ ํšจ๊ณผ์ ์œผ๋กœ ์ œ๊ฑฐํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ

- ์ตœ์ ํ™”์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Œ.

 

1. ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋น„์šฉ (Function calls)

  • ๋„ค ๊ฐ€์ง€ ๋น„์šฉ:
    1. ์ธ์ˆ˜ ์ „๋‹ฌ
    2. ํ˜ธ์ถœ ํ•จ์ˆ˜ ์ฃผ์†Œ ๊ฒฐ์ •
    3. ๋กœ์ปฌ ์ƒํƒœ ์ €์žฅํ•  ๊ณต๊ฐ„ ํ• ๋‹น
    4. ์ตœ์ ํ™” ์ œํ•œ

  • ์ •์  ๋””์ŠคํŒจ์น˜๊ฐ€ ๊ฐ€์žฅ ํšจ์œจ์  (์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์ ํ™” ๊ฐ€๋Šฅ). ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋‹ค์–‘ํ•˜๊ฒŒ ์ธ๋ผ์ธ ์ฒ˜๋ฆฌ๋‚˜ ์ œ๋„ค๋ฆญ ๊ตฌ์ฒดํ™”์ฒ˜๋Ÿผ ์ตœ์ ํ™” ์ด๋ฃจ์–ด์ง
  • ๋™์  ๋””์ŠคํŒจ์น˜๋Š” ๋‹คํ˜•์„ฑ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์„ฑ๋Šฅ ๋น„์šฉ ์žˆ์Œ. 

ํ”„๋กœํ† ์ฝœ ์œ ํ˜•์˜ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ˜ธ์ถœ

 

- ๋ฉ”์ธ ๋ฐ”๋”” ์•ˆ์— ์„ ์–ธ๋œ ๊ฒฝ์šฐ : ํ”„๋กœํ† ์ฝœ ์š”๊ตฌ์‚ฌํ•ญ, ๋™์  ๋””์ŠคํŒจ์น˜ ์‚ฌ์šฉ

- ํ”„๋กœํ† ์ฝœ ํ™•์žฅ ์•ˆ์—์„œ ์„ ์–ธ๋œ ๊ฒฝ์šฐ : ์ •์  ๋””์ŠคํŒจ์น˜๋ฅผ ์‚ฌ์šฉ

- ํ”„๋กœํ† ์ฝœ ๋ฉ”์„œ๋“œ๋Š” ๋™์ , ํ”„๋กœํ† ์ฝœ ํ™•์žฅ ๋ฉ”์„œ๋“œ๋Š” ์ •์  ๋””์ŠคํŒจ์น˜.

 

 

 

- ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋ ค๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•จ. ์ผ๋ฐ˜์ ์ธ ๋™๊ธฐ ํ•จ์ˆ˜์ด๋ฏ€๋กœ ์ด ๋ฉ”๋ชจ๋ฅผ c์Šคํƒ์— ํ• ๋‹น. 

- ์Šคํƒ ํฌ์ธํ„ฐ์—์„œ ํ• ๋‹นํ•  ๊ณต๊ฐ„๋งŒํผ ๋นผ๋ฉด ๋จ. call frame์ด๋ผ๋Š” ๊ณต๊ฐ„์— ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ๊ณต๊ฐ„์ด ํ• ๋‹น๋จ.

- ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์ „์— 208 ๊ณต๊ฐ„ ๋งŒํผ ๋‹ค์‹œ ๋”ํ•ด์„œ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•จ.

 

callframe์— ๋ชจ๋“  ๊ฒƒ์„ ๋„ฃ๋Š”๊ฒŒ ๊ฐ€์žฅ ์ข‹์€ ์ด์œ ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ•จ์ˆ˜ ์‹œ์ž‘ ์‹œ ํ•ญ์ƒ ์Šคํƒ ํฌ์ธํ„ฐ์—์„œ ๊ฐ’์„ ๋นผ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ธฐ ๋•Œ๋ฌธ

 


 

2. ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๋น„์šฉ (Memory allocation)

 

  • ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ๋ฉ”๋ชจ๋ฆฌ ์ข…๋ฅ˜:
    • ๊ธ€๋กœ๋ฒŒ: ๋น„์šฉ ๊ฑฐ์˜ ์—†์Œ (ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด ์ง€์†)
    • ์Šคํƒ: ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จ, ํ•จ์ˆ˜ ์Šค์ฝ”ํ”„ ๋‚ด ์‚ฌ์šฉ
    • ํž™: ๊ฐ€์žฅ ์œ ์—ฐํ•˜์ง€๋งŒ ํ• ๋‹น/ํ•ด์ œ ๋น„์šฉ ํผ

ํ”„๋กœ๊ทธ๋žจ ๋กœ๋“œ์‹œ, ํ• ๋‹น๋˜๊ณ  ์ดˆ๊ธฐํ™”๋œ๋‹ค. ๋‹จ์  : ๊ณ ์ •๋œ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ํŒจํ„ด์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰๋™์•ˆ ๋ฉ”๋ชจ๋ฆฌ ์œ ์ง€, ๊ธ€๋กœ๋ฒŒ ๋ณ€์ˆ˜์™€ ์ •์  ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์—๋งŒ ์ ํ•ฉ
๋น„์šฉ์ด ์ ์ง€๋งŒ, ํŠน์ • ํŒจํ„ด์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ. ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฒ”์œ„๊ฐ€ ํ•œ์ •๋˜์–ด์•ผ ํ•จ. ํ˜„์žฌ ํ•จ์ˆ˜์˜ ํŠน์ • ์ง€์ ๋ถ€ํ„ฐ๋Š” ํ–‰๋‹น ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋„๋ก ํ•ด์•ผํ•จ. ์ผ๋ฐ˜์ ์ธ ๋กœ์ปฌ๋ณ€์ˆ˜์— ์ ํ•ฉ
๊ฐ€์žฅ์œ ์—ฐ, ์–ธ์ œ๋“ ์ง€ ํ• ๋‹น ๊ฐ€๋Šฅ. ์ดํ›„ ์–ธ์ œ๋“ ์ง€ ํ•ด์ œ ๊ฐ€๋Šฅ. ์œ ์—ฐ์„ฑ ๋•Œ๋ฌธ์— ๋น„์šฉ์€ ํผ. ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ์ž์ฃผ ์‚ฌ์šฉ๋จ. ์ •์  ์ˆ˜๋ช… ์ œํ•œ ๋ถˆ๋ถ„๋ช…. ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ

 

  • ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์†Œ์œ ๊ถŒ์„ ๊ณต์œ , ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ๋ ˆํผ๋Ÿฐ์Šค๊ฐ€ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ฐธ์กฐ
  • reference counting์œผ๋กœ ํ• ๋‹น์˜ ์ˆ˜๋ช… ๊ด€๋ฆฌ
  • retain : ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŠธ ๋Š˜๋ฆฌ๋Š” ๊ฒƒ
  • release : ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŠธ ์ค„์ด๋Š” ๊ฒƒ
  • Swift์—์„œ ๊ฐ์ฒด(ํด๋ž˜์Šค)๋Š” ํž™์— ํ• ๋‹น๋˜๊ณ  **์ฐธ์กฐ ์นด์šดํŒ…(ARC)**์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ.

 


 

3. ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„ (Memory Layout)

๊ฐ’์˜ ํ‘œํ˜„ : ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ’์ด ๋ฐฐ์—ด๋˜๋Š” ๋ฐฉ์‹. ๋ณ€์ˆ˜ array๋Š” ๋ฉ”๋ชจ๋ฆฌ์˜ ์ด๋ฆ„์œผ๋กœ ๋ฒ„ํผ ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๊ฐ€์ง€๋ฉฐ ์ด๋Š” ๋‘ double๊ฐ’์˜ ํ‘œํ˜„์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์–ด ์žˆ๋‹ค.

  • Memory Layout : ์ธ๋ผ์ธ ํ‘œํ˜„ ์ธก์ • - 8๋ฐ”์ดํŠธ, 64๋น„ํŠธ ํฌ์ธํ„ฐ ํ•˜๋‚˜์˜ ํฌ๊ธฐ

  • ๊ตฌ์กฐ์ฒด/ํŠœํ”Œ: ์ธ๋ผ์ธ ํ‘œํ˜„(inline representation) ์‚ฌ์šฉ → CallFrame์— ์ง์ ‘ ์ €์žฅ๋จ 
  • ํด๋ž˜์Šค/๋ฐฐ์—ด: ์™ธ๋ถ€(ํž™) ํ‘œํ˜„ → ํฌ์ธํ„ฐ๋กœ ์ ‘๊ทผ
  • ๊ตฌ์กฐ์ฒด๋Š” ์†์„ฑ๊นŒ์ง€ ์žฌ๊ท€์ ์œผ๋กœ ๋ณต์‚ฌ๋จ




 

4. ๊ฐ’ ๋ณต์‚ฌ ๋น„์šฉ (Value copying)

 

  • Swift๋Š” ๊ฐ’์˜ ์†Œ์œ ๊ถŒ์„ ๋ช…ํ™•ํžˆ ๊ด€๋ฆฌ:
    • ์†Œ๋ชจ(consume) → ์†Œ์œ ๊ถŒ ์ด์ „
    • ๋ณ€๊ฒฝ(mutating) → ์ผ์‹œ์ ์œผ๋กœ ์†Œ์œ ๊ถŒ ํš๋“
    • ๋Œ€์—ฌ(borrow) → ์ฝ๊ธฐ ์ „์šฉ ์ ‘๊ทผ
  • Copy-on-Write(COW) ์ „๋žต: ๋ฐฐ์—ด, ๋”•์…”๋„ˆ๋ฆฌ, ๋ฌธ์ž์—ด ๋“ฑ์€ ๋ณ€๊ฒฝ ์ „๊นŒ์ง€ ํž™ ๊ณต์œ  

๋‹จ์ˆœํžˆ ๊ธฐ์กด ๋ณ€์ˆ˜ ์ฐธ์กฐ ๋…๋ฆฝ๋œ ๊ฐ’์„ ์–ป์œผ๋ ค๋ฉด ๊ฐ’ ๋ณต์‚ฌ ํ•ด์•ผ๋จ. ๊ฐ’์˜ ๋ฒ„ํผ ์†Œ์œ ๊ถŒ ํš๋“
consume ์—ฐ์‚ฐ์ž๋กœ ๋ช…์‹œ์  ์š”์ฒญ ๊ฐ€๋Šฅ
mutating : ๋ณ€์ˆ˜์˜ ์†Œ์œ ๊ถŒ์„ ๋ฉ”์†Œ๋“œ์—๊ฒŒ ๋„˜๊ฒจ์คŒ.

 

borrowing : ๊ทธ์ € ์ฝ๊ณ  ์‹ถ์„ ๋•Œ, ์ธ์ˆ˜ ์ „๋‹ฌ ์‚ฌ๋ก€
๋ฐฉ์–ด์ ์œผ๋กœ ๋ณต์‚ฌ

 

 


 

๐Ÿ”„ ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ด€๋ จ ์ „๋žต

  • ๋ณต์‚ฌ ์ตœ์†Œํ™”: ๋Œ€๊ทœ๋ชจ ๊ตฌ์กฐ์ฒด๋Š” ๋ณต์‚ฌ๋ณด๋‹ค ์ฐธ์กฐ๋กœ ์„ค๊ณ„
  • consume ๋ช…์‹œ: ์†Œ์œ ๊ถŒ ์ด์ „์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด ์„ฑ๋Šฅ ์ตœ์ ํ™”
  • ๊ฐ’ ์˜๋ฏธ ์œ ์ง€: ๊ตฌ์กฐ์ฒด๋ฅผ ๊ถŒ์žฅ, ํด๋ž˜์Šค๋Š” ์™ธ๋ถ€ ํ‘œํ˜„์œผ๋กœ ์ฐธ์กฐ ์˜๋ฏธ
  • ํž™ ํ• ๋‹น ์ตœ์†Œํ™”: ๊ฐ€๋Šฅํ•˜๋ฉด ์ธ๋ผ์ธ ํ‘œํ˜„ ์‚ฌ์šฉ

Foundation URL : ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ์ทจ๊ธ‰
์ œ๋„ค๋ฆญ ์œ ํ˜•์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ : ์–ด๋–ค ๊ฐ€๋Šฅํ•œ ํ‘œํ˜„์˜ ์–ด๋–ค ์œ ํ˜•์œผ๋กœ๋“  ๋Œ€์ฒด ๋  ์ˆ˜ ์žˆ์–ด์•ผํ•จ.
์˜ˆ์™ธ : ์œ ํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํŠน์ • ํด๋ž˜์Šค๋กœ ์ œํ•œ๋˜๋ฉด ํด๋ž˜์Šค ์œ ํ˜•์˜ ํ‘œํ˜„์„ ๊ฐ€์ ธ์•ผํ•œ๋‹ค?

 


 

๐Ÿ“ฆ ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ ๋ฐฉ์‹

  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋Š” ์ผ๋ฐ˜ C ์Šคํƒ ๋Œ€์‹  ์ž์ฒด ์Šคํƒ(์Šฌ๋žฉ)์„ ์‚ฌ์šฉ
  • ๋Ÿฐํƒ€์ž„์— **๋ถ€๋ถ„ ํ•จ์ˆ˜(partial functions)**๋กœ ๋‚˜๋‰˜๋ฉฐ await ๊ตฌ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋‰จ
  • ์‹คํ–‰ ์ค‘ ํ•˜๋‚˜์˜ ๋ถ€๋ถ„ ํ•จ์ˆ˜๋งŒ ์Šคํƒ์— ์˜ฌ๋ผ๊ฐ€ ์žˆ์Œ

 


 

๐Ÿงฉ ํด๋กœ์ € ์ฒ˜๋ฆฌ ๋ฐฉ์‹

  • ํด๋กœ์ €๋Š” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ + ์ปจํ…์ŠคํŠธ ํฌ์ธํ„ฐ๋กœ ๊ตฌ์„ฑ

  • ํƒˆ์ถœ ๋ถˆ๊ฐ€๋Šฅํ•œ ํด๋กœ์ €๋Š” ์Šคํƒ์— ์ปจํ…์ŠคํŠธ ์ €์žฅ → ๋น ๋ฆ„

  • ํƒˆ์ถœ ํด๋กœ์ €๋Š” ํž™์— ์ €์žฅ + ์†Œ์œ ๊ถŒ ํš๋“ → ๋น„์šฉ ๋ฐœ์ƒ (ํ˜ธ์ถœ ์•ˆ์—์„œ๋งŒ ์‚ฌ์šฉ๋ ์ง€ ์•Œ ์ˆ˜ ์—†์œผ๋ฏ€๋กœ)

  • ํด๋กœ์ €๊ฐ€ ์บก์ฒ˜ํ•œ ๋กœ์ปฌ ๋ณ€์ˆ˜๋„ ํž™์— ์ด๋™๋จ

 


 

๐Ÿงฌ ์ œ๋„ค๋ฆญ & ํ”„๋กœํ† ์ฝœ ์„ฑ๋Šฅ

  • ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ํŠน์ˆ˜ํ™” ๊ฐ€๋Šฅ → ์„ฑ๋Šฅ ์ข‹์Œ
  • AnyDataModel[] ๊ฐ™์€ ํ”„๋กœํ† ์ฝœ ํƒ€์ž… ๋ฐฐ์—ด์€
    • ๊ฐ’ ์ €์žฅ ๊ณต๊ฐ„, ์œ ํ˜• ์ •๋ณด, witness table ๋“ฑ์„ ํฌํ•จ
    • ์ธ๋ผ์ธ or ํž™ ์ €์žฅ ๊ฒฐ์ •์€ ๋Ÿฐํƒ€์ž„์—์„œ ์ˆ˜ํ–‰
  • ์œ ์—ฐ์„ฑ์€ ๋Š˜์ง€๋งŒ ์ตœ์ ํ™” ์–ด๋ ค์›€ → ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ

 

์ œ๋„ค๋ฆญ ํƒ€์ž… vs ํ”„๋กœํ† ์ฝœ ํƒ€์ž… ์‚ฌ์šฉ ์‹œ ์„ฑ๋Šฅ ์ฐจ์ด

๋”๋ณด๊ธฐ

Swift์—์„  update(model:) ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

โ‘  ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜

func update<T: DataModel>(models: [T]) { ... }

 

  • ํŠน์ง•:
    • T๋Š” ํ•˜๋‚˜์˜ ํƒ€์ž…๋งŒ ์‚ฌ์šฉ๋จ (์˜ˆ: ๋ชจ๋‘ MyDataModel).
    • T์— ๋Œ€ํ•œ ํƒ€์ž… ์ •๋ณด๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ณ ์ •๋จ.
    • ์˜ตํ‹ฐ๋งˆ์ด์ €๊ฐ€ ์ด ํƒ€์ž…์— ๋งž์ถฐ ์ธ๋ผ์ธ ์ตœ์ ํ™” ๊ฐ€๋Šฅ.
    • ํ•จ์ˆ˜๋Š” ํšจ์œจ์ ์œผ๋กœ ์‹คํ–‰๋จ.

โœ… ๋น ๋ฆ„, ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋„ ์˜ˆ์ธก ๊ฐ€๋Šฅ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ตœ์ ํ™” ์ž˜ํ•ด์คŒ

 


 

โ‘ก ํ”„๋กœํ† ์ฝœ ํƒ€์ž… ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜

func update(models: [any DataModel]) { ... }

 

  • ํŠน์ง•:
    • ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ํƒ€์ž…์ผ ์ˆ˜ ์žˆ์Œ.
    • ์˜ˆ: MyDataModel, OtherDataModel ํ˜ผํ•ฉ.
    • ์‹คํ–‰ ์‹œ ๊ฐ ์š”์†Œ์˜ ์‹ค์ œ ํƒ€์ž…์„ ๋งค๋ฒˆ ํ™•์ธํ•ด์•ผ ํ•จ.
    • Swift๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ํ…Œ์ด๋ธ”(witness table) ์„ ์‚ฌ์šฉํ•ด ๋™์ž‘.
    • ์„ฑ๋Šฅ ์ตœ์ ํ™” ์–ด๋ ต๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋„ ๋œ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉ๋จ.

โš ๏ธ ์œ ์—ฐํ•˜์ง€๋งŒ ๋А๋ฆด ์ˆ˜ ์žˆ์Œ, ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๊ฐ€ ์ œ๊ฐ๊ฐ, ์ตœ์ ํ™” ์–ด๋ ต๋‹ค

 


 

๐Ÿ“ฆ Swift ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹ ๋น„๊ต

๊ตฌ๋ถ„ ์ œ๋„ค๋ฆญ ํƒ€์ž… (T: DataModel) ํ”„๋กœํ† ์ฝœ ํƒ€์ž… (any DataModel)
ํƒ€์ž… ๊ฒฐ์ • ์‹œ์  ์ปดํŒŒ์ผ ํƒ€์ž„ ๋Ÿฐํƒ€์ž„
ํ•จ์ˆ˜ ์ตœ์ ํ™” ๊ฐ€๋Šฅ (์ธ๋ผ์ธ/ํŠน์ˆ˜ํ™”) ์–ด๋ ค์›€
๋ฐฐ์—ด ๊ตฌ์กฐ ํƒ€์ž… ํ•˜๋‚˜๋กœ ์กฐ๋ฐ€ํ•˜๊ฒŒ ๊ตฌ์„ฑ๋จ ๊ฐ ์š”์†Œ๊ฐ€ ๋‹ค๋ฅด๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋‹จํŽธํ™” ๋ฐœ์ƒ
์„ฑ๋Šฅ ๋น ๋ฆ„ ๋А๋ฆด ์ˆ˜ ์žˆ์Œ
์œ ์—ฐ์„ฑ ๋‚ฎ์Œ ๋†’์Œ

 

 


 

๐Ÿ’ก Swift๋Š” ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๋‚˜?

 

  • Swift๋Š” any Protocol ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ,
    • ์ž‘์œผ๋ฉด ๋ฒ„ํผ์— ์ง์ ‘ ์ €์žฅ (์ธ๋ผ์ธ)
    • ํฌ๋ฉด ํž™์— ์ €์žฅํ•˜๊ณ  ํฌ์ธํ„ฐ๋งŒ ์œ ์ง€

 

๐Ÿง  ๊ฒฐ๋ก  ๋ฐ ์กฐ์–ธ

 

  • โœ… ์„ฑ๋Šฅ์ด ๋งค์šฐ ์ค‘์š”ํ•˜๋ฉด ์ œ๋„ค๋ฆญ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • โœ… ์—ฌ๋Ÿฌ ํƒ€์ž…์„ ๋‹ค๋ค„์•ผ ํ•  ๋•Œ๋Š” ํ”„๋กœํ† ์ฝœ ํƒ€์ž…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • โŒ ํ•˜์ง€๋งŒ “ํ”„๋กœํ† ์ฝœ์€ ๋А๋ฆฌ๋‹ค, ์“ฐ์ง€ ๋ง์ž”๋Š” ์˜คํ•ด์ž…๋‹ˆ๋‹ค.
  • → ์ถ”์ƒํ™”๋Š” ๋น„์šฉ์ด ์žˆ์ง€๋งŒ, ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ์œ ์—ฐ์„ฑ์„ ์œ„ํ•ด ์“ธ ๊ฐ€์น˜๊ฐ€ ์žˆ์–ด์š”.

 


 

๐Ÿ—ฃ๏ธ ํ•œ๋งˆ๋”” ์š”์•ฝ

 

์ œ๋„ค๋ฆญ์€ ๋น ๋ฅด๊ณ , ํ”„๋กœํ† ์ฝœ์€ ์œ ์—ฐํ•˜๋‹ค.

์ƒํ™ฉ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ๊ณผ ์œ ์—ฐ์„ฑ ์‚ฌ์ด์—์„œ ๊ท ํ˜•์„ ์žก๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

 

 

๐Ÿง  ๊ฒฐ๋ก  & ์กฐ์–ธ

  • ์ถ”์ƒํ™”๋Š” ๋น„์šฉ์„ ๋™๋ฐ˜ํ•˜์ง€๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ •๋‹นํ™”๋จ
  • ์ถ”์ƒํ™”๋ฅผ ๋ฌด์กฐ๊ฑด ํ”ผํ•˜๊ธฐ๋ณด๋‹ค ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋กœ ์ธ์‹ํ•˜์ž
  • Swift ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ์ง๊ด€์„ ๊ธฐ๋ฅด๋ฉด ์‹ค์ œ ์•ฑ ์ตœ์ ํ™”์— ํฐ ๋„์›€

 


 

๐Ÿ“š ์ฐธ๊ณ  ํ‚ค์›Œ๋“œ

 

  • ARC (Automatic Reference Counting)
  • Copy-on-Write (COW)
  • CallFrame / Memory Slab
  • ์ •์  vs ๋™์  ๋””์ŠคํŒจ์น˜
  • consume, mutating, borrow ๋™์ž‘
  • Swift ํ”„๋กœํ† ์ฝœ witness table
  • ๋น„๋™๊ธฐ ํ•จ์ˆ˜ ๋ถ„ํ•ด (partial functions)
๋ฐ˜์‘ํ˜•