λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

🍎 iOS/Swift

[Swift] ν”„λ‘œνΌν‹°(Properties) - νƒ€μž… ν”„λ‘œνΌν‹°

μ•ˆλ…•ν•˜μ„Έμš” μ œμΈμž…λ‹ˆλ‹€:)

ν”„λ‘œνΌν‹° μ‹œλ¦¬μ¦ˆ λ§ˆμ§€λ§‰!으둜 νƒ€μž… ν”„λ‘œνΌν‹°μ— λŒ€ν•΄ μ •λ¦¬ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. λ°”λ‘œ μ‹œμž‘ν• κ²Œμš”~!

νƒ€μž… ν”„λ‘œνΌν‹° (Type Properties)

이전에 μ •λ¦¬ν–ˆμ—ˆλ˜ μ €μž₯ ν”„λ‘œνΌν‹°, μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” λͺ¨λ‘ νŠΉμ • μΈμŠ€ν„΄μŠ€μ— μ†ν•œ μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μž…λ‹ˆλ‹€.

μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°λŠ” μ–΄λ– ν•œ νƒ€μž…(class, struct λ“±)의 μΈμŠ€ν„΄μŠ€κ°€ μƒμ„±λ˜μ—ˆμ„ λ•Œ μ‚¬μš©ν•  수 μžˆλŠ” ν”„λ‘œνΌν‹°λ‘œ, μΈμŠ€ν„΄μŠ€λ₯Ό μƒˆλ‘œ 생성할 λ•Œλ§ˆλ‹€ μƒˆλ‘œμš΄ ν”„λ‘œνΌν‹°λ„ 같이 μƒμ„±λ˜κ³ , μΈμŠ€ν„΄μŠ€λ§ˆλ‹€ λ‹€λ₯Έ 값을 지닐 수 μžˆμŠ΅λ‹ˆλ‹€.

 

각각의 μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ νƒ€μž… μžμ²΄μ— μ†ν•˜λŠ” ν”„λ‘œνΌν‹°λ₯Ό νƒ€μž… ν”„λ‘œνΌν‹°λΌκ³  ν•©λ‹ˆλ‹€. 

νƒ€μž… ν”„λ‘œνΌν‹°λŠ” νƒ€μž… μžμ²΄μ— 영ν–₯을 λ―ΈμΉ˜λŠ” ν”„λ‘œνΌν‹°λ‘œ, μΈμŠ€ν„΄μŠ€μ˜ 생성 여뢀와 상관없이 νƒ€μž… ν”„λ‘œνΌν‹°μ˜ 값은 ν•˜λ‚˜μž…λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— ν•΄λ‹Ή νƒ€μž…μ˜ λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” κ°’(Cμ–Έμ–΄μ˜ static μƒμˆ˜μ™€ μœ μ‚¬), λͺ¨λ“  μΈμŠ€ν„΄μŠ€μ—μ„œ 곡용으둜 μ ‘κ·Όν•˜κ³  값을 λ³€κ²½ν•˜λŠ” λ³€μˆ˜(Cμ–Έμ–΄μ˜ static λ³€μˆ˜μ™€ μœ μ‚¬) 등을 μ •μ˜ν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.

νƒ€μž… ν”„λ‘œνΌν‹°μ˜ μ’…λ₯˜

νƒ€μž… ν”„λ‘œνΌν‹°λŠ” μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°, μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹° μ΄λ ‡κ²Œ 두 가지 μ’…λ₯˜κ°€ μžˆμŠ΅λ‹ˆλ‹€.

μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°λŠ” λ³€μˆ˜(var) ν˜Ήμ€ μƒμˆ˜(let)으둜 μ„ μ–Έν•  수 있으며, μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹°λŠ” 였직 λ³€μˆ˜(var)둜만 μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν•œ 가지 μ£Όμ˜ν•΄μ•Όν•  점은 μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°λŠ” λ°˜λ“œμ‹œ μ΄ˆκΉƒκ°’μ„ μ„€μ •ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€λŠ” μ μž…λ‹ˆλ‹€.

μ €μž₯ μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μ˜ 경우, μ΄ˆκΉƒκ°’ μ„€μ • ν˜Ήμ€ μΈμŠ€ν„΄μŠ€ 생성 μ‹œ μ΄λ‹ˆμ…œλΌμ΄μ €λ₯Ό μ΄μš©ν•΄ μ΄ˆκΉƒκ°’μ„ 섀정해쀄 수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ νƒ€μž… μžμ²΄μ—λŠ” μ΄λ‹ˆμ…œλΌμ΄μ €κ°€ λ”°λ‘œ μ—†μ–΄ μ΄ˆκΈ°ν™” ν•  곳이 μ—†κΈ° λ•Œλ¬Έμ— λ°˜λ“œμ‹œ μ„ μ–Έ μ‹œ μ΄ˆκΉƒκ°’ 섀정이 ν•„μš”ν•©λ‹ˆλ‹€.

