본문 바로가기

Dev.iOS/Objective-C

[Objective-C] 4. Objective-C 동작하는 방식에 대해서

Chapter 4. Objective - C가 동작하는 방식

Objective-C의 대표적인 특징은 동적인 언어(dynamic language)라는 것이다. 정적인 언어(static language)들의 경우 컴파일/링크 시점에서 이미 어떤 코드가 어떻게 실행될지 모든것이 결정된다. 하지만 런타임을 지닌 동적인 언어의 경우 이러한 결정을 실제 그 코드가 실행되는 순간까지 미룰 수가 있는 특징을 지닌다. 이러한 특징을 덕분에 실제 코드가 실행중인 런타임 상황에서 Objective-C 런타임에의해 원하는 객체로 메시지를 리다이렉트 한다던지, 메서드 자체를 바꿔치기 한다던지 등의 유연한 동작이 가능해진다. 이 대표적인 특징 때문에 자바스크립트와 유사한 느낌을 많이 받게 된다.

1. 인스턴스 변수는 구조체에 저장된다
새 클래스와 그에 속한 인스턴스 변수를 정의하면 이 인스턴스 변수들은 사실 구조체 안에 저장된다. 사실 객체는 인스턴스 변수로 멤버들이 구성된 구조체이다. 따라서 상속받은 인스턴스 변수와 클래스에 새로 정의한 인스턴스 변수가 합쳐져 하나의 구조체를 형성한다. 상속받은 멤버 중에 isa 변수가 존재하는데 이것이 클래스를 식별하게 된다. 

2. 객체변수는 포인터다.
Fraction *myFraction;
myFraction 포인터 변수를 정의하는 코드이다. 또한 이것은 객체 변수를 정의하는 것이다. 그래서 객체 변수는 포인터다. 이 포인터는 클래스 이름인 Fraction형의 무엇인가를 가리키도록 정의되어있다. 아직 무엇을 가리킬지는 정의되지 않았다.
myFraction = [Fraction alloc];
새 인스턴스를 생성하는 코드이다. 메모리에 새 Fraction 객체를 저장할 공간을 할당(alloc)하고 반환되는 구조체의 포인터를 포인터 변수 myFraction 안에 저장한다.

3. 메서드는 함수이고, 메시지 표현식은 함수 호출이다.
메서드는 사실 함수다. 메서드를 호출하면 수신자의 클래스에 연결된 함수를 호출하는 것이다.

4. id형은 일반 포인터 형이다.
Objective-C에서 객체는 메모리 주소인 포인터로 참조되기 때문에 id변수에 자유롭게 할당할 수 있다. id를 반환하는 메서드는 결과적으로 메모리의 어느 객체를 가리키는 포인터를 반환하는 것이다. id형인 일반 객체 변수에 저장해도 어떤 클래스인지 확인할 수 있는 것인 isa 멤버 덕분이다. 마치 자바스크립트에서의 __proto__와 비슷하게 느껴지는 녀석이다.

5. 클래스 정의 자체도 객체이다. 메타클래스의 존재
Objective-C에서 클래스 정의를 할 때 메타클래스(Metaclass)를 생성하여 처리하게 된다. 즉 Objective-C에서는 객체 뿐만 아니라 클래스 정의 자체도 이미 객체화되어 있는 것이다. 


cf>

LLVM ( Low Level Virtual Machine )
LLVM은 컴파일러의 기반구조이다. 프로그램을 컴파일 타임, 링크 타임, 런타임 상황에서 프로그램의 작성 언어에 상관없이 최적화를 쉽게 구현할 수 있도록 구성되어 있다. LLVM으로 언어에 가상 기계를 생성, 가상 기계가 언어에 독립적인 최적화를 실행한다. LLVM은 언어와 구조로부터 독립적이며, 언어 모듈과 시스템을 위한 코드 생성 부의 사이에 위치한다. LLVM은 컴파일 과정 동안 최적화와 함께 JIT을 정적 컴파일러로 사용, 개발의 각종 단계에서 사용할 수 있는 많은 부분을 갖고 있다. 

LLVM은 정적/동적 컴파일러와 그와 관련된 여러 두고를 만들고 조작할 수 있는 오픈소스 프로젝트이다. 일반적인 정적 컴파일러는 프론트엔드가 소스코드를 해석해 중간 언어로 만든다. LLVM은 자신만의 IR 언어(중간언어)를 정의하고 이 IR을 조작하고 코드를 생성/수행하는 일을 한다.  


chapter 4. end