์ƒˆ์†Œ์‹

๐Ÿ“ฑ iOS/-- Swift 5

(Swift) ์ €์žฅ ํ”„๋กœํผํ‹ฐ , ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ , ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„ (propery observer)

  • -

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 ํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋ฅผ ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
Contents

ํฌ์ŠคํŒ… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๊ธ€์ด ๋„์›€์ด ๋˜์—ˆ๋‹ค๋ฉด ๊ณต๊ฐ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.