iOS

[iOS] [Swift] Convenince init

Jeongsuu 2020. 10. 7. 20:41

convenience init

 

Swift에서 이용되는 init은 다른 언어에서의 init과 같이 동일하게 생성자 역할을 하며 designated initconvenience init으로 나뉘어진다.

 

우리가 일반적으로 쓰는 init()designated init이다.

 

designated init은 반드시 1개는 있어야 하고, convenience init은 말 그대로 보다 유연하고 간편하게 쓰려고 만드는 생성자다.

 

class Person {
    var name: String
    var age: Int
    var height: Int
    var weight: Int

    init(name: String, age: Int, height: Int, weight: Int) {
        self.name = name
        self.age = age
        self.height = height
        self.weight = weight
    }
}

 

위 예시가 우리가 일반적으로 사용하던 designated init이다.

 

이 init은 클래스 내 모든 프로퍼티를 의무적으로 초기화 시켜줘야 한다.

 

만일, 프로퍼티 중 단 한가지라도 초기화시켜주지 않으면 에러를 뿜는다..

 

image


(요로코롬..)

 

그렇다면 convenience init은 어떤 기능을 제공하는지 살펴보자!

 

convenience initdesignated init을 보조하는 보조 생성자 역할을 한다.

 

designated init의 파라미터 중 일부를 기본값으로 가지도록 하여 convenience init 내부에서 designated init을 호출하도록 한다.

 

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

 

class Person {
    var name: String
    var age: Int
    var height: Int
    var weight: Int

    init(name: String, age: Int, height: Int, weight: Int) {
        self.name = name
        self.age = age
        self.height = height
        self.weight = weight
    }

    convenience init(age: Int, height: Int, weight: Int) {
        self.init(name: "기본값", age: age, height: height, weight: weight)
    }
}

 

이와 같이 기존의 designated init에서 name 프로퍼티를 기본값으로 갖도록 하는 convenience init을 만들어서 사용할 수 있다.

 

image

 

이와 같이 사용하면 당연히 파라미터로 넘겨주지 않은 데이터는 기본값을 갖는 인스턴스로 생성된다.

 

image

// 아무개
// 기본값

 

결과적으로 convenience init을 사용하면 designated innit을 보조하는 역할로서 이를 기반으로 하여 재사용성에 이점을 가져갈 수 있다.