πŸ“± iOS/-- Swift 5

(Swift) μ €μž₯ ν”„λ‘œνΌν‹° , μ—°μ‚° ν”„λ‘œνΌν‹° , ν”„λ‘œνΌν‹° μ˜΅μ €λ²„ (propery observer)

Newmon 2022. 3. 16. 21:39

Property

Propertyλž€?

Class, Struct, Enum에 μ†Œμ†λœ μƒμˆ˜λ‚˜ λ³€μˆ˜λ₯Ό λ§ν•œλ‹€. ν”„λ‘œνΌν‹°μ˜ μ’…λ₯˜λŠ” 크게 3κ°€μ§€λ‘œ λΆ„λ₯˜ ν•  수 μžˆλ‹€.

  1. μ €μž₯ ν”„λ‘œνΌν‹°(Stored Property)
  2. μ—°μ‚° ν”„λ‘œνΌν‹°(Computed Property)
  3. νƒ€μž… ν”„λ‘œνΌν‹°(Type Property)

μ €μž₯ ν”„λ‘œνΌν‹°(Stored Property)

  • 일반적으둜 μ“°λŠ” let , var 둜 μ„ μ–Έν•˜λŠ” μΈμŠ€ν„΄μŠ€ λ³€μˆ˜, ν˜Ήμ€ μƒμˆ˜λ₯Ό λ§ν•œλ‹€.
  • 값을 μ €μž₯ν• λ•Œ μ‚¬μš©
  • ꡬ쑰체, ν΄λž˜μŠ€μ—μ„œλ§Œ μ‚¬μš©κ°€λŠ₯

지연 μ €μž₯ ν”„λ‘œνΌν‹°(Lazy stored property)

  • 호좜 되기 μ „μ—λŠ” 값을 μ΄ˆκΈ°ν™” ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • λ”°λΌμ„œ λΆˆν•„μš”ν•œ μ„±λŠ₯μ €ν•˜, λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ 쀄 일 수 μžˆλ‹€.
  • 클래슀, κ΅¬μ‘°μ²΄μ—λ§Œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.
  • μƒμˆ˜μ—λŠ” μ‚¬μš©ν•  수 μ—†λ‹€. → μƒμˆ˜λŠ” μΈμŠ€ν„΄μŠ€κ°€ μ™„μ „νžˆ μƒμ„±λ˜κΈ° 전에 μ΄ˆκΈ°ν™” ν•΄μ•Όν•˜λ―€λ‘œ.... lazy와 μ–΄μšΈλ¦¬μ§€ μ•ŠλŠ”λ‹€.
lazy var instance = MyClass()

λ‹€λ§Œ 닀쀑 μŠ€λ ˆλ“œμ—μ„œ ν•˜λ‚˜μ˜ lazy ν”„λ‘œνΌν‹°μ— λ™μ‹œμ— μ ‘κ·Όν•œλ‹€λ©΄ λ°˜λ“œμ‹œ ν•œλ²ˆλ§Œ μ΄ˆκΈ°ν™” λœλ‹€λŠ” 보μž₯은 μ—†λ‹€. (μ—¬λŸ¬λ²ˆ μ΄ˆκΈ°ν™” 될 수 μžˆλ‹€.)

μ—°μ‚° ν”„λ‘œνΌν‹°(Computed Property)

  • 값을 μ €μž₯ν•˜λŠ” ν”„λ‘œνΌν‹°κ°€ μ•„λ‹ˆλ‹€.
  • νŠΉμ • μƒνƒœμ— 따라 연산을 μ‹€ν–‰ν•œ κ²°κ³Όκ°’
  • 클래슀, ꡬ쑰체, μ—΄κ±°ν˜•μ—λ„ μ‚¬μš© κ°€λŠ₯

getter (μ½λŠ”λ‹€λŠ” κ°œλ…)