λ˜ν•œ, μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°λŠ” λ”°λ‘œ lazy ν‚€μ›Œλ“œλ₯Ό 뢙여주지 μ•Šμ•„λ„ 지연 μ—°μ‚°λ©λ‹ˆλ‹€! 그리고 지연(lazy) μ €μž₯ ν”„λ‘œνΌν‹°μ™€λŠ” 쑰금 λ‹€λ₯΄κ²Œ 닀쀑 μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ λ™μ‹œμ— μ•‘μ„ΈμŠ€ 되고 μžˆλ”λΌλ„ 단 ν•œ 번만 μ΄ˆκΈ°ν™”λœλ‹€λŠ” 보μž₯을 λ°›μŠ΅λ‹ˆλ‹€.

μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°
- λ³€μˆ˜ ν˜Ήμ€ μƒμˆ˜λ‘œ μ„ μ–Έ κ°€λŠ₯
- μ„ μ–Έ μ‹œ μ΄ˆκΉƒκ°’ μ„€μ • ν•„μˆ˜
- lazy ν‚€μ›Œλ“œ 없이도 지연 연산됨 (μ‹€μ œλ‘œ μ‚¬μš©λ  λ•Œ μ΄ˆκΈ°ν™” 됨)
- 닀쀑 μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλ„ 단 ν•œ 번만 μ΄ˆκΈ°ν™”λœλ‹€λŠ” 보μž₯을 λ°›μŒ

μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹°
- 였직 λ³€μˆ˜λ‘œλ§Œ μ„ μ–Έ κ°€λŠ₯

νƒ€μž… ν”„λ‘œνΌν‹° ꡬ문 

기본적으둜 νƒ€μž… ν”„λ‘œνΌν‹° 선언을 μœ„ν•΄μ„œλŠ” static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

ν΄λž˜μŠ€μ—μ„œλŠ” class ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄μ„œλ„ νƒ€μž… ν”„λ‘œνΌν‹°λ₯Ό μ„ μ–Έν•  수 μžˆλŠ”λ°, static ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•œ μ„ μ–Έκ³Όμ˜ 차이점은 μ„œλΈŒν΄λž˜μŠ€μ—μ„œ overriding이 κ°€λŠ₯ν•˜λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€! 즉, 클래슀 λ‚΄λΆ€μ—μ„œ class ν‚€μ›Œλ“œλ‘œ μ„ μ–Έλœ ν”„λ‘œνΌν‹°λŠ” μ„œλΈŒν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

 

ꡬ쑰체, 클래슀, μ—΄κ±°ν˜•μ—μ„œ νƒ€μž… ν”„λ‘œνΌν‹°λ₯Ό μ–΄λ–»κ²Œ μ„ μ–Έν•˜λŠ”μ§€ 예제 μ½”λ“œλ‘œ μ‚΄νŽ΄λ΄…μ‹œλ‹€!

 

struct SomeStructure {
    static let storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 1
    }
}

enum SomeEnumeration {
    static var storedTypeProperty = "Some value."
    static var computedTypeProperty: Int {
        return 6
    }
}

class SomeClass {
    static var storedTypeProperty: Int = 1
    static var computedTypeProperty: Int {
        get {
            return storedTypeProperty
        }
        
        set {
            storedTypeProperty *= 2
        }
    }
    
    class var overrideableComputedTypeProperty: Int {
        return 107
    }
}

 

기본적으둜 static ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄ νƒ€μž… ν”„λ‘œνΌν‹°λ“€μ„ μ„ μ–Έν–ˆμœΌλ©°, μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°λŠ” μƒμˆ˜λ‚˜ λ³€μˆ˜λ‘œ λͺ¨λ‘ 선언될 수 μžˆλŠ” 반면 μ—°μ‚° νƒ€μž… ν”„λ‘œνΌν‹°λŠ” 였직 λ³€μˆ˜λ‘œλ§Œ μ„ μ–Έλœ 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 클래슀 λ‚΄λΆ€μ—μ„œλŠ” class ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•΄μ„œλ„ νƒ€μž… ν”„λ‘œνΌν‹°λ₯Ό μ„ μ–Έν•  수 μžˆλ‹€λŠ” 점도 확인 κ°€λŠ₯ν•©λ‹ˆλ‹€ :)

 

