๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

๊ตฌ์กฐ์ฒด๋ƒ ํด๋ž˜์Šค๋ƒ.. ๊ณ ๊ฒƒ์ด ๋ฌธ์ œ๋กœ๋‹ค..

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

 

๊ฐ’ ํƒ€์ž… vs. ์ฐธ์กฐ ํƒ€์ž…

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

 

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ

๊ตฌ์กฐ์ฒด๋Š” ๊ฐ’ ํƒ€์ž…, ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๋ผ๋Š” ๋ง์€ ๊ณง ๋‘ ํƒ€์ž…์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

๊ตฌ์กฐ์ฒด - ์Šคํƒ ์˜์—ญ

๊ตฌ์กฐ์ฒด๋Š” ๊ฐ’ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”๋ชจ๋ฆฌ์˜ ์Šคํƒ ์˜์—ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ ์˜์—ญ์€ ๊ฐ ์Šค๋ ˆ๋“œ๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— Thread-Safe ํ•˜๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์Šคํƒ ์˜์—ญ์€ ์Šคํƒ ํฌ์ธํ„ฐ๋งŒ ์ด๋™์‹œํ‚ค๋ฉด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ ๋ฒˆ์˜ ๋ช…๋ น์œผ๋กœ ํ• ๋‹น๊ณผ ํ•ด์ œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ• ๋‹นํ•  ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์šด์˜์ฒด์ œ๊ฐ€ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ํ• ๋‹นํ•  ์˜์—ญ์„ ๋”ฐ๋กœ ๊ณ„์‚ฐํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

ํด๋ž˜์Šค - ํž™ ์˜์—ญ

ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋Š” ํž™ ์˜์—ญ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ํž™ ์˜์—ญ์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์€ ๋ชจ๋‘ ์ปดํŒŒ์ผ ํƒ€์ž„์ด ์•„๋‹Œ ๋Ÿฐํƒ€์ž„์— ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Ÿฐํƒ€์ž„์— ์ถ”๊ฐ€์ ์ธ ์—ฐ์‚ฐ์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํž™ ์˜์—ญ์€ ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ์Šค๋ ˆ๋“œ๋“ค์ด ํ•จ๊ป˜ ๊ณต์œ ํ•˜๋Š” ์˜์—ญ์ด๊ธฐ ๋•Œ๋ฌธ์— Thread-Safe์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

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

 

Copy-on-write

๊ตฌ์กฐ์ฒด์™€ ๊ฐ™์€ ๊ฐ’ ํƒ€์ž…๋“ค์€ ๊ฐ’ Copy-on-write๋ผ๋Š” ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐ’ ํƒ€์ž…๋“ค์ด Copy-on-write๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, ๋ฐฐ์—ด, ๋”•์…”๋„ˆ๋ฆฌ์™€ ๊ฐ™์€ ๊ตฌ์กฐ์ฒด๋กœ ์ •์˜๋œ ์ปฌ๋ ‰์…˜๋“ค์€ ์ด ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

Copy-on-write๋Š” ๊ฐ’ ํƒ€์ž… ๋ณ€์ˆ˜๋ฅผ ์ƒˆ๋กœ์šด ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ๋•Œ, ์ฆ‰์‹œ ์ƒˆ๋กœ์šด ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋ฅผ ๊ณ„์† ๊ฐ€๋ฆฌํ‚ค๋‹ค๊ฐ€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ฒผ์„ ๋•Œ ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฉ์น˜๊ฐ€ ํฐ, ํŠนํžˆ ๋‚ด๋ถ€์— ์ฐธ์กฐ ํƒ€์ž… ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ์ฒด์˜ ๋ณต์‚ฌ๋Š” ๋ ˆํผ๋Ÿฐ์Šค ์นด์šดํŒ…๊ณผ ๊ฐ™์€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์—†์„ ๋•Œ๋Š” ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ , ์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ์ด ์ƒ๊ฒผ์„ ๋•Œ๋งŒ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์ตœ์ ํ™”๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

import Foundation

func compareValueTypeInstance(of arr1:[Int], with arr2:[Int]) {
    if arr1 == arr2 {
        print("same instance")
    } else {
        print("different istance")
    }
}

let arr1 = [1, 2, 3, 4]
var arr2 = arr1

compareValueTypeInstance(of: arr1, with: arr2) // "same instance"

arr2.append(5)

compareValueTypeInstance(of: arr1, with: arr2) // "different istance"

์ƒ์†

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

 

์–ธ์ œ ๋ญ˜ ์“ธ๊นŒ?

๊ทธ๋Ÿผ ์–ธ์ œ ๊ตฌ์กฐ์ฒด๋ฅผ ์“ฐ๊ณ , ์–ธ์ œ ํด๋ž˜์Šค๋ฅผ ์จ์•ผ ํ• ๊นŒ์š”? ๊ณต์‹๋ฌธ์„œ์—์„œ ์นœ์ ˆํ•˜๊ฒŒ ์•ˆ๋‚ดํ•ด์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

Apple Developer Documentation

 

developer.apple.com

๋””ํดํŠธ๋กœ ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

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

 

Objective-C์™€ ์ƒํ˜ธ ์ด์šฉ(Interoperability) ํ•ด์•ผ ํ•  ๋•Œ๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

Objective-C์—์„œ ์ง€์›ํ•˜๋Š” API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๋•Œ๋Š” Objective-C์˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๊ณ ์œ ํ•œ ๊ฐ’์„ ์ œ์–ดํ•ด์•ผ ํ•  ๋•Œ๋Š” ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šค์œ„ํ”„ํŠธ์—์„œ ๊ณ ์œ ํ•œ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฐธ์กฐ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ฑ์˜ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ํ•œ ์˜์—ญ์—์„œ ์ ์šฉํ•œ ์ˆ˜์ •์ด ๋‹ค๋ฅธ ์˜์—ญ์—์„œ๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ํŒŒ์ผ ๊ด€๋ฆฌ๋‚˜ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ๋‹ค๋ฃฐ ๋•Œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

๊ณ ์œ ํ•œ ๊ฐ’์„ ์ œ์–ดํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์™ธ๋ถ€์—์„œ ์ด๋ฏธ ๊ณ ์œ ์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์•ฑ ๋‚ด์—์„œ ๋ฐ์ดํ„ฐ์˜ ๊ณ ์œ ์„ฑ์„ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

 

์ƒ์†๊ณผ ๊ณต์œ  ์†์„ฑ์„ ๋ชจ๋ธ๋ง ํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ๊ตฌ์กฐ์ฒด์™€ ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

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