Swift

Class Initializer

728x90

안녕하세요:)

 

오늘은 클래스에서 구현하는 특별한 생성자에 대해서 알아보도록 하겠습니다 +..+

 

1. Class Initializer

  • Designated Initializer(지정 생성자)와 Convenience Initializer(간편 생성자)로 구분됩니다.
  • Designated Initializer는 메인 생성자입니다. 메인 생성자는 클래스가 가진 모든 속성을 초기화해야 합니다.
  • Designated Initializer의 수에는 제한이 없습니다.
  • Convenience Initializer는 다양한 초기화 방법을 구현하기 위한 유틸리티 성격의 생성자입니다.
  • Convenience Initializer는 반드시 모든 속성을 초기화해야 하는 것은 아닙니다. 보통은 필요한 속성만 초기화 한 다음에 클래스에 있는 다른 생성자를 호출해서 나머지 초기화를 완료하도록 구현합니다.
class Position {
   var x: Double
   var y: Double

   init(x: Double, y: Double) {
       self.x = x
       self.y = y
   }
}
// Designated Initializer의 핵심은 하나입니다. 모든 속성을 초기화 해야합니다.
// Convenience Initializer
class Position {
    var x: Double
    var y: Double
    
    init(x: Double, y: Double) {
        self.x = x
        self.y = y
    }
    
    convenience init(x: Double) {
        self.init(x: x, y: 0.0) // y에는 기본값을 전달
    }
}

< 클래스가 상속관계에 포함되어 있는 경우 >

  1. Designated Initializer는 슈퍼클래스의 Designated Initializer를 호출해야 합니다.
  2. 반면 Convenience Initializer는 슈퍼클래스에 있는 Initializer를 직접 호출할 수 없습니다. 반드시 동일한 클래스에 있는 생성자를 호출해서 최종적으로 Designated Initializer가 호출되도록 구현해야 합니다.
class Figure {
    var name: String

    init(name: String) {
        self.name = name
    }

    func draw() {
        print("draw \(name)")
    }
}

class Rectangle: Figure {
    var width: Double
    var height: Double // 0.0으로 초기화
}

// 이니셜라이저는 다른 멤버와 마찬가지로 서브클래스로 상속됩니다.
// 다른 멤버는 조건없이 상속되지만 이니셜라이저는 상속 조건이 까다롭습니다. 기본적으로 슈퍼클래스에서 구현된 이니셜라이저는 서브클래스로 상속되지 않습니다.
class Figure {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    func draw() {
        print("draw \(name)")
    }
    
    convenience init() {
        self.init(name: "unknown")
    }
}

class Rectangle: Figure {
    var width: Double = 0.0
    var height: Double = 0.0// 0.0으로 초기화
    
    init(name: String, width: Double, height: Double) {
        self.width = width
        self.height = height
        super.init(name: name)
    }
    
    override init(name: String) {
        width = 0
        height = 0
        super.init(name: name)
    }
    
    convenience init() {
        self.init(name: "unknown")
    } // 항상 동일한 클래스에 있는 다른 이니셜라이저를 호출합니다. 그리고 슈퍼클래스에 있는 이니셜라이저를 호출하는 것은 불가능합니다. 그래서 오버라이딩이라는 개념이 적용되지 않습니다.
}

 

스위프트는 두 가지 규칙에 따라 이니셜 라이저를 상속합니다.

 

  1. 서브클래스의 모든 속성이 기본값으로 초기화되어 있고 Designated Initializer를 직접 구현하지 않았다면 슈퍼클래스에 있는 모든 Designated Initializer가 상속됩니다.
  2. 서브클래스가 모든 Designated Initializer를 상속받았거나 오버라이딩 했다면 모든 Convenience Initializer가 상속됩니다.
728x90

'Swift' 카테고리의 다른 글

Extension - 1  (0) 2020.12.14
Required Initializer & Failable Initializer  (0) 2020.12.14
Initializer & Memberwise Initializer  (0) 2020.12.07
AnyObject & Overloading  (0) 2020.12.07
Type Casting  (0) 2020.12.07