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

[Swift] Struct vs. Class (1), μ–Έμ œ 뭘 μ¨μ•Όν• κΉŒ?

κ°œλ°œν•˜λŠ” ν›ˆμ΄ 2021. 8. 25. 23:57

ꡬ쑰체냐 ν΄λž˜μŠ€λƒ.. 고것이 λ¬Έμ œλ‘œλ‹€..

μƒˆλ‘œμš΄ 데이터 ꡬ쑰λ₯Ό μ •μ˜ν•˜κ±°λ‚˜ νƒ€μž…μ„ λ§Œλ“€ λ•Œ, ꡬ쑰체와 클래슀 쀑 μ–΄λ–€ 것을 μ‚¬μš©ν• μ§€ κ³ λ―Όν•˜κ³€ ν•©λ‹ˆλ‹€. μ˜€λŠ˜μ€ ꡬ쑰체와 클래슀의 차이에 λŒ€ν•΄μ„œ μ•Œμ•„λ³΄κ³  μ–΄λ–€ 상황에 μ–΄λ–€ 방식을 μ„ νƒν•˜λ©΄ 쒋을지 κ³ λ―Όν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

κ°’ νƒ€μž… 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의 클래슀λ₯Ό 상속받아 μ‚¬μš©ν•΄μ•Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이런 κ²½μš°μ—λŠ” 클래슀λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

 

κ³ μœ ν•œ 값을 μ œμ–΄ν•΄μ•Ό ν•  λ•ŒλŠ” 클래슀λ₯Ό μ‚¬μš©ν•˜μ„Έμš”.

ν΄λž˜μŠ€λŠ” μ°Έμ‘° νƒ€μž…μ΄κΈ° λ•Œλ¬Έμ— μŠ€μœ„ν”„νŠΈμ—μ„œ κ³ μœ ν•œ κ°’μœΌλ‘œ μ‚¬μš©λ©λ‹ˆλ‹€. μ°Έμ‘° νƒ€μž…μ„ μ‚¬μš©ν•˜λ©΄ μ•±μ˜ μ—¬λŸ¬ κ³³μ—μ„œ μ‚¬μš©ν•˜λ”λΌλ„ ν•œ μ˜μ—­μ—μ„œ μ μš©ν•œ μˆ˜μ •μ΄ λ‹€λ₯Έ μ˜μ—­μ—μ„œλ„ μ μš©λ©λ‹ˆλ‹€. 주둜 파일 κ΄€λ¦¬λ‚˜ λ„€νŠΈμ›Œν¬ μ—°κ²°κ³Ό 같은 μž‘μ—…μ„ λ‹€λ£° λ•Œ 클래슀λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

 

κ³ μœ ν•œ 값을 μ œμ–΄ν•˜μ§€ μ•Šμ„ λ•ŒλŠ” ꡬ쑰체λ₯Ό μ‚¬μš©ν•˜μ„Έμš”.

μ™ΈλΆ€μ—μ„œ 이미 κ³ μœ μ„±μ„ μ²˜λ¦¬ν•˜κ³  μžˆλŠ” κ²½μš°μ—λŠ” μ•± λ‚΄μ—μ„œ λ°μ΄ν„°μ˜ κ³ μœ μ„±μ„ 관리할 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

 

상속과 곡유 속성을 λͺ¨λΈλ§ ν•˜κ³  싢을 λ•ŒλŠ” ꡬ쑰체와 ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜μ„Έμš”.

κ΅¬μ‘°μ²΄λŠ” 클래슀처럼 λ‹€λ₯Έ 클래슀λ₯Ό 상속할 수 μ—†μŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ ν”„λ‘œν† μ½œμ„ 톡해 계측ꡬ쑰λ₯Ό ν‘œν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν΄λž˜μŠ€λŠ” 클래슀끼리만 상속을 λ§Œλ“€ 수 μžˆλŠ” λ°˜λ©΄μ— ν”„λ‘œν† μ½œμ€ 클래슀, μ—΄κ±°ν˜•, ꡬ쑰체가 λͺ¨λ‘ μ±„νƒν•˜λ„λ‘ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.