생성자

조현우·2022년 6월 30일
0

구조체의 생성자

구조체 생성자의 종류에는 지정 생성자가 있다.
아래는 지정 생성자의 특징이다.

  • init( ... )의 형태를 갖는다
  • 모든 저장 속성을 초기화해야 한다
  • 오버로딩이 가능하다
  • 모든 저장 속성이 초기화 되는 경우, 기본 생성자를 자동으로 제공한다
  • 생성자를 1개 이상 구현하면 기본 생성자를 제공하지 않는다

구조체는 지정 생성자만 존재하고 편의 생성자가 없기 때문에 아래와 같은 생성자 문법만 사용가능하다.
구조체(값타입)의 경우 아래와 같이 생성자에서 다른 생성자를 호출할 수 있다.

struct Color1 {
	let red, green, blue: Double
    
    // 지정 생성자
    init() {
    	// red = 0.0
        // green = 0.0
        // blue = 0.0
        // 구조체는 다른 생성자를 호출할 수 있다
        self.init(red: 0.0, green: 0.0, blue: 0.0)
    }
    
    // 지정 생성자
    init(white: Double) {
    	// red = white
        // green = white
        // blue = white
        // 구조체는 다른 생성자를 호출할 수 있다
        self.init(red: white, green: white, blue: white)
    }
    
    // 지정 생성자
    init(red: Double, green: Double, blue: Double) {
    	self.red = red
        self.green = green
        self.blue = blue
    }
}

구조체의 지정 생성자에서 다른 지정 생성자를 호출하는 방식으로 구현할 경우 프로퍼티 값을 중복 초기화 하는 경우가 없어 개발단계 또는 유지보수할때 문제 발생 가능성이 줄어든다. 그래서 이와 같은 방식으로 생성자를 사용하게 된다.


클래스의 생성자

클래스의 경우 지정 생성자와 편의 생성자 모두 사용가능하다.
지정 생성자는 구조체와 동일하므로 편의 생성자의 특징만 알아보겠다.

  • 개발자가 편하게 초기화하기 위해 생성자를 응용해서 사용할 수 있도록 만든 서브 개념의 생성자
  • 편의 생성자는 지정 생성자에 의존적이다(지정 생성자 없이 모든 저장 속성을 초기화하지 못한다)
  • 가능한 지정 생성자의 갯수를 줄이고, 편의 생성자에서 지정 생성자를 호출하도록 하는것이 바람직하다
  • 상속시 서브클래스에서 재정의 할 수 없다
  • 편의 생성자는 다른 편의 생성자를 호출하거나, 지정 생성자를 호출해야 한다(궁극적으로 지정생성자를 호출하는쪽으로 개발해야 한다)

모든 프로퍼티를 초기화 하는 지정 생성자가 있다면 편의 생성자를 이용해 생성자를 구성하는 것을 권장한다. 생성자의 중복을 없애고 다른 지정 생성자를 호출하는 패턴을 이용하는것이 복잡도나 실수를 줄일 수 있기 때문이다.

class Color2 {
	let red, green, blue: Double
    
    // 편의 생성자
    convenience init() {
        self.init(red: 0.0, green: 0.0, blue: 0.0)
    }
    
    // 편의 생성자
    convenience init(white: Double) {
        self.init(red: white, green: white, blue: white)
    }
    
    // 지정 생성자 
    init(red: Double, green: Double, blue: Double) {
    	self.red = red
        self.green = green
        self.blue = blue
    }
}
profile
현우

0개의 댓글