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

[Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #1 ~ #8

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

 [Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #1 ~ #8


2의 제곱 크기, @property, atomi, c 확장, C++, dealloc, default, effective objective-c, enum switch default, Extern, External, hash, IOS, isEqual, lazy initialization, nil, nonatomic, NS_ENUM, NS_OPTIONS, Objective-C 의 기원과 친숙해져라., or operation, or 연산, preprocessor, protocol-conformance, Read, Runtime, semantics, static const, Switch, translation unit specific constant, write, [Effective Objective-C] 목차와 요약을 통해 한 눈에 알아보는 Effective Objective-C #1 ~ #8, 값 정의, 객체 타입, 객체의 동등 비교를 이해하라, 구현 파일, 네임스페이스, 동적 바인딩, 런타임, 리터럴, 리터럴 문법, 매크로, 메모리 모델, 메모리 시맨틱, 메모리 시멘틱, 메서드, 메서드보다는 같은 일을 하는 리터럴 문법을 사용하라, 문자열, 배열, 번역 단위, 번역 단위 상수, 사전, 사전의 키, 상수, 상태 코드, 상태 코드를 정의하라, 성능, 숫자, 시맨틱, 열거형, 열거형을 사용해 상태, 예외, 옵션, 인덱스, 인스턴스 변수에 내부에서 접근할 때는 직접 접근하라, 일관성, 재정의, 전역 심벌 테이블, 전처리기, 전처리기 #define 보다는 타입이 있는 상수를 사용하라, 지연 초기화, 첨자, 초기화 메서드, 치환, 캡슐화, 컴파일 경고, 컴파일러, 클래스 이름 접두어, 클래스 포워드 선언, 클래스 확장 카테고리, 타입 상수, 포워드 선언, 포인터, 프로토콜, 프로퍼티 비교, 프로퍼티를 이해하라, 해시 충돌, 헤더, 헤더 포함, 헤더에 헤더를 포함하는 것을 최소화하라



#1 : Objective-C 의 기원과 친숙해져라.


     Objective-C는 객체 지향 기능을 추가한 C 의 확장이다. 

     Objective-C는 동적 바인딩을 사용하는 메시징 구조를 이용한다.

     동적 바인딩은 객체 타입이 실행 시간에 밝혀지는 것을 뜻한다.

     메시지를 받았을 때 동작할 코드를 컴파일러가 아닌 런타임이 결정한다.


     C의 핵심 개념을 이해하고 있으면 Objective-C를 효과적으로 작성하는 데 도움이 된다.

     특히 메모리 모델과 포인터를 잘 이해하고 있어야 한다.



#2 : 헤더에 헤더를 포함하는 것을 최소화하라


     항상 헤더를 포함하는 것을 최대한 미루라.

     이는 보통 헤더에 클래스를 포워드 선언하고 구현 파일에 그것과 연관된 헤더를 포함하는 것을 의미한다.

     이렇게 하면 클래스끼리 연관되는 것을 최대한 피할 수 있게 된다.


     때때로 프로토콜을 따른다는 것(protocol-conformance)을 선언할 때와 같이 포워드 선언이 불가능할 때가 있다.

     이 경우 가능하다면 프로토콜을 따르는 것을 클래스 확장 카테고리로 바꿔보라.

     그렇지 않을 경우, 할 수 있으면 프로토콜만 정의하는 헤더를 포함하라.



#3 : 메서드보다는 같은 일을 하는 리터럴 문법을 사용하라


     문자열, 숫자, 배열, 사전을 생성할 때 리터럴 문법을 사용하라.

     일반적인 객체 생성 메서드로 생성하는 것보다 더 명확하고 매우 간결한 방법이다.


     배열의 인덱스, 사전의 키에 대한 접근은 첨자를 이용하라.


     리터럴 문법으로 nil 을 배열이나 사전에 삽입하려고 하면 예외를 발생시킬 수 있으므로 배열이나 사전에 들어가는 값이 nil 이 아닌지 늘 확인하라.



#4 : 전처리기 #define 보다는 타입이 있는 상수를 사용하라


     전처리기 정의는 피하라.

     이것은 타입에 대한 정보가 없다.

     컴파일하기 전에 단지 해당 정의를 찾아서 치환할 뿐이다.

     또한 경고 없이 재정의될 수 있다.

     이로 인해 애플리케이션 내에서 값의 일관성이 깨지는 문제를 야기할 수 있다.


     static const 를 사용해 구현 파일에 이 번역 단위만을 위한 상수(translation-unit-specific-constant)를 선언하라.

     이러한 상수는 전역 심벌 테이블에 공개되지 않을 것이다.

     그래서 그런 상수 이름은 네임스페이스를 필요로 하지 않는다.


     헤더 파일에 extern 을 이용해 전역 상수를 선언하라.

     그리고 연관된 구현 파일에 값을 정의하라.

     이러한 상수는 전역 심벌 테이블에 나타날 것이다.

     그리고 그런 상수 이름은 네임스페이스가 있어야 한다.

     일반적으로 관련된 클래스 이름을 접두어로 사용한다.



#5 : 열거형을 사용해 상태, 옵션, 상태 코드를 정의하라


     열거형을 사용하여 상태 머신의 상태, 메서드 인자로 쓰이는 옵션, 에러 상태 코드에 사용되는 값에 읽기 좋은 이름을 주라.

     

     열거형 타입이 여러 가지 옵션이 동시에 사용될 수 있는 메서드 옵션을 정의한다면, 열거형의 값을 2의 제곱 크기로 선언하여 옵션들이 OR 연산을 할 수 있게 하라.


     명시적 타입으로 열거형 타입을 선언하기 위해 NS_ENUM 과 NS_OPTIONS 매크로를 사용하라.

     매크로를 사용하면 컴파일러가 선택한 타입이 아닌 직접 선택한 타입이 사용되는 것을 보장한다.


     열거형 타입을 switch 문에서 사용할 때 default 문은 구현하지 말자.

     그렇게 하면 열거형에 신규 값을 추가할 때 도움이 된다.

     컴파일러는 switch 문이 열거형의 모든 값을 다루지 않았을 때 경고를 주기 때문이다.



#6 : 프로퍼티를 이해하라.


     @property 문법은 객체의 데이터 캡슐화를 정의하는 방법을 제공한다.

     

     저장되는 데이터를 위한 정확한 방법(semantics)을 제공하기 위해 속성을 사용하라.


     인스턴스 변수에 대한 모든 프로퍼티에는 따라야 하는 시맨틱을 반드시 정의하라.


     iOS 에서는 nonatomic 을 사용하라.

     atomic 을 사용하면 여러 가지 성능 문제를 일으킨다.

     



#7 : 인스턴스 변수에 내부에서 접근할 때는 직접 접근하라


     내부에서는 인스턴스 변수를 읽을 때(read)는 직접 접근해 읽고, 반대로 쓸 때(write)는 프로퍼티를 이용하라.


     초기화 메서드와 dealloc 에서는 항상 인스턴스 변수를 직접 읽고 쓰라.


     데이터(즉 인스턴스 변수)가 지연 초기화를 이용한다면 프로퍼티를 이용해 데이터를 읽어야 한다.




#8 : 객체의 동등 비교를 이해하라


     객체의 동등성을 비교하려면 그 객체의 isEqual: 과 hash: 메서드를 구현하라.


     같은 객체는 항상 해시값이 같아야 한다.

     그러나 같은 해시값을 가진 객체가 꼭 동일할 필요는 없다.


     객체가 동등한지 비교할 때 모든 프로퍼티를 비교하지 말고 꼭 필요한 프로퍼티만 비교하라.


     hash 메서드를 구현할 때 최대한 빠른 결과를 나올 수 있게 구현해야 하지만 해시값 충돌도 최소화해야 한다.




반응형

댓글