TIL: 필수 생성자(Required Initializers)

Royce·2025년 3월 23일

Swift 문법

목록 보기
37/63

필수 생성자

  • 필수 생성자 (Required Initializer) 는 클래스에서 반드시 구현해야 하는 생성자를 의미한다
  • 하위 클래스에서도 이 생성자를 반드시 구현하도록 강제할 때 사용된다
  • 클래스의 생성자 앞에 required 키워드를 붙여 선언한다

필수 생성자 정의 방법

  • required init() 또는 required init(parameters) 형태로 정의한다
  • 하위 클래스에서 이 필수 생성자를 구현할 때는 required 키워드를 반드시 포함해야 한다
  • override 키워드는 필요하지 않다 (required 키워드가 이미 강제성을 부여하기 때문이다)

필수 생성자 정의와 구현

// 상위 클래스 정의
class Animal {
    var name: String
    
    // 필수 생성자 - 모든 하위 클래스에서 반드시 구현해야 함
    required init(name: String) {
        self.name = name
    }
}

// 하위 클래스 정의 (자동 상속 발생)
class Dog: Animal {
    // 필수 생성자를 구현하지 않아도 자동 상속된다 (다른 지정 생성자가 없기 때문)
}

// 자동 상속된 필수 생성자 사용 예제
let myDog = Dog(name: "Buddy")
print("My dog's name is \(myDog.name)")  // 출력: My dog's name is Buddy
  • Animal 클래스는 name이라는 저장 속성을 가진다
  • required init(name:) 생성자는 필수 생성자로 선언되어 있다
  • Dog 클래스는 Animal 클래스를 상속하지만, 생성자를 구현하지 않아도 자동으로 상속된다
  • 자동 상속이 발생한 이유는 Dog 클래스에서 다른 지정 생성자를 정의하지 않았기 때문이다
  • 필수 생성자가 하위 클래스에서도 자동으로 상속된다

필수 생성자를 재정의하는 경우

// 상위 클래스 정의
class Vehicle {
    var brand: String
    
    // 필수 생성자 - 모든 하위 클래스에서 반드시 구현해야 함
    required init(brand: String) {
        self.brand = brand
    }
}

// 하위 클래스 정의
class Car: Vehicle {
    var model: String
    
    // 새로 추가된 지정 생성자
    init(brand: String, model: String) {
        self.model = model
        super.init(brand: brand)
    }
    
    // 필수 생성자 재정의 - required 키워드를 반드시 사용해야 함
    required init(brand: String) {
        self.model = "Unknown Model"
        super.init(brand: brand)
    }
}

// 필수 생성자 사용 예제
let myCar = Car(brand: "Toyota")
print("My car is a \(myCar.brand) \(myCar.model)")  // 출력: My car is a Toyota Unknown Model
  • Vehicle 클래스는 brand라는 저장 속성을 가진다
  • required init(brand:) 생성자는 필수 생성자로 선언되었다
  • Car 클래스는 Vehicle 클래스를 상속하며, model이라는 추가 저장 속성을 가진다
  • Car 클래스에서 새로운 지정 생성자 init(brand:model:)을 정의했기 때문에 자동 상속 규칙이 깨진다
  • 따라서 required init(brand:)를 하위 클래스에서 반드시 구현해야 한다
  • 필수 생성자 재정의 시에는 override 키워드를 사용하지 않고 required 키워드만 사용한다

UIView의 필수 생성자 사용 예제

import UIKit

// 상위 클래스 정의 (UIView 상속)
class CustomView: UIView {
    
    // 필수 생성자 - Interface Builder에서 사용할 때 반드시 구현되어야 함
    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
    
    // 지정 생성자 - 프로그래밍 방식으로 뷰를 초기화할 때 사용
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
}

// 하위 클래스 정의
class RoundedView: CustomView {
    
    var cornerRadius: CGFloat
    
    // 새로운 지정 생성자 정의
    init(frame: CGRect, cornerRadius: CGFloat) {
        self.cornerRadius = cornerRadius
        super.init(frame: frame)
        self.layer.cornerRadius = cornerRadius
    }
    
    // 필수 생성자 구현 (필수적)
    required init?(coder: NSCoder) {
        self.cornerRadius = 0
        super.init(coder: coder)
    }
}
  • UIView 클래스는 required init?(coder:)라는 필수 생성자를 가지고 있다
  • CustomView 클래스는 이 필수 생성자를 구현해야 하며, 그렇지 않으면 컴파일 오류가 발생한다
  • RoundedView 클래스는 cornerRadius라는 새로운 저장 속성을 추가한다
  • RoundedView 클래스에서 init(frame:cornerRadius:)라는 새로운 지정 생성자를 정의했다
  • 자동 상속 규칙이 깨졌으므로, required init?(coder:)를 반드시 구현해야 한다
  • required init?(coder:)Interface Builder와 관련된 필수 생성자로, 필수적으로 구현해야 한다
  • 만약 Interface Builder 사용을 지원하지 않으려면 fatalError()로 구현할 수도 있다

필수 생성자의 자동 상속 조건

자동 상속이 발생하는 경우

  • 하위 클래스에서 다른 지정 생성자를 정의하지 않은 경우 (상위 클래스의 필수 생성자가 자동 상속됨)

자동 상속이 발생하지 않는 경우

  • 하위 클래스에서 새로운 지정 생성자를 정의한 경우
  • 이 경우, 하위 클래스에서 필수 생성자를 반드시 구현해야 한다 (required init())

요약

  1. 필수 생성자 (required)는 상속된 클래스에서 반드시 구현되어야 한다
  2. 필수 생성자가 자동으로 상속되는 경우
    • 하위 클래스에서 다른 지정 생성자를 정의하지 않은 경우
  3. 필수 생성자가 자동으로 상속되지 않는 경우
    • 하위 클래스에서 새로운 지정 생성자를 정의한 경우
  4. UIView의 필수 생성자
    • required init?(coder:)Interface Builder 사용 시 반드시 구현해야 한다
profile
iOS 개발자 지망생

0개의 댓글