그런데 ν•œ 가지 μ΄μƒν•œ 점.. μ—°μ‚° ν”„λ‘œνΌν‹°λŠ” 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ— λͺ¨λ‘ μ •μ˜κ°€ κ°€λŠ₯ν•˜μ§€λ§Œ, μ €μž₯ ν”„λ‘œνΌν‹°μ˜ 경우 ν΄λž˜μŠ€μ™€ κ΅¬μ‘°μ²΄μ—μ„œλ§Œ μ •μ˜ κ°€λŠ₯ν•œ 것 μ•„λ‹Œκ°€μš”..?πŸ€” 

μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μ˜ 경우 μ €μž₯ ν”„λ‘œνΌν‹°λŠ” μ—΄κ±°ν˜•μ—μ„œ μ‚¬μš©μ΄ λΆˆκ°€(클래슀, κ΅¬μ‘°μ²΄μ—μ„œλ§Œ κ°€λŠ₯)ν•˜μ§€λ§Œ μ €μž₯ νƒ€μž… ν”„λ‘œνΌν‹°λŠ” μ—΄κ±°ν˜•μ—μ„œλ„ μ‚¬μš©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€!

νƒ€μž… ν”„λ‘œνΌν‹°μ˜ μ ‘κ·Όκ³Ό μ„€μ •

μΈμŠ€ν„΄μŠ€ ν”„λ‘œνΌν‹°μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ νƒ€μž… ν”„λ‘œνΌν‹°λ„ μ μ—°μ‚°μž(dot operator)둜 ν”„λ‘œνΌν‹°μ˜ 값을 κ°€μ Έμ˜€κ³  ν• λ‹Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

print(SomeStructure.storedTypeProperty) // Print: Some value.
print(SomeEnumeration.computedTypeProperty) // Print: 6

print(SomeClass.storedTypeProperty) // Print: 1
SomeClass.computedTypeProperty = 2
print(SomeClass.storedTypeProperty) // Print: 2

 

μ΄λ ‡κ²Œ νƒ€μž… ν”„λ‘œνΌν‹°κΉŒμ§€ ν”„λ‘œνΌν‹°μ— λŒ€ν•΄ μ­‰ μ •λ¦¬ν•΄λ³΄μ•˜λŠ”λ°μš”! 

κ·Έλ™μ•ˆ ν”„λ‘œνΌν‹° μ„ μ–Έ, 그리고 μΈμŠ€ν„΄μŠ€ 생성 및 μ΄ˆκΈ°ν™”λ₯Ό 정말 많이 ν–ˆμ—ˆκ³  UI μ—…λ°μ΄νŠΈλ₯Ό μœ„ν•΄μ„œ didSet λ©”μ„œλ“œλ„ μ’…μ’… μ‚¬μš©ν–ˆμ—ˆμ—ˆλŠ”λ°  이번 κΈ°νšŒμ— κ°œλ…μ„ ν™•μ‹€νžˆ μ •λ¦¬ν•˜κ³ , 또 ν”„λ‘œνΌν‹°λ³„ 차이점에 λŒ€ν•΄ μ œλŒ€λ‘œ 짚고 λ„˜μ–΄κ°ˆ 수 있게 된 것 κ°™μŠ΅λ‹ˆλ‹€ :)

κΈ΄ κΈ€ μ½μ–΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€!! 

 


[참고 자료]

 

ν”„λ‘œνΌν‹° (Properties) - The Swift Language Guide (ν•œκ΅­μ–΄)

ν”„λ‘œνΌν‹°λŠ” 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•κ³Ό κ΄€λ ¨ν•œ κ°’μž…λ‹ˆλ‹€. ν”„λ‘œνΌν‹°μ˜ μ’…λ₯˜μ—λŠ” μ €μž₯ ν”„λ‘œνΌν‹°(Stored Properties)와 κ³„μ‚°λœ ν”„λ‘œνΌν‹°(Computed Properties)κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ €μž₯ ν”„λ‘œνΌν‹°λŠ” 말 κ·ΈλŒ€λ‘œ 값을 μ €

jusung.gitbook.io

 

μŠ€μœ„ν”„νŠΈ ν”„λ‘œκ·Έλž˜λ°: Swift 5 | μ•Όκ³° - ꡐ보문고

μŠ€μœ„ν”„νŠΈ ν”„λ‘œκ·Έλž˜λ°: Swift 5 | 문법을 λ„˜μ–΄ ν”„λ‘œκ·Έλž˜λ° νŒ¨λŸ¬λ‹€μž„λ„ μ΅νžˆλŠ” μŠ€μœ„ν”„νŠΈ 5μŠ€μœ„ν”„νŠΈ 5의 핡심 ν‚€μ›Œλ“œλŠ” ‘μ•ˆμ •ν™”’λ‹€. ABI μ•ˆμ •ν™” 덕뢄에 버전과 ν™˜κ²½μ— 크게 영ν–₯받지 μ•Šκ³  더 μœ μ—°ν•˜

product.kyobobook.co.kr