init(frame:)와 init(coder:) 이니셜라이저는 UIKit에서 UI를 구현할때 Xcode에서 오류 문구를 표시하면 생성하거나 습관처럼 작성했었다. 그래서 어떤 이유로 사용을 하는지 알고 써야겠다는 생각이 들었다.
init(frame:)
init(frame:)은 사각형 프레임의 뷰의 인스턴스를 생성할 때 center와 bounds라는 속성을 설정한다고 한다.
center는 사각형의 중앙을 나타낸다는 알 수 있는데 그렇다면 bounds는 무엇일까?

bounds는 뷰의 위치와 크기를 해당 뷰의 자체 좌표계로 설명하는 경계 사각형이라고 한다.
덧붙여서 init(frame:)은 스토리보드, xib, nib 같은 인터페이스 빌더를 사용하지 않고 코드베이스로 UIView Calss의 View object를 만들기 위해 지정된 이니셜라이저라고 한다.
현재 코드베이스로 UI구현을 하고 있기에 더 자주 사용하게 될 것 같다.
init(coder:)
애플 공식문서에 수많은 정의가 있는데 몇개를 해석해봤다.
- Unarchiver에 있는 데이터를 사용하여 뷰 컨트롤러를 생성한다
Unarchiver는 직렬화된 데이터를 복원하거나 해제하는 과정에서 사용되는 도구라고 한다.
이에따라 init(coder:)가 어떤 용도인지 간략히 생각해본다면 '직렬화된 데이터를 사용해서 뷰 컨트롤러 또는 뷰를 초기화 한다' 정도로 추측할 수 있겠다.
required init
required init는 말 그대로 필수 생성자이다. 부모클래스의 관점에서 봤을때 자식클래스에서 반드시 생성해야할 생성자가 있다면 required init을 사용하는 것 같다.
부모클래스에서 required init을 정의한 경우 자식클래스가 부모클래스의 생성자를 상속받지 않는 한 자식클래스에 반드시 required init을 구현해주어야 한다는 뜻이다.
만약 부모클래스의 필수 생성자를 자식클래스에서 구현하지 않으면 에러가 발생한다.
class Parent {
var name: String?
required init(name: String) {
self.name = name
}
}
class Child: Parent {
var nickName: String
init(nickName: String) {
self.nickName = nickName
super.init(name: "")
}
}//erorr! 'required' initializer 'init(name:)' must be provided by subclass of 'Parent'
그래서 UI를 구현하면서 자주 사용한 required init에 fatalError가 들어간 그 코드를 사용하면 된다.
required init(name: String) {
fatalError("init(name:) has not been implemented")
}
그런데, 필수생성자를 사용하지 않아도 되는 예외적인 상황이 있다고 한다.
부모클래스의 모든 프로퍼티가 기본값을 가지고 있을 경우 자식클래스가 지정생성자를 따로 작성하지 않으면 부모클래스의 지정생성자를 모두 상속받는다. 이때 자식클래스는 더 구현해야할 생성자가 굳이 없기 때문에 required init(name:)을 구현하지 않아도 된다.