객체를 생성하는 메서드인 생성자(initializer)
일반적으로 객체는 클래스를 통해 추상화된 형태로서 이를 실제로 사용하기 위해는 메모리에 올라가는 인스턴스를 만들어줘야 한다. 생성자(initializer)는 이러한 객체의 인스턴스를 만들어주는 것이다.
(단, Swift에서는 클래스 뿐만 아니라 struct에서도 생성자를 지원해준다.)
위와 같은 일련의 과정을 초기화라고 하는데 초기화의 목적은 모든 저장 프로퍼티들의 초기값을 설정해주는 데에 있으며, 종류는 지정 초기자(Designated init)와 편의 초기자(Convenience init) 두 가지이다.
class Person{
var name: String
var address: String
var phoneNumber: Int
init(name: String, address: String, phoneNumber: Int){
self.name = name
self.address = address
self.phoneNumber = phoneNumber
}
보통 우리가 말하는 init이 지정 초기자를 말하는 것으로 내부의 모든 프로퍼티들이 초기화 될 수 있도록 만들어주는 작업을 도맡는다. 따라서 지정 초기자는 위의 코드와 같이 하나의 프로퍼티라도 초기화가 되지 않을 경우에는 오류가 발생하게 된다.
위에서 언급한 지정 초기자와 달리 보조적인 역할을 맡은 이니셜라이저이다. 해당 이니셜라이저는 보조이기 때문에 메인인 지정 초기자를 내부에서 필수적으로 호출해야 된다. 설명을 들으면 매우 귀찮은 존재로서 굳이 필요한가라는 의문이 들 수 있지만, 아래의 예시와 같이 넘겨받는 인자 값이 없더라도 객체의 초기화가 가능한 편리함을 제공해준다.
class Person{
var name: String
var address: String
var phoneNumber: String
init(name: String, address: String, phoneNumber: String){
self.name = name
self.address = address
self.phoneNumber = phoneNumber
}
convenience init(name: String, address: String){
self.init(name: name, address: address, phoneNumber: "None")
}
위의 코드와 같이 필수적인 정보가 아닐 경우에는 사용자의 피로감을 덜기 위해서 몇가지 정보를 빼고 작성해도 충분히 해당 데이터들의 객체를 생성해줄 수 있어야 한다. 그렇다고 지정 초기자에 임의 값을 주었다가는 모든 정보를 기입한 사용자의 정보가 제대로 초기화되지 않을 것이다.
즉, 이런 상황에서 요긴하게 사용될 수 있는 것이 편의 초기자인 것이다.