지정생성자/ 편의생성자 상속과 재정의 규칙

쏘스야·2023년 4월 16일
0

ios 개발자의 첫걸음

목록 보기
56/61
/**
 지정 생성자 / 편의 생성자 상속과 재정의 규칙
 */


class Aclass {
    var x = 0
    
    // init() {}        // 기본 생성자가 자동으로 생성
}

let a = Aclass()
print("a : \(a.x)")


// 상위의 지정생성자 🤙🏻
// init()

class Bclass: Aclass {
    
    var y: Int
    
    
    // 선택-1 : 지정생성자로 재정의
    override init() {       // 상위 클래스와 "이름이 동일한 생성자" 구현은 재정의만 가능함 (올바른 재정의) (지정생성자로 구현)
        self.y = 0
        super.init()
    }
    
    
    // 선택-2 : 서브 클래스에서 편의 생성자로 구현해보기
    // 상위 클래스와 "이름이 동일한 생성자" 구현은 재정의만 가능함(올바른 재정의) (지정생성자 필요)
//    override convenience init() {
//        self.init(y: 0)
//    }
    
    // 선택-3 : 재정의 하지 않을 수도 있다.
    
    
    // 선택-2,3 포함 (현재 단계의) 생성자 구현
    init(y: Int) {
        self.y = y
        super.init()
    }
}


let b = Bclass()
print("b 출력해보기 b.x : \(b.x), b.y: \(b.y)")


// 상위의 지정생성자 🤙🏻
//init()
//init(y: Int)

class Cclass: Bclass {
    
    var z: Int
    
    override init() {       // 상위 클래스와 "이름이 동일한 생성자" 규현 (올바른 재정의)
        self.z = 0
        super.init()        // 2단계 값설정(커스텀)없고, 상위구현에 기본 init() 만 있는 경우 생략가능 (암시적 요청)
    }
    
    override init(y: Int) {
        self.z = 0
        super.init(y: y)
    }
    
    init(z: Int) {
        self.z = z
        super.init()        // 2단계 값설정(커스텀)없고, 상위구현에 기본 init() 만 있는 경우 생략가능 (암시적 요청)
    }
}



/**
 애플 공식 문서의 예제로 복습
 */

class Vehicle {
    var numberOfWheels = 0
    
    var description: String {
        return "\(numberOfWheels) wheel(s)"
    }
    
    // init() {}
}


// numberOfWheels 의 저장 속성에 기본값을 제공, 생성자 구현하지 않았으므로
// ==> 기본 생성자 init() 자동제공


let vehicle = Vehicle()
print("Vehicle : \(vehicle.description)")

// 상위의 지정생성자 🤙🏻
// init()


// 서브클래스 정의

class Bicycle: Vehicle {
    
    
    
    override init() {
//        numberOfWheels = 2    // 수퍼클래스 호출 후에 사용해야함 : 에러
        super.init()          // 수퍼클래스 호출 반드시 필요
        numberOfWheels = 2    // 초기화 2단계 값설정
    }
}



// 서브클래스 정의

class HoverBoard: Vehicle {
    var color: String
    
    // (읽기) 계산 속성 재정의
    override var description: String {
        return "\(super.description) in a beautiful \(color)"
    }
    
    // 편의 생성자로 구현
//    override convenience init() {
//        self.init(color: "빨간색")
//    }
    
    // 방법 1
//    override init() {
//        self.color = "빨간색"
//        super.init()
//    }
    
    // 방법 2
    init(color: String) {
        self.color = color  // (현재 클래스) 저장 속성 초기화
        super.init()        // ==> 여기서 암시적으로 호출됨
    }
}


let hoverBoard = HoverBoard(color: "silver")
print("HoverBoard : \(hoverBoard.description)")

profile
개발자

0개의 댓글