Menu
Coddy logo textTech

초기화 메서드와 super

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

하위 클래스가 기본값 없이 저장 프로퍼티를 추가하면 자체 이니셜라이저가 필요합니다. 먼저 자체 프로퍼티를 설정한 다음 super.init(...)을 사용하여 상위 클래스 이니셜라이저를 호출합니다:

class Animal {
    let name: String
    init(name: String) { self.name = name }
}

class Bird: Animal {
    let canFly: Bool

    init(name: String, canFly: Bool) {
        self.canFly = canFly
        super.init(name: name)
    }
}

let p = Bird(name: "Pip", canFly: false)
print("\(p.name) \(p.canFly)")

출력:

Pip false

순서가 중요합니다. super.init이 실행되기 전에 서브클래스 속성에는 값이 있어야 하며, 상속된 속성은 그 이후에만 사용할 수 있습니다. Swift는 이를 컴파일 시점에 확인합니다:

init(name: String, canFly: Bool) {
    // print(self.name)      // error: self가 super.init 전에 사용됨
    self.canFly = canFly     // 1. 자신의 프로퍼티
    super.init(name: name)   // 2. 슈퍼클래스
    print(self.name)         // 3. 이제 모든 것을 사용할 수 있음
}

서브클래스가 자체 이니셜라이저를 정의하면 슈퍼클래스의 이니셜라이저를 더 이상 상속하지 않습니다. 서브클래스는 매개변수가 같은 이니셜라이저를 재정의하고, override init으로 표시할 수도 있습니다:

class Timer {
    var seconds: Int
    init(seconds: Int) { self.seconds = seconds }
}

class SafeTimer: Timer {
    override init(seconds: Int) {
        super.init(seconds: max(0, seconds))
    }
}

print(SafeTimer(seconds: -5).seconds)
print(SafeTimer(seconds: 30).seconds)

출력:

0
30

계층 구조의 각 수준은 자신의 부분을 초기화하고 나머지는 슈퍼클래스에 넘기므로, 체인의 모든 속성에 정확히 한 번씩 값이 할당됩니다:

class Vehicle {
    let wheels: Int
    init(wheels: Int) { self.wheels = wheels }
}

class Car: Vehicle {
    let seats: Int
    init(seats: Int) {
        self.seats = seats
        super.init(wheels: 4)
    }
}

class Taxi: Car {
    let company: String
    init(company: String) {
        self.company = company
        super.init(seats: 5)
    }
}

let t = Taxi(company: "City Cabs")
print("\(t.company): \(t.wheels) wheels, \(t.seats) seats")

출력:

City Cabs: 4 wheels, 5 seats
challenge icon

챌린지

쉬움

Product는 name과 price(센트 단위)를 저장합니다. 저장 프로퍼티 percent를 가진 서브클래스 DiscountedProduct를 선언하세요. 이니셜라이저는 name, price, percent를 인수로 받고, percent를 저장한 다음 백분율만큼 이미 할인된 가격(내림 처리)을 사용하여 super.init을 호출해야 합니다. 0-100 범위를 벗어나는 percent는 0으로 처리합니다. DiscountedProduct에 label() 메서드를 추가하여 tea: 450 (10% off)를 반환하도록 하세요.

제공된 코드는 name,price,percent 형식의 줄을 읽고, 각 줄에 대해 DiscountedProduct를 생성한 다음 label()을 출력합니다.

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

직접 해보기

// 제공된 입력/출력 코드: 그대로 유지하세요
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in input {
    let p = line.split(separator: ",").map { String($0) }
    let item = DiscountedProduct(name: p[0], price: Int(p[1])!, percent: Int(p[2])!)
    print(item.label())
}
quiz icon실력 점검

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

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

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