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

๊ตฌ์กฐ์ฒด๋Š” ๊ฐ’ ํƒ€์ž…, ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ ํƒ€์ž…!

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

ํด๋ž˜์Šค ์•ˆ์— ๊ตฌ์กฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด์„œ ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

import Foundation

struct ValueType {
    var number = 2
}

class ReferenceType {
    var number = 1
    var structInstance = ValueType()
}

let classInstance = ReferenceType()
let classInstanceCopy = classInstance

classInstanceCopy.number = 0
classInstanceCopy.structInstance.number = 0

print(classInstanceCopy.number)
print(classInstanceCopy.structInstance.number)
print()
print(classInstance.number)
print(classInstance.structInstance.number)

๊ตฌ์กฐ์ฒด์™€ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋กœ ๊ตฌ์กฐ์ฒด๋ฅผ ํ•˜๋‚˜ ์ดˆ๊ธฐํ™”ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด๋Š” number๋ผ๋Š” ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

0 // classInstance.number
0 // classInstance.structInstance.number

0 // classInstanceCopy.number
0 // classInstanceCopy.structInstance.number

์ฐธ์กฐ ๊ฐ’์ด ๋ณต์‚ฌ๋œ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด, ๊ธฐ์กด ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ๊ตฌ์กฐ์ฒด ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  number ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋„ ํ•จ๊ป˜ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋™์ž‘ํ•˜๋Š” ์ด์œ ๋Š” struct๋Š” ๊ฐ’ ํƒ€์ž…์ด์ง€๋งŒ RefereceType ์ธ์Šคํ„ด์Šค๊ฐ€ ํž™์— ํฌํ•จ๋˜์–ด์„œ ์ฐธ์กฐ ํƒ€์ž…์ธ ReferenceType ์ธ์Šคํ„ด์Šค๊ฐ€ ํ•ด์ œ๋  ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์— ํ•จ๊ป˜ ๋‚จ์•„์žˆ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

์ฆ‰, ์ฐธ์กฐ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ๋•Œ๋Š” ์ฐธ์กฐ ๊ฐ’๋งŒ ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚ด๋ถ€์˜ ๊ฐ’ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋Š” ์ƒˆ๋กœ ๋ณต์‚ฌ๋˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋ฅผ ๋”ฐ๋ผ๊ฐ‘๋‹ˆ๋‹ค! ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋„ˆ๋ฌด๋‚˜ ๋‹น์—ฐํ•˜์ฃ ? ์ฐธ์กฐ ํƒ€์ž… ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒˆ๋กœ ์–ด๋”˜๊ฐ€์— ํ• ๋‹นํ•œ๋‹ค๊ณ  ํ•ด์„œ ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฑด ์•„๋‹ˆ๋‹ˆ๊นŒ์š”.

๊ตฌ์กฐ์ฒด ์•ˆ์— ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ

๊ทธ๋Ÿผ ๋ฐ˜๋Œ€๋กœ ๊ตฌ์กฐ์ฒด ์•ˆ์— ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์„ ๋•Œ๋Š” ์–ด๋–จ๊นŒ์š”? ์ด๋ฒˆ์—๋„ ์ฝ”๋“œ๋กœ ํ•œ ๋ฒˆ ์•Œ์•„๋ณผ๊นŒ์š”?

import Foundation

struct ValueType {
    var number = 2
    var classInstance = ReferenceType()
}

class ReferenceType {
    var number = 1
}

var structInstance = ValueType()
var structInstanceCopy = structInstance

structInstanceCopy.number = 0
structInstanceCopy.classInstance.number = 0

print(structInstance.number)
print(structInstance.classInstance.number)
print()
print(structInstanceCopy.number)
print(structInstanceCopy.classInstance.number)

์•ž์„  ์˜ˆ์ œ์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๊ธฐ์ค€ ์ธ์Šคํ„ด์Šค๋งŒ ๊ตฌ์กฐ์ฒด๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด ์ฝ”๋“œ์˜ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

2 // structInstance.number
0 // structInstance.classInstance.number

0 // structInstanceCopy.number
0 // structInstanceCopy.classInstance.number

ํด๋ž˜์Šค ๋‚ด๋ถ€์— ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค๊ฐ€ ์žˆ์„ ๋•Œ์™€๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด์ฃ ?

 

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

์•„ ํ—ท๊ฐˆ๋ฆฐ๋‹ค! ์ •๋ฆฌ!

๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํด๋ž˜์Šค ๋‚ด๋ถ€์— ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉค๋ฒ„๋กœ ์žˆ์„ ๋•Œ → ๋ณ€์ˆ˜์— ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค ํ• ๋‹น ์‹œ ๊ฐ™์€ ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค๊ฐ€ ๋”ฐ๋ผ๊ฐ„๋‹ค.
  • ๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€์— ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉค๋ฒ„๋กœ ์žˆ์„ ๋•Œ → ๋ณ€์ˆ˜์— ๊ตฌ์กฐ์ฒด ์ธ์Šคํ„ด์Šค ํ• ๋‹น ์‹œ ํด๋ž˜์Šค ์ธ์Šคํ„ด์Šค์˜ ์ฐธ์กฐ ๊ฐ’์ด ๋”ฐ๋ผ๊ฐ„๋‹ค.