본문 바로가기
프로그래밍 놀이터/iOS

[Effective Objective-C] #16 지정 초기화 메서드를 만들라

by 돼지왕 왕돼지 2017. 8. 18.
반응형

 [Effective Objective-C] #16 지정 초기화 메서드를 만들라


출처 : Effective Objective-C

CHAIN, designated initializer, exceptionWithName, inconcsistent, nscoding, NSInternalInconcsistencyException, [Effective Objective-C] #16 지정 초기화 메서드를 만들라, 객체 내부 데이터 유일한 곳, 디코딩, 문서화, 불일치, 심각한 에러, 예외, 인스턴스, 인코딩, 지정 초기화 메서드, 지정 초기화 메서드 연결, 지정 초기화 메서드 재정의, 직렬화, 최후의 방법, 하위 클래스



-

객체가 제대로 동작하기 위해 필요한 정보를 객체에 주는 초기화 메서드를 지정 초기화 메서드(designated initializer) 라고 한다.



-

클래스의 인스턴스를 생성하는 방법이 한 가지 이상이 있는 클래스는 하나 이상의 초기화 메서드가 있을 것이다.

초기화 메서드가 여러 개 있는 것도 괜찮지만, 모든 초기화 메서드가 호출하는 한 가지 지정 초기화 메서드가 있는 것이 더 좋다.



-

지정 초기화 메서드가 있다는 것은 나머지 초기화 메서드들이 이 지정 초기화 메서드를 호출함을 뜻한다.



-

지정 초기화 메서드는 객체 내부 데이터를 저장하는 유일한 곳이다.

객체의 데이터를 저장하는 데이터 저장소가 특정 이유로 다른 것으로 변경되었을 때 이 메서드만 변경하면 된다.



-

지정 초기화 메서드의 연결(chain)은 유지 보수에 중요하다.



-

하위 클래스에 다른 이름의 지정 초기화 메서드가 있다면 해당 상위 클래스의 지정 초기화 메서드를 항상 재정의해야 한다.



-

때때로 상위 클래스의 지정 초기화 메서드를 재정의하면 적절한 결과를 내지 못하기 때문에 지정 초기화 메서드를 재정의하기 원하지 않을 수도 있다.

지정 초기화 메서드를 재정의하는 일반적인 방법은 예외를 던지게 하는 것이다.

-(id)init{

  @throw [NSException exceptionWithName:NSInternalInconcsistencyException reason:@“Must use designated initializer” userInfo:nil];

}


이는 가혹한 방법 같지만 가끔 필요한 방법이다.

불일치(inconsistent)한 내부 데이터를 가진 객체가 생성되는 것을 막기 위해서다.



-

오브젝티브-C 에서 예외를 던지는 것은 심각한 에러를 의미한다.

초기화 메서드에서 예외를 던지는 것은 인스턴스가 다른 방법으로 초기화할 수 없을 경우에만 쓰는 최후의 방법이어야 한다.



-

몇몇 상황에서는 하나 이상의 지정 초기화 메서드가 필요하다.

이러한 상황은 객체의 인스턴스가 두 가지 서로 다른 방법으로 생성되고 각각 구별되어 다루어져야만 하는 상황이다.

이것의 예는 객체가 인코딩되고 디코딩될 수 있게 하는 직렬화 기술인 NSCoding 프로토콜이다.



-

모든 초기화 메서드가 상위 클래스의 초기화 메서드와 연결되어 있는 것처럼 우리가 초기화 메서드를 기술할 때도 이 법칙을 따라야 한다.



-

상위 클래스에 여러개의 지정 초기화 메서드가 있는 경우에,

하위 클래스가 지정 초기화 메서드를 호출 만들면서 모두 자기가 만든 초기화 메서드를 호출하게 하거나, 상위 클래스의 일정한 초기화 메서드를 호출한다면 문제가 될 수 있다.




기억할 점


여러분 클래스의 지정 초기화 메서드를 구현하고 문서화하라.

다른 초기화 메서드들은 꼭 이 지정 메서드를 호출해야 한다.


지정 초기화 메서드가 상위 클래스의 지정 초기화 메서드와 다르다면

상위 클래스의 지정 초기화 메서드를 꼭 재정의하라


하위 클래스에서 사용하지 않을 상위 클래스의 초기화 메서드는

예외를 발생시키도록 재정의하라.




반응형

댓글