init(frame:) / init(coder:) / required init

JG Ahn·2024년 12월 17일

UIKit

목록 보기
2/4
post-thumbnail

init(frame:)init(coder:) 이니셜라이저는 UIKit에서 UI를 구현할때 Xcode에서 오류 문구를 표시하면 생성하거나 습관처럼 작성했었다. 그래서 어떤 이유로 사용을 하는지 알고 써야겠다는 생각이 들었다.

init(frame:)

init(frame:)은 사각형 프레임의 뷰의 인스턴스를 생성할 때 centerbounds라는 속성을 설정한다고 한다.

center는 사각형의 중앙을 나타낸다는 알 수 있는데 그렇다면 bounds는 무엇일까?

bounds는 뷰의 위치와 크기를 해당 뷰의 자체 좌표계로 설명하는 경계 사각형이라고 한다.

덧붙여서 init(frame:)은 스토리보드, xib, nib 같은 인터페이스 빌더를 사용하지 않고 코드베이스로 UIView Calss의 View object를 만들기 위해 지정된 이니셜라이저라고 한다.

현재 코드베이스로 UI구현을 하고 있기에 더 자주 사용하게 될 것 같다.

init(coder:)

애플 공식문서에 수많은 정의가 있는데 몇개를 해석해봤다.

- Unarchiver에 있는 데이터를 사용하여 뷰 컨트롤러를 생성한다
  • 주어진 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:)을 구현하지 않아도 된다.

0개의 댓글