[Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #9 ~ #16
#9 : 클래스 클러스터 패턴을 사용해 구현의 상세 내용을 숨겨라.
클래스 클러스터 패턴은 간단한 퍼블릭 퍼사드 뒤편에 상세 구현을 숨길 때 사용할 수 있다.
클래스 클러스터는 시스템 프레임워크에서 널리 사용된다.
클래스 클러스터의 퍼블릭 추상 클래스의 하위 클래스를 만들 때는 항상 주의를 기울여야 한다.
그리고 문서가 있으면 반드시 먼저 읽어봐야 한다.
정리자 주 : 자바의 Interface 개념
#10 : 연관 객체를 사용해 기존 클래스에 사용자 정의 데이터를 연관 지으라
연관 객체는 객체 두 개를 연결하는 방법을 제공한다.
연관 객체의 메모리 관리 속성으로 최소 소유(mimic owning) 또는 비소유(nonowning) 관계를 정의할 수 있다.
연관 객체는 다른 대안이 없을 때만 사용해야 한다.
연관 객체는 찾기 어려운 버그를 쉽게 만들기 때문이다.
정리자 주 : 안드로이드 View 의 Tag 개념
#11 : obj_msgSend 의 역할을 이해하라
메시지는 리시버, 선택자, 파라미터들로 구성된다.
메시지를 호출하는 것은 객체에 메서드를 호출하는 것과 동일하다.
호출을 할 때 모든 메시지는 동적 메시지 디스패치 시스템을 통해 실행된다.
이 시스템이 구현을 찾고 실행을 한다.
#12 : 메시지 포워딩을 이해하라.
메시지 포워딩은 객체가 선택자에 응답할 수 없다는 사실을 알았을 때 진행되는 절차다.
동적 메서드 해결은 런타임에 메서드를 클래스에 추가하고 바로 사용할 때 이용된다.
객체는 해석할 수 없는 선택자를 다루기 위해 다른 객체를 선언할 수 있다.
완전 포워딩은 이전 두 방법으로 선택자를 처리할 수 없을 때 호출된다.
#13 : 불투명 메서드(Opaque method)를 디버깅할 때 메서드 스위즐링을 사용하라
클래스의 선택자에 대한 메서드 구현은 실행 시간에 추가되거나 바뀔 수 있다.
스위즐링은 한 메서드 구현을 다른 것과 맞교환하는 것이다.
보통은 원래 메서드 구현에 기능을 추가로 넣기 위해 사용된다.
런타임이 메서드에 관여하는 것(즉 실행할 메서드 구현을 결정하는 행위)은 오직 디버깅할 때만 유용하다.
사용할 수 있다고 꼭 사용해야 할 필요는 없다.
정리자 주 : swizzle -> 혼합주, 칵테일, 술을 벌컥벌컥 마시다, 휘젓다
#14 : 클래스 객체가 무엇인지 이해하라
클래스 계층은 Class 객체들로 구성되어 있다.
각 Class 인스턴스는 타입을 정의하는 포인터를 가지고 있다.
객체 타입을 컴파일 시간에 알 수 없을 때 내성을 꼭 사용해야 한다.
클래스 객체를 직접 비교하는 것보다는 가능한 한 내성 메서드를 사용하라.
객체가 메시지 포워딩을 구현했을 수 있기 때문이다.
정리자 주 : 내성 메서드 -> isMemberOfClass: ( exact match ), isKindOfClass: ( 상속 match )
#15 : 접두어를 사용해 네임스페이스 충돌을 피하라
회사와 앱 모두에 어울리는 클래스 접두어를 고르라.
그리고 코드 전반에 걸쳐 사용하라.
자신의 라이브러리에서 서드 파티 라이브러리를 사용한다면 그 라이브러리의 이름에 자신의 접두어를 붙여라.
#16 : 지정 초기화 메서드를 만들라
여러분 클래스의 지정 초기화 메서드를 구현하고 문서화하라.
다른 초기화 메서드들은 꼭 이 지정 메서드를 호출해야 한다.
지정 초기화 메서드가 상위 클래스의 지정 초기화 메서드와 다르다면 상위 클래스의 지정 초기화 메서드를 꼭 재정의하라.
하위 클래스에서 사용하지 않을 상위 클래스의 초기화 메서드에는 예외를 발생시키도록 재정의하라.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[Effective Objective-C] #18 가변 객체보다는 불변 객체를 사용하라 (0) | 2017.08.21 |
---|---|
[Effective Objective-C] #17 description 메서드를 구현하라 (0) | 2017.08.20 |
[Effective Objective-C] #16 지정 초기화 메서드를 만들라 (0) | 2017.08.18 |
[Effective Objective-C] #15 접두어를 사용해 네임스페이스 충돌을 피하라 (0) | 2017.08.17 |
[Effective Objective-C] #14 클래스 객체가 무엇인지 이해하라 (0) | 2017.08.16 |
댓글