Menu
Coddy logo textTech

메서드 오버라이딩

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

하위 클래스는 상속된 메서드를 자체 버전으로 대체할 수 있습니다. 실수로 메서드를 대체하는 것을 방지하려면 override 키워드가 필요합니다:

class Animal {
    func sound() -> String { "..." }
}

class Dog: Animal {
    override func sound() -> String { "Woof" }
}

class Cat: Animal {
    override func sound() -> String { "Meow" }
}

print(Dog().sound())
print(Cat().sound())
print(Animal().sound())

출력:

Woof
Meow
...

super.method()는 재정의된 메서드 내부에서 슈퍼클래스 버전을 호출하므로, 서브클래스는 상속된 동작을 모두 대체하는 대신 여기에 기능을 추가할 수 있습니다:

class Report {
    func text() -> String { "Sales: 120" }
}

class SignedReport: Report {
    override func text() -> String {
        super.text() + " (signed by Ada)"
    }
}

print(SignedReport().text())

출력:

Sales: 120 (signed by Ada)

계산된 프로퍼티도 override var를 사용하여 재정의할 수 있습니다:

class Shape {
    var sides: Int { 0 }
    var summary: String { "\(sides) sides" }
}

class Triangle: Shape {
    override var sides: Int { 3 }
}

print(Triangle().summary)

출력:

3 sides

재정의된 메서드는 상속된 코드에서 호출될 때에도 실행됩니다. 위의 summary는 Shape에 작성되어 있지만 Triangle의 sides를 사용합니다. Swift는 항상 실제 객체의 버전을 호출하며, 이것이 재정의를 유용하게 만드는 이유입니다:

class Greeter {
    func name() -> String { "someone" }
    func greet() -> String { "Hello, \(name())" }
}

class AdaGreeter: Greeter {
    override func name() -> String { "Ada" }
}

let g: Greeter = AdaGreeter()
print(g.greet())

출력:

Hello, Ada
challenge icon

챌린지

쉬움

Notification에는 [info] text를 반환하는 render() 메서드가 있습니다. render()가 [warn] TEXT(텍스트를 대문자로 변환)를 반환하는 하위 클래스 Warning과, 저장된 minutes를 추가하고 super를 사용하여 상위 클래스의 결과 뒤에 (in 10 min)을 붙여 반환하는 Reminder를 선언하세요.

제공된 코드는 info,text, warn,text 또는 remind,text,10 형식의 줄을 읽고, Notification 배열에 올바른 객체를 생성한 뒤 각 객체에 대해 render()를 출력합니다.

코드는 Notification.swift, Warning.swift 및 Reminder.swift에 작성하세요. main.swift에는 제공된 입력/출력 코드가 있으며 편집할 수 없습니다.

직접 해보기

// 제공된 입력/출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
var all: [Notification] = []
for line in input {
    let p = line.split(separator: ",").map(String.init)
    switch p[0] {
    case "warn": all.append(Warning(text: p[1]))
    case "remind":
        let r = Reminder(text: p[1])
        r.minutes = Int(p[2])!
        all.append(r)
    default: all.append(Notification(text: p[1]))
    }
}
for n in all { print(n.render()) }
quiz icon실력 점검

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

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

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