Menu
Coddy logo textTech

변경 메서드

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

속성을 변경하는 구조체 메서드는 mutating으로 표시해야 합니다. 이 키워드가 없으면 값 타입의 메서드는 self를 상수로 취급하므로 메서드가 컴파일되지 않습니다:

struct Counter {
    var count = 0

    mutating func increment() {
        count += 1
    }
}

var c = Counter()
c.increment()
c.increment()
print(c.count)

출력:

2

변경 메서드는 var에 대해서만 호출할 수 있습니다. let 상수에서는 전체 값이 고정되어 있으므로 호출이 컴파일되지 않습니다:

var a = Counter()
a.increment()        // 괜찮음

let b = Counter()
// b.increment()     // 오류: b는 let 상수입니다

속성을 읽기만 하는 메서드는 비변경 상태를 유지하며 상수에서도 작동합니다. 좋은 설계는 변경을 수행하는 몇 가지 메서드에만 집중합니다:

struct Stack {
    var items: [Int] = []

    mutating func push(_ x: Int) { items.append(x) }
    mutating func pop() -> Int? { items.popLast() }
    func peek() -> Int? { items.last }
}

var s = Stack()
s.push(3)
s.push(8)
print(s.pop() ?? -1)
print(s.peek() ?? -1)

출력:

8
3

변경 메서드는 self를 완전히 대체할 수 있으므로 값을 재설정할 때 유용합니다:

struct Score {
    var points = 0
    var bonus = 0

    mutating func reset() {
        self = Score()
    }
}

var s = Score(points: 10, bonus: 3)
s.reset()
print(s.points + s.bonus)

출력:

0
challenge icon

챌린지

쉬움

Wallet 구조체를 완성하세요. add(_:)와 spend(_:)는 변경 가능한 메서드입니다. spend는 남은 금액이 충분할 때만 차감하고, 차감이 이루어졌는지를 반환합니다. report()는 변경 가능한 메서드가 아니며 balance 40을 반환합니다.

제공된 코드는 +n 및 -n 명령을 읽고, 이를 하나의 var 지갑에 적용하며, 지출이 거부되면 denied를 출력하고, 마지막으로 report()를 출력합니다.

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

직접 해보기

// 제공된 입/출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
var wallet = Wallet()
for cmd in input {
    let amount = Int(cmd.dropFirst())!
    if cmd.hasPrefix("+") {
        wallet.add(amount)
    } else if !wallet.spend(amount) {
        print("denied")
    }
}
print(wallet.report())
quiz icon실력 점검

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

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

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