[ios] Designated init (init) 과 convenience init의 차이점은?

장일규·2022년 3월 31일

Swift

목록 보기
1/1
post-thumbnail

Swift의 이니셜라이저! init과 convenience init의 차이점에 대해서 알아보고자 합니다.

Initialization(초기화)메서드 특성

  init([param]: [type]) {
    // 실행할 코드
  }
  • init은 생성자이다.
  • 초기화 관련 메서드의 이름은 init이다.
  • init메소드에 매개변수의 개수, 이름, 타입은 개발자가 optional Type을 제외한 모든 저장 프로퍼티에 값을 가지고 있어야한다.

Designated init (init)

designated init은 클래스의 모든 저장 프로퍼티가 반드시 초기화 되어야한다.

정식 이름은 Designated init(지정 이니셜라이저)라고 부르지만, 너무 길고 부르기 힘들기에 init이라고 사용한다.

class Student {
    var name: String
    var hakbun: Int
    var gender: String
    var isPhone: Bool
    
    init(name: String, hakbun: Int, gender: String, isPhone: Bool) {
        self.name = name
        self.hakbun = hakbun
        self.gender = gender
        self.isPhone = isPhone
    }
}

Student(학생)이라는 클래스가 있습니다.

각 학생은 이름, 학번, 나이는 필수적으로 필요하겠죠?

핸드폰이 있는지 확인하는 isPhone저장 프로퍼티에 경우에는 의무는 아니지만 Designated init은 반드시 모든 저장 프로퍼티를 초기화해주어야하기 때문에 추가 하였습니다.

init함수에 지정한 name, hakbun, gender, isPhone 저장 프로퍼티에 대한 값을 초기화 해줍니다.

만약, Designated init (init)에서 프로퍼티를 한 개라도 빼먹게 된다면..

만약, designated init의 파라미터 중 일부를 기본값으로 설정하고 싶습니다.

isPhone경우에는 기본 값을 false로 하고 싶어서 제외했습니다.

하지만, 위와 같이 Return from initializer without initializing all stored properties 오류를 발생합니다.

이 경우에는 convenience init안에서 Designated init을 호출하여 초기화를 진행할 수 있습니다.

Convenience init

convenience init안에 designated init을 호출하여 초기화를 할 수 있습니다..

convenience init을 사용하기 위해서는 반드시 designated init이 먼저 선언되어야 한다.

convenience init은 같은 클래스에서 다른 이니셜라이저를 호출해야한다.

class Student {
    var name: String
    var hakbun: Int
    var gender: String
    var isPhone: Bool
    
    init(name: String, hakbun: Int, gender: String, isPhone: Bool) {
        self.name = name
        self.hakbun = hakbun
        self.gender = gender
        self.isPhone = isPhone
    }
    
    convenience init(name: String, hakbun: Int, gender: String) {
        self.init(name: name, hakbun: hakbun, gender: gender, isPhone: false)
    }
}

따라서, 파라미터로 넘겨주지 않은 값은 그냥 임의로 지정해주고 파라미터로 넘어간 것들만 넣어주면 되는 것이다.

0개의 댓글