[Effecitve Objective-C] #1 Objective-C 의 기원과 친숙해져라.
출처 : Effective Objective-C
-
오브젝티브-C 는 매우 동적인 언어이다.
언어의 기원이 스몰토크(Small Talk) 이다.
대다수 언어가 컴파일 시간에 하는 일들을 오브젝티브-C 는 실행 시간에 한다.
-
함수 호출이 아닌 메시징 구조(Messaging Structure)를 사용한다.
Objective-C 는 메시징을 처음 사용한 스몰토크로부터 진화했다.
메시징과 함수 호출은 다음과 같이 차이점이 있다.
// 메시징
Object *obj = [Object new];
[obj performWith:param1 and:param2];
// 함수 호출
Object *obj = new Object;
obj->perform(param1, param2);
-
메시징 구조가 함수 호출과 다른 가장 큰 부분은 런타임이 실행할 코드를 정의한다는 것이다.
함수 호출은 컴파일러가 어떤 코드를 실행할지 정한다.
-
컴파일러는 메시지를 받을 객체 타입에 대해 신경 쓰지 않는다.
타입 또한 동적 바인딩이라는 프로세스를 이용해 실행 시간에 찾는다.
-
어려운 작업은 대부분 컴파일러가 아니라 Objective-C 런타임 컴포넌트가 수행한다.
근본적으로 런타임은 코드의 집합인데, 개발자의 코드 및 그 코드와 링크된 동적 라이브러리를 함께 잘 붙이는 일을 한다.
런타임이 업데이트되면 앱의 성능 향상의 이점을 동시에 누리게 된다.
컴파일 시간에 더 많은 것을 정하는 언어에서 이러한 성능 이점을 얻으려면 컴파일을 다시 해야 한다.
-
Objective-C 는 C 의 확장이다.
Objective-C 를 작성할 때 C 의 모든 기능을 쓸 수 있다.
-
특히 C 메모리 모델을 잘 이해하고 있으면 Objective-C 의 메모리 모델과 참조 세기의 동작 방식을 쉽게 이해할 수 있고,
Objective-C 객체를 나타내는 데 사용하는 포인터도 쉽게 이해할 수 있다.
NSString *someString = @“This is string”; // correct
NSString someString; // error
-
객체의 메모리는 항상 스택이 아닌 힙 공간에 할당된다.
Objective-C 객체는 스택에 할당되는 것이 허용되지 않는다.
-
힙 메모리 관리는 Objective-C 에서 추상화되었다.
개발자가 객체를 위한 메모리를 할당하거나 해제하려고 malloc 과 free 를 직접 사용할 필요가 없다.
Objective-C 런타임은 이것들을 참조 세기라는 메모리 관리 아키텍처를 이용해 추상화했다.
-
스택 공간을 사용할 것 같은 변수 정의를 볼 수 있다.
구조체 타입이 그러한데, 구조체 타입은 시스템 프레임워크 전반에 걸쳐 사용된다.
그 이유는 Objective-C 객체를 사용하는 부하가 성능에 영향을 주기 때문이다.
객체를 생성하는 것은 구조체에는 없는 힙 메모리 할당/해제 같은 부하를 수반한다.
-
기억할 점
Objective-C 는 객체 지향 기능을 추가한 C 의 확장이다.
Objective-C는 동적 바인딩을 사용하는 메시징 구조를 이용한다.
동적 바인딩은 객체 타입이 실행 시간에 밝혀지는 것을 뜻한다.
메시지를 받았을 때 동작할 코드를 컴파일러가 아닌 런타임이 결정한다.
C 의 핵심 개념을 이해하고 있으면 Objective-C 를 효과적으로 작성하는 데 도움이 된다.
특히 메모리 모델과 포인터를 잘 이해하고 있어야 한다.
'프로그래밍 놀이터 > iOS' 카테고리의 다른 글
[Objective-C] 카테고리 개념 ( Category ) (0) | 2017.07.18 |
---|---|
[Effecitve Objective-C] #2 헤더에 헤더를 포함하는 것을 최소화하라 (0) | 2017.07.17 |
[iOS Study] 병렬 프로그래밍 가이드 ( dispatch source ) (0) | 2017.07.03 |
[iOS Study] 병렬 프로그래밍 가이드 ( operation queue ) (0) | 2017.07.02 |
[iOS Study] 병렬 프로그래밍 가이드 ( 병렬 앱 디자인 ) (0) | 2017.07.01 |
댓글