SwiftFrequency / iOSInterview

 iOS 개발자로 취업할 때 알아야 할 모든 것
20 stars 1 forks source link

Convenience init에 대해 설명하시오. #24

Closed Taehyeon-Kim closed 2 years ago

heerucan commented 2 years ago

Convenience Initializers 편리한 초기자 (보조 이니셜라이저)

편리한 초기자는 초기화 단계에서 미리 지정된 값을 사용해 초기화를 할 수 있게 하는 초기자이다. 지정 초기자의 파라미터 일부를(나머지는 지정초기자에게 위임) 기본값으로 설정해서 초기화 단계에서 지정 초기자를 호출하여 초기화를 진행할 수도 있기 때문에 항상 지정 초기자가 먼저 선언되어야 한다.

convenience init(parameters) {
    statements
}

정리링크

hyesuuou commented 2 years ago

init에는 designated init과 convenience init이 있다.

그 중 Convenience init은 보조 이니셜라이저로, 내부에서 같은 클래스의 designated init을 호출하여 클래스의 원래 이니셜 라이저를 도와주는 역할을 한다. Convenience init은 모든 프로퍼티를 받아야 하는 designated init과 달리, 필요한 부분만 파라미터로 받아서 초기화할 수 있다.

// Designated init
init(parameters) {
  // 실행할 코드
}

// Convenience init
convenience init(parameters) {
    // 실행코드
}

https://spark-chive-e55.notion.site/Swift-Init-d03c3f9524984d7baad6bf00aef61721

dlwns33 commented 2 years ago

Designated init은 Swift의 초기화 이니셜라이저이다. init은 클래스의 모든 프로퍼티가 초기화 될 수 있도록 해줘야한다. 이름은 Designated init(지정 이니셜라이저)이지만, init으로 쓴다.

class Person {

    var name: String

    var age: Int

    var gender: String

    init(name: String, age: Int, gender: String) {

        self.name = name

        self.age = age

        self.gender = gender

    }

}

init의 파라미터에서 클래스 프로퍼티가 하나라도 빠지게되면, 오류가 나게 된다. 그렇다면 convenience init은 "보조 이니셜라이저"이다.
convenience init을 사용하려면 Designated init이 꼭 먼저 선언되어야한다.

class Person {

    var name: String

    var age: Int

    var gender: String

    init(name: String, age: Int, gender: String) {

        self.name = name

        self.age = age

        self.gender = gender

    }

    convenience init(age: Int, gender: String) {

        self.init(name: "zedd", age: age, gender: gender)

    }

}

파라미터로 넘겨주지 않은 값은 임의로 지정하며, 파라미터로 넘어간 것들만 넣어주면 된다.

Taehyeon-Kim commented 2 years ago

convenience init(편의 이니셜라이저)는 추가적인 초기화 작업을 할 수 있도록 도와주는 보조 이니셜라이저이다.

designated init(지정 이니셜라이저)는 객체 안의 모든 프로퍼티가 초기화 될 수 있도록 해주는 이니셜라이저라고 한다면 편의 이니셜라이저는 그 이외에 입맛대로 초기화 작업을 할 수 있도록 도와준다.

주의해야할 점은 convenience init을 사용할 때에는 내부에 같은 객체 레벨의 다른 이니셜라이저를 호출해야 한다.