본문으로 바로가기

생성자의 재정의

- 생성자는 기본적으로 상속이 아닌 재정의 원칙

- 상위 지정생성자는 재정의 필수 고려 (지정생성자, 편의생성자, 재정의 안함 모두 가능)

- 상의 편의생성자는 재정의 불가능

- 지정생성자로 재정의시 현재단계의 모든 저장속성 초기화 및 상위의 지정생성자 호출

- 편의생성자로 재정의시 현재단계의 지정생성자 호출

class Person {
    var id = 10
    var name = "Jimin"
    var age = 24

    init(id: Int, name: String, age: Int) {
        print("super 지정 호출")
        self.id = id
        self.name = name
        self.age = age
    }
}

// 1. 편의생성자로 재정의
class Student: Person {
    var studentId: Int

    init(studentId: Int, id: Int, name: String, age: Int) {
        self.studentId = studentId
        super.init(id: 1, name: "Jimin", age: 24)
    }

    // 편의생성자로 재정의시 현재 단계의 지정생성자 호출
    override convenience init(id: Int, name: String, age: Int) {
        self.init(studentId: 3, id: id, name: name, age: age)
    }
}
class Person {
    var id = 10
    var name = "Jimin"
    var age = 24

    init(id: Int, name: String, age: Int) {
        print("super 지정 호출")
        self.id = id
        self.name = name
        self.age = age
    }
}

// 1. 지정생성자로 재정의
class Student: Person {
    var studentId: Int

    // 지정생성자로 재정의시 부모의 지정생성자 호출
    override init(id: Int, name: String, age: Int) {
        self.studentId = 3
        super.init(id: id, name: name, age: age)
    }
}

- 자식클래스에서 저장속성 기본값 설정 및 어떠한 생성자도 구현 안했을때 지정생성자 자동 상속

- 상위 지정생성자를 모두 상속하는 경우(상위의 지정생성자 모두 재정의) 편의생성자 자동상속

class Person {
    var id = 10
    var name = "Jimin"
    var age = 24

    init(id: Int, name: String, age: Int) {
        self.id = id
        self.name = name
        self.age = age
    }
    
    convenience init() {
        self.init(id: 10, name: "Jimin", age: 24)
    }
}

class Student: Person {
    // 저장속성 기본값 설정
    var studentId: Int = 3
    
    // 어떠한 생성자도 구현 안할시 상위 지정생성자 자동 상속
}

class Person {
    var id = 10
    var name = "Jimin"
    var age = 24

    init(id: Int, name: String, age: Int) {
        self.id = id
        self.name = name
        self.age = age
    }
    
    convenience init(_ coninit: Int) {
        self.init(id: 10, name: "Jimin", age: 24)
    }
}

class Student: Person {
    // 저장속성 기본값 설정
    var studentId: Int = 3
    
    override init(id: Int, name: String, age: Int) {
        super.init(id: 10, name: "Jimin", age: 24)
    }
    // 모든 지정생성자를 재정의하거나 자동상속했을경우 편의생성자도 자동 상속
}