본문으로 바로가기

지정생성자

- init(...) { } 의 형태를 가지는 생성자

- 지정생성자는 모든 저장속성을 초기화해야함

- 모든 저장속성이 초기화되는 경우 따로 지정하지 않아도 기본생성자 자동으로 제공

- 오버로딩 가능

class Color {
    var red: Double
    var blue: Double
    var green: Double
    
    // 지정생성자
    // 모든 저장속성을 초기화 한다
    init(red: Double, blue: Double, green: Double) {
        self.red = red
        self.blue = blue
        self.green = green
    }
}

class Color1 {
    var red: Double = 0.0
    var blue: Double = 0.0
    var green: Double = 0.0
    
//  모든 저장속성에 초기값이 있을경우 기본생성자 자동제공
//  init() { }
}

생성자에서 생성자 호출

- 구조체에서는 생성자에서 다른 생성자를 호출가능

- 클래스에서는 다른 생성자를 호출하고 싶은경우 편의생성자를 이용해야함

struct Color { // 구조체
    var red: Double
    var blue: Double
    var green: Double
   
    init(red: Double, blue: Double, green: Double) {
        self.red = red
        self.blue = blue
        self.green = green
    }
    
    init(white: Double) {
    	// 다른 생성자를 호출할수 있다
        // 클래스에선 오류남
        self.init(red: white, blue: white, green: white)
    }
}

편의생성자

- 지정생성자보다 적은 개수의 파라미터로 편리하게 생성하기 위한 생성자

- 편의생성자는 지정생성자에 의존

- 그렇기때문에 편의생성자는 반드시 다른 편의생성자 혹은 지정생성자를 호출해야함

  (궁극적으로는 지정생성자 호출)

- 클래스에서만 사용가능하며 convenience 키워드를 붙여서 사용

class Color {
    var red: Double
    var blue: Double
    var green: Double
    
    init(red: Double, blue: Double, green: Double) { // 지정생성자
        self.red = red
        self.blue = blue
        self.green = green
    }
    
    convenience init(white: Double) { // 편의생성자
        // 받아온 파라미터값으로 지정생성자를 호출하여 초기화하고있다
        self.init(red: white, blue: white, green: white)
    }
    
    convenience init() { // 편의생성자
        // init(white:) (편의생성자) 를 호출하고 있다
        // init(white:)에서 지정생성자를 호출하기 때문에
        // 궁극적으론 지정생성자를 호출하게 된다
        self.init(white: 0.5)
    }
}