🍎 아이-였-μ—μŠ€/🐀 μŠ€μœ„ν”„νŠΈ

[Swift] Struct vs. Class (2), Structμ•ˆμ— μ°Έμ‘° νƒ€μž…, Class μ•ˆμ— κ°’ νƒ€μž… λ³€μˆ˜κ°€ μžˆμ„ λ•Œ

κ°œλ°œν•˜λŠ” ν›ˆμ΄ 2021. 8. 26. 00:58

κ΅¬μ‘°μ²΄λŠ” κ°’ νƒ€μž…, ν΄λž˜μŠ€λŠ” μ°Έμ‘° νƒ€μž…!

이전 ν¬μŠ€νŠΈμ—μ„œ κ΅¬μ‘°μ²΄λŠ” κ°’ νƒ€μž…, ν΄λž˜μŠ€λŠ” μ°Έμ‘° νƒ€μž…μ΄λΌλŠ” 것을 κ³΅λΆ€ν–ˆμŠ΅λ‹ˆλ‹€. 그런데 λ§Œμ•½ ꡬ쑰체 μ•ˆμ— 클래슀의 μΈμŠ€ν„΄μŠ€κ°€ μžˆλŠ” 경우, 그리고 클래슀 μ•ˆμ— ꡬ쑰체 μΈμŠ€ν„΄μŠ€κ°€ μžˆλŠ” κ²½μš°λŠ” μ–΄λ–¨κΉŒμš”?

클래슀 μ•ˆμ— ꡬ쑰체의 μΈμŠ€ν„΄μŠ€κ°€ μžˆλŠ” 경우

μ½”λ“œλ‘œ μž‘μ„±ν•΄μ„œ ν™•μΈν•΄λ΄…μ‹œλ‹€.

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λŠ” λ³΅μ‚¬λ³Έμ—λ§Œ μ—…λ°μ΄νŠΈλ˜κ³ , 클래슀 μΈμŠ€ν„΄μŠ€λŠ” 참쑰값이 λ³΅μ‚¬λ˜μ—ˆκΈ° λ•Œλ¬Έμ— μ–‘μͺ½ μΈμŠ€ν„΄μŠ€μ— λͺ¨λ‘ μ—…λ°μ΄νŠΈλ©λ‹ˆλ‹€.

μ•„ ν—·κ°ˆλ¦°λ‹€! 정리!

κ°„λ‹¨ν•˜κ²Œ μ •λ¦¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • 클래슀 내뢀에 ꡬ쑰체 μΈμŠ€ν„΄μŠ€κ°€ λ©€λ²„λ‘œ μžˆμ„ λ•Œ → λ³€μˆ˜μ— 클래슀 μΈμŠ€ν„΄μŠ€ ν• λ‹Ή μ‹œ 같은 ꡬ쑰체 μΈμŠ€ν„΄μŠ€κ°€ 따라간닀.
  • ꡬ쑰체 내뢀에 클래슀 μΈμŠ€ν„΄μŠ€κ°€ λ©€λ²„λ‘œ μžˆμ„ λ•Œ → λ³€μˆ˜μ— ꡬ쑰체 μΈμŠ€ν„΄μŠ€ ν• λ‹Ή μ‹œ 클래슀 μΈμŠ€ν„΄μŠ€μ˜ μ°Έμ‘° 값이 따라간닀.