getter: μΈμŠ€ν„΄μŠ€ λ‚΄λΆ€, μ™ΈλΆ€μ˜ 값을 μ—°μ‚°ν•˜μ—¬ μ μ ˆν•œ 값을 λŒλ €μ£ΌλŠ” 역할이닀. 그리고 μ—°μ‚°λœ 값을 μ €μž₯ν•  ν”„λ‘œνΌν‹°κ°€ μžˆμ–΄μ•Όν•œλ‹€.(ν•„μˆ˜λŠ” μ•„λ‹ˆμ§€λ§Œ 일반적으둜)

setter (μ“°λŠ”λ‹€λŠ” κ°œλ…)

setter: ν”„λ‘œνΌν‹° 값을 κ°„μ ‘μ μœΌλ‘œ μ„€μ •ν•˜λŠ” 역할이닀. (λ‚΄λΆ€κ°€ μ€λ‹‰ν™”λœ κ²½μš°μ— 유용), λ§€κ°œλ³€μˆ˜ 이름을 μƒλž΅ν•˜λ©΄ newValue λ₯Ό 톡해 μ ‘κ·Όν•  수 μžˆλ‹€.

읽기 μ „μš©μœΌλ‘œ κ΅¬ν˜„ν•˜κ³  μ‹Άλ‹€λ©΄ getter만 μž‘μ„±ν•΄μ£Όλ©΄ λœλ‹€.

import Foundation

struct Money {
    static let rate = 1200
    var won: Int
    var dollar: Float {
        get{
            return Float(self.won / Money.rate)
 // rateλŠ” νƒ€μž… ν”„λ‘œνΌν‹°μ΄λ―€λ‘œ selfκ°€ μ•„λ‹ˆλΌ νƒ€μž…μ— μ ‘κ·Όν•˜μ—¬ μ‚¬μš©ν•œλ‹€.
        }
        set(newDollar){
            self.won = Int(newDollar) * 1200
                        //dollar = newDollar ->>>> ν•˜λ‹¨ λ‚΄μš©μ˜ μ£Όμ˜ν• μ  μ°Έκ³ .
        }
    }

}

var money = Money(won: 40000)
print("40000won -> ",money.dollar, "$") // 40000won ->  33.0 $

money.dollar = 100
print("100dollar -> ",money.won, "won") // 100dollar ->  120000 won

그러면 μ™œ ν•¨μˆ˜(λ©”μ„œλ“œ)κ°€ μ•„λ‹ˆλΌ μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μ“ΈκΉŒ?

  • μΈμŠ€ν„΄μŠ€ μ™ΈλΆ€μ—μ„œ λ©”μ„œλ“œλ₯Ό 톡해 μΈμŠ€ν„΄μŠ€ λ‚΄λΆ€λ‘œ μ ‘κ·Όν•˜λ €λ©΄ λ©”μ„œλ“œλ₯Ό λ‘κ°œ κ΅¬ν˜„ν•΄μ•Όν•œλ‹€. λ”°λΌμ„œ μ—°μ‚° ν”„λ‘œνΌν‹°λ₯Ό μ“°λŠ” 편이 가독성이 μ’‹κ³ , 직관적이닀.
  • ν”„λ‘œνΌν‹°λ₯Ό μ΄ˆκΈ°ν™” ν• λ•Œ 값을 κ²€μ¦ν•˜λŠ” λͺ©μ μœΌλ‘œ μ‚¬μš©ν• λ•Œ
  • λ‹€λ₯Έ ν”„λ‘œνΌν‹°μ— μ˜μ‘΄ν•˜λŠ” ν”„λ‘œνΌν‹°λ₯Ό κ΄€λ¦¬ν• λ•Œ.
  • μ€λ‹‰ν™”λœ ν”„λ‘œνΌν‹° μ‚¬μš©.

μ£Όμ˜ν• μ 

