[Effective Objective-C] #20 프라이빗 메서드 이름에 접두어를 사용하라
출처 : Effective Objective-C
-
프라이빗 메서드에 접두어를 붙이는 것이 좋다.
퍼블릭 메서드와 프라이빗 메서드를 깔끔히 구분하여 디버깅할 때 도움이 된다.
-
프라이빗 메서드에 표시를 해두면 메서드 이름이나 시그너처를 바꿀 때 한 번 더 생각하게 된다.
메서드가 퍼블릭이면 변경을 좀 더 신중하게 생각해야 한다.
클래스의 퍼블릭 API 로 바꾸는 것이 적절하지 않을 수 있기 때문이다.
퍼블릭으로 변경하면 해당 클래스 사용자는 그들의 코드를 해당 변경에 맞게 갱신해야 한다.
그러나 메서드가 내부를 위한 것이면 외부에 공개된 퍼블릭 API 에 영향을 끼치지 않고 오직 해당 클래스의 코드만 변경하면 된다.
-
사용할 접두어는 개인 성향에 따라 다르다.
접두어를 포함할 좋은 문자는 _ 와 p 문자다.
필자는 p_ 를 쓰는 것을 좋아한다.
p 는 private 을 지칭하고 _ 은 메서드 이름이 시작하기 전에 시각적인 간격을 주기 때문이다.
접두어 바로 다음은 첫번째 문자가 소문자인 카멜 표기법에 따른 메서드 이름이 이어진다.
- (void)p_privateMethod{ … }
-
퍼블릭 메서드와는 다르게 프라이빗 메서드는 인터페이스 파일에 정의되지 않는다.
-
오브젝티브-C 에서는 메서드를 프라이빗으로 선언할 수 있는 방법이 없다.
모든 객체는 모든 메시지에 응답할 수 있다.
그리고 실행 시간에 객체가 어떤 메시지에 응답하는지 살펴볼 수도 있다.
주어진 메시지에 대한 메서드 검색(lookup)은 실행 시간에 이루어진다.
그리고 누가, 언제, 어떻게 특정 메서드를 호출할 수 있는지에 대한 범위(scope)를 한정(limit) 짓는 방법이 없다.
프라이빗 메서드라고 지칭하는 작명 관례가 유일한 방법이다.
-
오브젝티브-C 를 처음 접한 사용자는 private 메서드가 없다는 것을 불편하다고 생각할 것이다.
그러나 이로 인해 오브젝티브-C 가 동적 특성(dynamism)을 갖게 되어 굉장한 이점을 얻을 수 있다.
-
애플은 프라이빗 메서드의 접두어로 _ 를 잘 사용한다.
그래서 여러분도 애플을 따라 _ 을 사용하는 것이 좋은 선택이라 생각할 수 있다.
그러나 이는 형편없는 결정이 될 가능성이 있다.
애플이 제공하는 클래스의 하위 클래스에서 밑줄을 사용했다면 기본 클래스의 메서드를 의도치 않게 재정의해 버릴 수 있다.
이 때문에 애플은 밑줄을 접두어로 사용하는 것을 피해야 한다고 문서에 명시해 두었다.
이는 메서드를 특정 범위 내로 한정 짓지 못하는 언어의 단점이긴 하지만 동시에 많은 장점을 가진 강력한 동적 메서드 디스패치(dynamic method dispatch) 시스템의 일부분이다.
-
프레임워크 클래스의 하위 클래스를 만들 때 문서화되지 않은 프라이빗 접두어를 알아내는 방법은 없다.
이 경우 여러분이 고른 클래스 접두어를 프라이빗 메서드 접두어로 사용할 수 있다.
이렇게 하면 잠재적인 충돌 위험이 많이 줄어든다.
비슷하게 다른 사람들이 여러분 클래스의 하위 클래스를 만들 때도 고려해야 한다.
이것이 바로 프라이빗 메서드 이름에 접두어를 사용해야 하는 이유다.
구현 소스가 없는 클래스의 퍼블릭 인터페이스에 정의되지 않은 메서드들을 알아내는 것은 복잡한 도구를 사용하지 않고는 불가능하다.
기억할 점
프라이빗 메서드 이름에 접두어를 붙이면 퍼블릭 메서드와 쉽게 구별할 수 있다.
메서드 접두어로 _ 를 사용하는 것은 피하라.
애플이 사용을 예약했기 때문이다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[Effective Objective-C] #22 NSCopying 프로토콜을 이해하라. (0) | 2017.09.02 |
---|---|
[Effective Objective-C] #21 오브젝티브-C 에러 모델을 이해하라 (0) | 2017.09.01 |
[Effective Objective-C] #19 명확하고 일관된 작명법을 사용하라 (0) | 2017.08.30 |
[Effective Objective-C] #18 가변 객체보다는 불변 객체를 사용하라 (0) | 2017.08.21 |
[Effective Objective-C] #17 description 메서드를 구현하라 (0) | 2017.08.20 |
댓글