Menu
Coddy logo textTech

프로퍼티 옵저버

Coddy Swift 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 57개 중 13번째.

프로퍼티 옵저버는 저장 프로퍼티가 변경될 때마다 코드를 실행합니다. didSet은 새 값이 저장된 직후 실행되며, 그 안에서 oldValue는 이전 값을 담고 있습니다:

class Player {
    var score = 0 {
        didSet {
            print("score \(oldValue) -> \(score)")
        }
    }
}

let p = Player()
p.score = 10
p.score += 5

출력:

score 0 -> 10
score 10 -> 15

willSet은 변경 전에 실행되며, 들어오는 값은 newValue입니다. 프로퍼티가 초기값을 받을 때는 옵저버가 실행되지 않습니다:

struct Thermostat {
    var target = 20 {
        willSet { print("changing to \(newValue)") }
        didSet { print("changed from \(oldValue)") }
    }
}

var t = Thermostat()
t.target = 22

출력:

changing to 22
changed from 20

didSet은 값을 유효한 상태로 유지하기에 좋은 곳입니다. 자체 didSet 안에서 프로퍼티에 값을 할당해도 옵저버가 다시 트리거되지 않습니다:

struct Volume {
    var level = 5 {
        didSet {
            if level > 10 { level = 10 }
            if level < 0 { level = 0 }
        }
    }
}

var v = Volume()
v.level = 42
print(v.level)
v.level = -3
print(v.level)

출력:

10
0

옵저버는 기록을 유지하거나 관련 상태를 업데이트할 수도 있으므로, 해당 로직이 코드 곳곳에 흩어지지 않고 프로퍼티와 함께 유지됩니다:

class Account {
    var history: [Int] = []
    var balance = 0 {
        didSet { history.append(balance - oldValue) }
    }
}

let a = Account()
a.balance = 100
a.balance = 70
print(a.history)

출력:

[100, -30]
challenge icon

챌린지

쉬움

Tank 클래스를 완성하세요. 저장 프로퍼티 level은 0과 capacity 사이를 유지해야 합니다. 이 범위를 벗어난 값을 수정하는 didSet을 추가하고, 수정된 level이 capacity의 20% 미만으로 끝나며 이전 level이 낮은 상태가 아니었던 경우 low 경고를 alerts에 추가하세요.

제공된 코드는 capacity를 읽은 다음 +n 또는 -n만큼 변경합니다. 각 변경 후 level을 출력하고, 마지막으로 경고 수와 함께 alerts: 를 출력합니다.

코드는 Tank.swift에 작성하세요. main.swift에는 제공된 입력/출력 코드가 들어 있으며 수정할 수 없습니다.

직접 해보기

// 제공된 입력/출력 코드: 있는 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
let tank = Tank(capacity: Int(input[0])!)
for cmd in input.dropFirst() {
    let n = Int(cmd.dropFirst())!
    tank.level += cmd.hasPrefix("+") ? n : -n
    print(tank.level)
}
print("alerts: \(tank.alerts.count)")
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: Swift 플레이그라운드