[Effective Objective-C] #16 지정 초기화 메서드를 만들라
출처 : Effective Objective-C
-
객체가 제대로 동작하기 위해 필요한 정보를 객체에 주는 초기화 메서드를 지정 초기화 메서드(designated initializer) 라고 한다.
-
클래스의 인스턴스를 생성하는 방법이 한 가지 이상이 있는 클래스는 하나 이상의 초기화 메서드가 있을 것이다.
초기화 메서드가 여러 개 있는 것도 괜찮지만, 모든 초기화 메서드가 호출하는 한 가지 지정 초기화 메서드가 있는 것이 더 좋다.
-
지정 초기화 메서드가 있다는 것은 나머지 초기화 메서드들이 이 지정 초기화 메서드를 호출함을 뜻한다.
-
지정 초기화 메서드는 객체 내부 데이터를 저장하는 유일한 곳이다.
객체의 데이터를 저장하는 데이터 저장소가 특정 이유로 다른 것으로 변경되었을 때 이 메서드만 변경하면 된다.
-
지정 초기화 메서드의 연결(chain)은 유지 보수에 중요하다.
-
하위 클래스에 다른 이름의 지정 초기화 메서드가 있다면 해당 상위 클래스의 지정 초기화 메서드를 항상 재정의해야 한다.
-
때때로 상위 클래스의 지정 초기화 메서드를 재정의하면 적절한 결과를 내지 못하기 때문에 지정 초기화 메서드를 재정의하기 원하지 않을 수도 있다.
지정 초기화 메서드를 재정의하는 일반적인 방법은 예외를 던지게 하는 것이다.
-(id)init{
@throw [NSException exceptionWithName:NSInternalInconcsistencyException reason:@“Must use designated initializer” userInfo:nil];
}
이는 가혹한 방법 같지만 가끔 필요한 방법이다.
불일치(inconsistent)한 내부 데이터를 가진 객체가 생성되는 것을 막기 위해서다.
-
오브젝티브-C 에서 예외를 던지는 것은 심각한 에러를 의미한다.
초기화 메서드에서 예외를 던지는 것은 인스턴스가 다른 방법으로 초기화할 수 없을 경우에만 쓰는 최후의 방법이어야 한다.
-
몇몇 상황에서는 하나 이상의 지정 초기화 메서드가 필요하다.
이러한 상황은 객체의 인스턴스가 두 가지 서로 다른 방법으로 생성되고 각각 구별되어 다루어져야만 하는 상황이다.
이것의 예는 객체가 인코딩되고 디코딩될 수 있게 하는 직렬화 기술인 NSCoding 프로토콜이다.
-
모든 초기화 메서드가 상위 클래스의 초기화 메서드와 연결되어 있는 것처럼 우리가 초기화 메서드를 기술할 때도 이 법칙을 따라야 한다.
-
상위 클래스에 여러개의 지정 초기화 메서드가 있는 경우에,
하위 클래스가 지정 초기화 메서드를 호출 만들면서 모두 자기가 만든 초기화 메서드를 호출하게 하거나, 상위 클래스의 일정한 초기화 메서드를 호출한다면 문제가 될 수 있다.
기억할 점
여러분 클래스의 지정 초기화 메서드를 구현하고 문서화하라.
다른 초기화 메서드들은 꼭 이 지정 메서드를 호출해야 한다.
지정 초기화 메서드가 상위 클래스의 지정 초기화 메서드와 다르다면
상위 클래스의 지정 초기화 메서드를 꼭 재정의하라
하위 클래스에서 사용하지 않을 상위 클래스의 초기화 메서드는
예외를 발생시키도록 재정의하라.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[Effective Objective-C] #17 description 메서드를 구현하라 (0) | 2017.08.20 |
---|---|
[Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #9 ~ #16 (0) | 2017.08.19 |
[Effective Objective-C] #15 접두어를 사용해 네임스페이스 충돌을 피하라 (0) | 2017.08.17 |
[Effective Objective-C] #14 클래스 객체가 무엇인지 이해하라 (0) | 2017.08.16 |
[Effective Objective-C] #13 불투명 메서드를 디버깅할 때 메서드 스위즐링을 사용하라 (0) | 2017.08.15 |
댓글