๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ Today I Learned/Swift ๋ฌธ๋ฒ•

[Swift] ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„

by Joseph Seong 2023. 12. 8.

 

 

ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„

 

didSet๊ณผ willSet

 

 ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„

  • ๋ณ€์ˆ˜์— ํ”„๋กœํผํ‹ฐ ์˜ต์ €๋ฒ„๋ฅผ ์ •์˜ํ•˜์—ฌ ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๊ณ , ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋กœ ์ด์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค์‹œ ๋งํ•˜๋ฉด ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ๋ฅผ ๊ด€์ฐฐ(observe)ํ•˜๋ฉด์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•  ๋•Œ ์‹คํ–‰๋œ๋‹ค.
  • willSet๋ณด๋‹ค๋Š” didSet์ด ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.
  • willSet๊ณผ didSet์„ ๋‘˜ ๋‹ค ์ž‘์„ฑํ–ˆ์„ ๊ฒฝ์šฐ willSet์ด ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.
  • ์ถ”๊ฐ€ํ•  ์ˆ˜์žˆ๋Š” ๊ฒฝ์šฐ
    • ์ €์žฅ ํ”„๋กœํผํ‹ฐ(stored property)
    • ์—ฐ์‚ฐ ํ”„๋กœํผํ‹ฐ(computed property)

 

didSet

  • didSet์€ ์ƒˆ ๊ฐ’์ด ์ €์žฅ๋œ ์งํ›„์— ํ˜ธ์ถœ๋œ๋‹ค.
  • ์ด์ „ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด oldValue ๋กœ ์ œ๊ณต๋œ๋‹ค.

willSet

  • willSet์€ ๊ฐ’์ด ์ €์žฅ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ๋œ๋‹ค.
  • ์ƒˆ๋กœ์šด ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด newValue ๋กœ ์ œ๊ณต๋œ๋‹ค.
var myProperty: Int = 20{
   didSet(oldVal){
      //myProperty์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋œ ์งํ›„์— ํ˜ธ์ถœ, oldVal์€ ๋ณ€๊ฒฝ ์ „ myProperty์˜ ๊ฐ’
   }
   willSet(newVal){
      //myProperty์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๊ธฐ ์ง์ „์— ํ˜ธ์ถœ, newVal์€ ๋ณ€๊ฒฝ ๋  ์ƒˆ๋กœ์šด ๊ฐ’
   }
}

var name: String = "Unknown" {
    willSet {
        print("ํ˜„์žฌ ์ด๋ฆ„ = \(name), ๋ฐ”๋€” ์ด๋ฆ„ = \(newValue)")
    }
    didSet {
        print("ํ˜„์žฌ ์ด๋ฆ„ = \(name), ๋ฐ”๋€Œ๊ธฐ ์ „ ์ด๋ฆ„ = \(oldValue)")
    }
}
 
name = "Peter"
// willSet์ด ๋จผ์ € ์‹คํ–‰๋จ
// ํ˜„์žฌ ์ด๋ฆ„ = Unknown, ๋ฐ”๋€” ์ด๋ฆ„ = Peter
// ํ˜„์žฌ ์ด๋ฆ„ = Peter, ๋ฐ”๋€Œ๊ธฐ ์ „ ์ด๋ฆ„ = Unknown

class UserAccount {
    var username: String		// username, password๋ผ๋Š” ์ €์žฅ ํ”„๋กœํผํ‹ฐ
    var password: String
    var loginAttempts: Int = 0 {
        didSet {
            if loginAttempts >= 3 {
                print("๋กœ๊ทธ์ธ ์‹œ๋„๊ฐ€ 3ํšŒ ์ด์ƒ ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ณ„์ •์ด ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค.")
                lockAccount()
            }
        }
    }
    
    var isLocked: Bool = false {
        didSet {
            if isLocked {
                print("๊ณ„์ •์ด ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค.")
            } else {
                print("๊ณ„์ •์ด ์ž ๊ธˆ ํ•ด์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
            }
        }
    }
    
    init(username: String, password: String) {
        self.username = username
        self.password = password
    }
    
    func login(with enteredPassword: String) {
        if enteredPassword == password {
            print("๋กœ๊ทธ์ธ ์„ฑ๊ณต!")
            loginAttempts = 0 // ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ๋กœ๊ทธ์ธ ์‹œ๋„ ํšŸ์ˆ˜ ์ดˆ๊ธฐํ™”
        } else {
            print("์ž˜๋ชป๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.")
            loginAttempts += 1 // ๋กœ๊ทธ์ธ ์‹คํŒจ ์‹œ ๋กœ๊ทธ์ธ ์‹œ๋„ ํšŸ์ˆ˜ ์ฆ๊ฐ€
        }
    }
    
    private func lockAccount() {
        isLocked = true   // isLocked:์ž ๊ทธ๋Š” ํ”„๋กœํผํ‹ฐ
    }
    
    func unlockAccount() {
        isLocked = false
    }
}

// ์‚ฌ์šฉ์ž ๊ณ„์ • ์ƒ์„ฑ
let user = UserAccount(username: "user123", password: "password123")

// ๋กœ๊ทธ์ธ ์‹œ๋„
user.login(with: "wrongpassword") 
// ์ถœ๋ ฅ:
// ์ž˜๋ชป๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

user.login(with: "wrongpassword") 
// ์ถœ๋ ฅ:
// ์ž˜๋ชป๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.

user.login(with: "wrongpassword") 
// ์ถœ๋ ฅ:
// ์ž˜๋ชป๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ์ž…๋‹ˆ๋‹ค.
// ๋กœ๊ทธ์ธ ์‹œ๋„๊ฐ€ 3ํšŒ ์ด์ƒ ์‹คํŒจํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ณ„์ •์ด ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค.
// ๊ณ„์ •์ด ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค.

// ๊ณ„์ • ์ž ๊ธˆ ํ•ด์ œ
user.unlockAccount() // ๊ณ„์ •์ด ์ž ๊ธˆ ํ•ด์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.