get, set에 자기 μžμ‹ μ˜ ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜λ©΄ recursiveν•˜κ²Œ μžμ‹ μ˜ getμ΄λ‚˜ set을 ν˜ΈμΆœν•˜κ²Œλ˜λ―€λ‘œ μ΄λ ‡κ²Œ μ‚¬μš©ν•˜λ©΄ μ•ˆλœλ‹€. 즉 μœ„ μ½”λ“œμ—μ„œ 보면 dollar λ‚΄λΆ€μ˜ get μ΄λ‚˜ set λΈ”λ½μ—μ„œ dollar λ₯Ό μ‚¬μš©ν•˜λ©΄ μ•ˆλœλ‹€.

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

  • static ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ μ–Έν•œλ‹€.
  • μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹ˆλΌ, νŠΉμ • νƒ€μž…μ—μ„œ μ‚¬μš©ν•œλ‹€.
  • λ”°λΌμ„œ νƒ€μž… μžμ²΄μ— μ†ν•˜λŠ” ν”„λ‘œνΌν‹°μ΄λ©°, 값이 κ³ μœ ν•˜λ‹€.
  • λͺ¨λ“  μΈμŠ€ν„΄μŠ€κ°€ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” 값에 μ‚¬μš©ν•œλ‹€.
  • μ €μž₯ν”„λ‘œνΌν‹°, μ—°μ‚°ν”„λ‘œνΌν‹° λͺ¨λ‘ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

Property Observers (didSet , willSet)

ν”„λ‘œνΌν‹°μ˜ 값이 λ³€κ²½λ λ•Œ λ§ˆλ‹€ ν˜ΈμΆœλœλ‹€. didSet 은 값이 λ³€κ²½λ˜κΈ° 직전. willSet 은 값이 λ³€κ²½λœ 직후에 ν˜ΈμΆœλœλ‹€.

didSet

값이 λ³€κ²½λ˜κΈ° 직전에 ν˜ΈμΆœλœλ‹€.

λ³€κ²½λ˜κΈ° μ „ κ°’(oldValue)이 λ§€κ°œλ³€μˆ˜λ‘œ ν•˜λ‚˜ μžˆλ‹€. λ”°λ‘œ 이름을 μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ oldValue 둜 μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

willSet

값이 λ³€κ²½λœ 직후에 ν˜ΈμΆœλœλ‹€.

λ³€κ²½λœ ν›„μ˜ κ°’(newValue)이 λ§€κ°œλ³€μˆ˜λ‘œ ν•˜λ‚˜ μžˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ λ”°λ‘œ 이름을 μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ oldValue 둜 μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

  • ν”„λ‘œνΌν‹° μ˜΅μ €λ²„λ₯Ό μ‚¬μš©ν•˜λ €λ©΄, 값이 λ°˜λ“œμ‹œ μ΄ˆκΈ°ν™”λ˜μ–΄μžˆμ–΄μ•Όν•œλ‹€.
  • ν˜„μž¬μ™€ 같은 값을 ν• λ‹Ήν•˜λ”λΌλ„ ν”„λ‘œνΌν‹° μ˜΅μ €λ²„λŠ” ν˜ΈμΆœλœλ‹€.
  • μ—°μ‚° ν”„λ‘œνΌν‹°μ—λŠ” μ‚¬μš© λΆˆκ°€ν•˜λ‹€. ν•˜μ§€λ§Œ 상속받은 μ—°μ‚° ν”„λ‘œνΌν‹°μ—λŠ” overrideλ₯Ό 톡해 μ‚¬μš© κ°€λŠ₯ν•˜λ‹€. 즉, λΆ€λͺ¨ ν΄λž˜μŠ€μ— μ—°μ‚°ν”„λ‘œνΌν‹°κ°€ μžˆλ‹€. μ—¬κΈ°μ„œλŠ” ν”„λ‘œνΌν‹° μ˜΅μ €λ²„λ₯Ό μ‚¬μš© λͺ»ν•˜μ§€λ§Œ, 상속받은 μžμ‹ν΄λž˜μŠ€μ—μ„œλŠ” 이 ν”„λ‘œνΌν‹°λ₯Ό override ν•˜μ—¬ ν”„λ‘œνΌν‹° μ˜΅μ €λ²„λ₯Ό μ •μ˜ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆλ‹€.