iOS/🟠 Swift

[Swift] κ°’νƒ€μž…κ³Ό μ°Έμ‘°νƒ€μž… ( Value Type vs Reference Type )

woozzang 2020. 12. 29. 18:30

1μ°¨ μˆ˜μ •: 2021.06.06

 

 

μ•ˆλ…•ν•˜μ„Έμš”. 이번 κΈ€μ—μ„œλŠ” μŠ€μœ„ν”„νŠΈμ˜ κ°’νƒ€μž…κ³Ό μ°Έμ‘°νƒ€μž…μ˜ 차이점을 λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜λŠ” κ΄€μ μ—μ„œ λ‹€λ£¨μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€πŸΆ

 

*μ†μ„±κ°μ‹œμžμ—μ„œ κ°’νƒ€μž…κ³Ό μ°Έμ‘°νƒ€μž…μ˜ μž‘λ™μ°¨μ΄κ°€ κΆκΈˆν•˜λ‹€λ©΄? -> μ†μ„±κ°μ‹œμžλž€ (Property Observer) ?


 

Swiftμ—μ„œ μžλ£Œκ΅¬μ‘°λ“€μ€ λ‹€μŒκ³Ό 같은 νƒ€μž…μ„ κ°€μ§‘λ‹ˆλ‹€.

κ°’ νƒ€μž… μ°Έμ‘° νƒ€μž…
Structure
Enumeration
Tuple
Class
Closure
/* Value Type */
struct testStruct {
  var name = ""
  var age = 0
}

/* Reference Type */
class testClass {
  var name = ""
  var age = 0
}

 

λŒ€ν‘œμ μΈ νƒ€μž…μΈ Struct와 Classλ₯Ό 톡해 비ꡐ해 λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

각각은 같은 속성을 κ°€μ§€μ§€λ§Œ λ©”λͺ¨λ¦¬μ— μ €μž₯λ˜λŠ” 방식이 λ‹€λ¦…λ‹ˆλ‹€.

 

ν•œ μž₯의 그림으둜 ν‘œν˜„ν•˜λ©΄ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.


 

κ°’ νƒ€μž…

// Value Type
var testStruct = testStruct()

/* λ³„κ°œμ˜ μƒˆλ‘œμš΄ μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ–΄ 값이 볡사됨 */
var anotherStruct = value1

anotherStruct.name = "John Doe"
anotherStruct.age = 10 // testStruct.name: "", testStruct.age: 0 

κ°’ νƒ€μž…μΈ struct 의 경우, stack μ˜μ—­μ— μ‹€μ œ 데이터가 μ €μž₯λ©λ‹ˆλ‹€.

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— 값을 전달 μ‹œ μ‹€μ œ 데이터가 λ³΅μ‚¬λ©λ‹ˆλ‹€.


 

μ°Έμ‘° νƒ€μž…

// Reference Type
var testClass = testClass()

/* μ£Όμ†Œ κ°’λ§Œ λ³΅μ‚¬λ˜λ―€λ‘œ, 같은 μΈμŠ€ν„΄μŠ€λ₯Ό 가리킴 */
var anotherClass = ref1

anotherClass.name = "Jane Doe"
anotherClass.age = 17 // testClass.name: "Jane Doe", testClass.age: 17 

 

μ°Έμ‘° νƒ€μž…μΈ class의 경우, heap μ˜μ—­μ— μ‹€μ œ 데이터가 μ €μž₯되고, stack μ˜μ—­μ—λŠ” heap μ˜μ—­ λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ μ €μž₯λ©λ‹ˆλ‹€.

 

κ·Έλ ‡κΈ° λ•Œλ¬Έμ— κ°’μ˜ 전달은 μΈμŠ€ν„΄μŠ€κ°€ μœ„μΉ˜ν•œ μ‹€μ œ μ£Όμ†Œ(= heap μ˜μ—­μ˜ μ£Όμ†Œ)의 볡사이며,

결과적으둜 μœ„ μ½”λ“œμ—μ„œ  ref2λŠ” ref1의 μ°Έμ‘°λ₯Ό μ–»μŠ΅λ‹ˆλ‹€. ( Retain CountλŠ” 1 증가 )


 

let ν‚€μ›Œλ“œ

let으둜 μ„ μ–Έλœ μΈμŠ€ν„΄μŠ€λŠ”, μΈμŠ€ν„΄μŠ€μ— ν• λ‹Ήλœ stack μ˜μ—­μ˜ λ©”λͺ¨λ¦¬ 곡간을 λ³€κ²½ν•˜μ§€ λͺ»ν•˜κ²Œ ν•©λ‹ˆλ‹€.

 

λ”°λΌμ„œ stack μ˜μ—­μ— μ‹€μ œ 데이터가 μ €μž₯λ˜λŠ” κ°’ νƒ€μž… μΈμŠ€ν„΄μŠ€ 듀은 속성을 μˆ˜μ •ν•˜μ§€ λͺ»ν•©λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ stack μ˜μ—­μ— heapμ˜μ—­μ˜ λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ μ €μž₯λ˜λŠ” μ°Έμ‘° νƒ€μž… μΈμŠ€ν„΄μŠ€λ“€μ€ κ°€λ¦¬ν‚€λŠ” λŒ€μƒλ§Œ μˆ˜μ •ν•˜μ§€ λͺ»ν•  뿐, 속성을 μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

이것이 λ©”λͺ¨λ¦¬ κ΄€μ μ—μ„œμ˜ κ°’ νƒ€μž…κ³Ό μ°Έμ‘° νƒ€μž…μ˜ μ°¨μ΄μ μž…λ‹ˆλ‹€.

 

 

끝!


πŸ€–πŸŸ’[우짱의 iOS λΈ”λ‘œκ·Έ]πŸ”΅πŸ’»

iOSλ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ 배운 λ‚΄μš©μ„ κΈ°λ‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 

λ‹€μŒ κΈ€: ARC - Memory

 

ARC - Memory

"Auto Reference Counting" 더 이상 μ‚¬μš©λ˜μ§€ μ•ŠλŠ” μΈμŠ€ν„΄μŠ€κ°€ λ©”λͺ¨λ¦¬μ— λ‚¨μ•„μžˆλ‹€λ©΄ λ©”λͺ¨λ¦¬ λˆ„μˆ˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. λ©”λͺ¨λ¦¬ λˆ„μˆ˜λŠ” μ•± μ„±λŠ₯의 μ €ν•˜λ‘œ 이어지기 λ•Œλ¬Έμ— μΈμŠ€ν„΄μŠ€μ˜ μ μ ˆν•œ ν•΄μ œλŠ” μ€‘μš”ν•œ 이

woozzang.tistory.com