Objective-C 2.0 개요

Objective-C 2.0은 Cocoa 프로그래밍 환경을 구현하는 강화된 언어입니다. 객체지향 메시지 패싱을 지원하는 작고 강력한 ANSI C 확장 언어 세트로 설계된 Objective-C는 대단한 동적 유연성을 자랑합니다. 높은 수준의 정교한 응용 프로그램을 빠르게 구축할 수 있게 하면서도 기본 시스템 라이브러리에의 접근도 제공하며, 가장 효율적인 방법으로 성능 위주의 코드를 작성할 수 있게 합니다. 강력한 Cocoa 프레임워크와 결합한 Objective-C는 작은 규모의 엔지니어들로도 뛰어난 응용 프로그램을 제작할 수 있게 합니다.

Mac OS X Leopard와 64 비트 Cocoa 프레임워크에 맞게 현대화된 Objective-C 2.0은 런타임 성능을 개선하였으며, 프로퍼티 액세서, 빠른 이터레이션을 제공하고, 최신 멀티 코어 시스템을 충분히 활용할 수 있도록 최신 고성능 가비지 콜렉션 시스템을 추가하였습니다. Objective-C는 이와 같은 새로운 기능들로 현대적 객체 지향 언어 중에서도 가장 앞선 언어가 되었으며, 버그가 적은 더욱 뛰어난 응용 프로그램을 신속하게 작성할 수 있게 합니다. 이와 같은 혜택은 단지 이론적인 것만이 아닙니다. Xcode 3은 Objective-C 2.0의 새로운 기능을 모두 활용하고 있으며, 동시에 Objective-C 2.0 런타임은 Objective-C 1.0과 결합된 상태로 남아있기 때문에 Leopard에서 기존 응용 프로그램도 어려움없이 구동할 수 있습니다.

이 문서는 개발자를 위한 Leopard 기술 시리즈의 한 부분으로, Objective-C 2.0과 그 런타임의 새로운 기능을 소개합니다. 먼저 가비지 콜렉션에 대해서 알아 봅시다.

가비지 콜렉션

자동 메모리 관리의 도입은 Objective-C 2.0 런타임의 가장 큰 변화입니다. 대부분의 C 기반 언어에서와 같이, 이전 버전의 Objective-C에서는 프로그래머들이 메모리를 수동으로 할당하고 해제하여야 했습니다. Objective-C 2.0은 이 과정을 돕기 위해 retainrelease 키워드를 이용한 참조 카운팅 메모리 관리 시스템을 제공함으로써 문제를 일부 해결하였으나, 여전히 프로그래머들은 적절한 메모리 관리에 신경을 써야 했습니다.

Objective-C 1.0 retain/release 기반 참조 카운팅 시스템을 대체한 새로운 고성능 가비지 콜렉터는, Objective-C와 Mac OS X 및 Core Foundation에 탑재된 모든 Cocoa 라이브러리와 함께 작동합니다. 따라서, Objective-C는 Java와 같은 다른 현대적 언어를 사용하는 프로그래머들이 누렸던 편한 메모리 관리를 동일하게 누릴 수 있게 해 줍니다. 또한, 가비지 콜렉터는 기존 Objective-C 1.0 응용 프로그램을 모두 지원할 수 있도록 opt-in 시스템으로 실행되므로, 수동 메모리 관리로 구동하기를 원하는 기존 응용 프로그램에는 손을 댈 필요가 없습니다.

좀 더 깊숙히 들어가면, Objective-C 2.0 가비지 콜렉터는 보수적으로 실행되기 때문에, 개발자들에게 C++ 코드와 라이브러리를 통합할 수 있는 기능을 제공하는 것은 물론, 강력한 C 언어에 완전하게 접근할 수 있게 합니다. 즉, Objective-C는 높은 수준의 Core Animation과 QuickTime 프레임워크에서 최저 파일 시스템 호출에 이르기까지 시스템의 모든 라이브러리에 직접적으로 접근할 수 있습니다. 물론, C 및 C++ 언어로 작업할 경우에는, 그 코드에 해당하는 메모리는 mallocfree를 이용하여 수동으로 관리하여야 합니다. 결론적으로, 여러분은 모든 프로그래밍 작업에 알맞은 가장 효율적이고 강력한 툴을 사용할 수 있게 되었습니다. Objective-C를 이용하여 응용 프로그램을 구축하고, 가비지 콜렉터로 메모리를 관리하면서, 필요한 경우에만 C 또는 C++ 코드를 이용하여 특별한 작동을 수행하도록 할 수 있습니다.

가비지 콜렉터 활성하기

여러분의 응용 프로그램에 가비지 콜렉션을 사용하기 위해 여러분이 해야할 일은 단지 Objective-C Garbage Collection 설정을 체크하는 것 뿐입니다. 이 설정에는 다음 그림에서와 같이 3 가지 값을 입력할 수 있습니다. 새로운 독립적 응용 프로그램에는 Required 설정이 적합합니다. 이는 컴파일러가 -fobjc-gc-only 플래그를 사용하여 Cocoa가 여러분의 응용 프로그램 이벤트 주기에서 적절한 시점에 가비지 콜렉션을 자동으로 시작할 수 있게 하는 것입니다. Supported 설정은 -fobjc-gc 플래그를 설정하고, 코드에 기존 retain/release 로직이 포함되었는지 알려주고, 여러분의 응용 프로그램에 탑재시키는 것입니다. 이 설정은 가비지 콜렉션 사용 및 사용하지 않는 환경 모두를 지원해야 하는 플러그인 및 라이브러리에 가장 유용합니다.

image

여러분의 응용 프로그램에 가비지 콜렉션을 활성시켰으며, 모든 Cocoa 및 Core Foundation 오브젝트의 메모리 관리는 Objective-C 2.0 런타임이 담당합니다. 가비지 콜렉션이 활성화된 후에는 retain, release, autorelease를 사용하는 기존 참조 카운트 메모리 관리 방법은 더 이상 작동하지 않습니다. 이들이 호출되었을 경우에는 Objective-C 런타임에 의해서 단락됩니다. 또한, 오브젝트가 파괴되었을 때, 가비지 오브젝트의 dealloc도 더 이상 호출되지 않습니다. 이는 dealloc 메쏘드의 주 함수가 더 이상 필요없는 인스턴스 변수 오브젝트로 업데이트하는 함수이기 때문입니다. 한가지 알아두어야 할 것은 Core Foundation CFRetainCFRelease 메쏘드는 Core Foundation 오브젝트에 아직도 영향을 준다는 것입니다.

원칙적으로, 가비지 콜렉터가 완전한 콜렉션을 수행할 때에는, NSApplication 공유 인스턴스와 기타 스택 할당 및 전역 변수를 포함하여 응용 프로그램의 알려진 모든 루트 오브젝트로 시작하는 일련의 유효 오브젝트를 생성합니다. 그 다음, 가비지 콜렉터는 재귀적으로 strong references로 알려진 정상 오브젝트 참조를 따라서 오브젝트로부터 다른 오브젝트에 이르기까지 완전한 유효 오브젝트 셋을 구성합니다. 유효 오브젝트 셋이 완성되면, 여기 속하지 않은 모든 오브젝트는 가비지로 간주하고 메모리에서 제거합니다. 가비지 콜렉터가 약한 참조를 따르지 않는다는 것도 알아 두어야 합니다. 어떤 경우에는 오브젝트를 참조하기를 원하지만, 다른 오브젝트가 사용하지 않을 참조를 남겨두고 싶지는 않을 때가 있습니다. 이럴 경우 약한 참조를 사용하여, 다른 오브젝트가 해당 오브젝트를 강력하게 참조하지 않는다면, 가비지 콜렉터가 작동할 때 수거되도록 만들 수 있습니다.

가비지 콜렉터가 여러분이 직접 메모리를 관리해야 하는 수고를 덜어주었다고 해서, 여러분의 응용 프로그램이 메모리를 사용하는 방법을 몰라도 된다는 뜻은 아닙니다. 특히, 응용 프로그램의 메모리 사용량을 가능한한 작게 만들어야 합니다. 가장 쉬운 방법은, 여러분이 남겨두기 원하는 오브젝트만을 참조하도록 유지하는 것과 의도하지 않은 참조를 통해 콜렉션에 원하지 않는 오브젝트를 남겨두지 않도록 확인하는 것입니다. 전반적으로 새로운 가비지 콜렉터 기능은 작성 및 유지보수하여야 하는 코드 양을 대폭 줄여주고, 대부분의 전형적인 메모리 관련 문제를 경감시켜 줍니다.

Light Touch로 콜렉팅하기

콜렉터가 활동 중이고, 수거해야 할 메모리를 찾고 있을 경우에는, 여러분의 응용 프로그램과는 별도의 쓰레드로 구동됩니다. 이렇게 함으로써 콜렉터는 여러분의 응용 프로그램의 성능에 눈에 띄는 영향을 미치지 않고, 단지 최대한 단시간에 응용 프로그램의 쓰레드를 차단시키는 것만으로 작업을 수행할 수 있습니다. 또한, 콜렉터 쓰레드는 응용 프로그램의 다른 쓰레드보다 우선 순위가 낮기 때문에 새로운 사용자 이벤트가 존재하는 경우에는 종료될 수 있습니다. 따라서, 여러분의 응용 프로그램은 사용자 입력에 대해 항상 즉각적인 응답성을 유지할 수 있습니다.

새로운 가비지 콜렉터가 런타임에 미치는 영향을 최소화할 수 있는 또 다른 방법은 세대별 콜렉션 알고리즘을 사용하는 것입니다. 즉, 콜렉터가 객체 지향 응용 프로그램의 대부분 오브젝트가 태생적으로 수명이 짧을 수 밖에 없다는 사실을 이용하는 것입니다. 이들 오브젝트는 시스템 캐시에 위치하게 될 가능성이 큽니다. 할당된 메모리를 "세대별"로 나눔으로써, 가비지 콜렉터는 가장 새로운 세대에 우선 순위를 두고, 방대한 양의 메모리를 빠르고 쉽게 복구합니다. 가끔씩 콜렉터가 응용 프로그램의 전체 오브젝트 그래프를 대상으로 완전한 콜렉션을 구동하여 더 이상 사용되지 않는 잔존 오브젝트를 수거하게 됩니다.

선언 프로퍼티

Objective-C 2.0의 또 다른 중요한 새 기능은 선언 프로퍼티를 지원한다는 것입니다. 객체 지향 프로그래밍에서 프로퍼티란 인스턴스 변수를 통해 직접 접근하는 대신 메쏘드를 통해 접근해야 하는 오브젝트로 둘러싸인 데이터를 의미합니다. 프로퍼티를 이용하면, 프로퍼티를 사용하는 다른 오브젝트의 실행에 영향을 미치지 않고 나중에 오브젝트 실행을 변경할 수 있습니다.

프로퍼티의 사용을 지원하고 장려하기 위한 방법으로, Objective-C 2.0은 최소한의 코드로 여러분의 클래스에 프로퍼티를 추가할 수 있는 선언 프로퍼티 신택스를 도입하였습니다. 반복적이고 오류가 많은 보일러플레이트 코드를 제공하는 대신, 여러분의 의도를 전달할 수 있는 간편한 선언 집합을 사용할 수 있습니다. 컴파일러는 이 선언을 이용하여 여러분의 클래스 인터페이스를 만족시키는데 필요한 접근자 메소드를 자동으로 생성합니다. 예를 들어, 클래스에 간단한 프로퍼티를 추가하려면 클래스 헤더에 다음과 같은 신택스를 사용할 수 있습니다.

@interface Person : NSObject {
    NSString *location;
}
@property NSString *location;
@end

이 코드는 Person 클래스가 읽고 설정할 수 있는 location이라는 이름의 프로퍼티를 가지고 있음을 말해 줍니다. 클래스 실행 부분에 다음과 같은 코드를 추가하여 이 프로퍼티의 실행을 마무리할 수 있습니다.

@implementation Person
@synthesize location;
@end 

이 코드는 컴파일러가 접근자 메쏘드를 생성, 합성할 수 있다는 것을 의미합니다. 컴파일러는 멀티코어 및 멀티쓰레드 환경에 맞는 빠른 알고리즘을 이용하여 설정자 메쏘드의 락킹 변수를 포함한 접근자 메쏘드를 생성합니다. 프로퍼티를 사용하는 것은 작성해야 할 코드의 양을 줄이는 것 뿐이 아니라, 현대의 멀티코어 시스템에 가장 적합한 접근자로 바꿔줍니다. 나중에 프로퍼티 액세서 대신 다른 실행 코드를 제공할 필요가 있으면, 클래스에 적절한 코드를 추가하기만 하면 됩니다.

프로퍼티에 접근하기

여러분의 코드에서 오브젝트의 프로퍼티를 사용하려면, 구조 엘리먼트에 접근할 때 사용하던 것과 동일한 패턴을 따르느 Objective-C 2.0의 새로운 닷 신택스를 사용할 수 있습니다. 예를 들어, 위에서 사용한 Person 클래스의 위치를 설정하려면 다음과 같은 코드를 사용하면 됩니다.

Person *bill = [[Person alloc] init];
bill.location = @"Home"

다음과 같은 코드로 프로퍼티에 접근할 수 있습니다.

NSLog(@"Bill's location: %@", bill.location);

Objective-C 2.0의 새로운 닷 신택스는 컴파일 시점에 접근자 메쏘드의 호출로 번역되어 컴파일러에게 보내는 신택스 메시지입니다. 예를 들어, 위 코드는 다음과 같은 메쏘드 호출과 동일한 역할을 합니다.

Person *bill = [[Person alloc] init];
[bill setLocation:@"Home"];
NSLog(@"Bill's location: %@", [bill location]);

이 중 어떤 접근자 메쏘드를 사용해도 프로퍼티 실행을 나중에 변경시킬 수 있는 기능을 유지할 수 있습니다.

프로퍼티 선언 속성

프로퍼티를 선언할 때, 기본적으로 컴파일러는 프로퍼티를 읽기/쓰기 프로퍼티로 처리하는 코드를 생성하고, setter에서 간단한 어싸인먼트를 사용합니다. 프로퍼티가 다른 비헤이비어를 가져야 할 경우에는 프로퍼티 선언 속성 세트를 사용할 수 있습니다. 예를 들어, 오브젝트의 복사본을 이용하여 어싸인먼트하여야 할 경우에는 프로퍼티를 다음과 같이 선언하면 됩니다.

@property(copy) NSString *location;

프로퍼티를 읽기 전용으로 규정하고 셋 액세서 메쏘드를 생성하지 않으려면 다음과 같이 사용하면 됩니다.

@property(readonly) int age;

프로퍼티의 get과 set 액세서 메쏘드의 이름을 규정하는 다른 프로퍼티 선언 속성도 있습니다. 프로퍼티 액세서 메쏘드가 non-atmic이어야 하는지를 알려주는 메쏘드 등 여러 가지가 있습니다.

빠른 Enumeration

Objective-C 2.0의 새로운 기능 중 마지막으로 소개할 것은 빠른 Enumeration, 즉, Objective-C 신택스 추가로 콜렉션의 모든 멤버를 단순하고 쉽게 운영할 수 있게 해 줍니다. 빠른 enumeration을 사용하면 코드가 더욱 명확해져 이해하기 쉽습니다. 예를 들어, 스트링 어레이를 이터레이션하려면 다음과 같은 코드를 사용하면 됩니다.

NSArray *array = 
    [NSArray arrayWithObjects:@"1", @"2", @"3", nil];

for (NSString *string in array) {
    NSLog(@"string is %@", string);
}

빠른 enumeration은 더욱 간편한 신택스를 제공하고, 안전한 enumeration을 제공한다는 면에서, NSEnumerator 오브젝트를 직접 사용하는 것에 비해 상당히 효율적입니다. enumeration 과정 중 콜렉션을 변경하면, 예외가 발생합니다. enumeration 중 콜렉션의 변경은 허용되지 않기 때문에, 다중 쓰레드 상에서 여러번의 enumeration을 동시에 수행할 수 있습니다.

빠른 enumeration은 NSFastEnumeration 프로토콜을 실행하는 모든 콜렉션에서 가능합니다. NSArray, NSDictionary, NSSet, NSEumerator를 포함한 모든 Cocoa 콜렉션 클래스는 이 프로코톨을 실행합니다. 또한, 단일 메쏘드로 구성된 NSFastEnumeration 프로토콜 지원을 이용하여 여러분의 콜렉션에 빠른 enumeration을 추가할 수 있습니다.

결론

보시다시피, Objective-C 2.0은 Objective-C를 크게 발전시킨 버전입니다. 가비지 콜렉션, 새로운 프로퍼티 신택스, 빠른 enumeration을 통해 강력한 Cocoa 응용 프로그램을 더 짧은 코드로 더 빠르게 작성할 수 있게 합니다. 또한, 반복적이고 오류에 민감한 보일러플레이트 대신 여러분의 응용 프로그램을 독창적으로 바꿔 줄 코드를 작성하는데 더 집중할 수 있습니다. Leopard용 새로운 응용 프로그램을 작성하려면, Objective-C 2.0의 새로운 기능을 충분히 활용할 수 있어야 합니다. 또한, Mac OS X 구버전도 지원할 필요가 있을 경우에는, Objective-C 1.0을 사용할 때처럼 코드를 작성하면 Leopard에서도 구동되는 응용 프로그램을 제작할 수 있습니다.

Leopard 시작하기

세계에서 가장 앞선 운영 체제의 차세대 버전이 나왔습니다. Mac OS X Leopard의 혁신적인 기술을 경험하고 여러분의 제품을 새롭고 놀라운 기능들로 설계하여 보십시오. ADC Premier 또는 Select 회원들에게는, iTunes의 ADC, Coding Headstarts, ADC 호환성 랩 등 Apple 엔지니어와 전문가들이 제공하는 광범위한 개발 자료가 제공됩니다. 코딩 단계에서 출시 단계까지 Apple의 전문적인 혜택을 누릴 수 있는 ADC 회원 가입에 대해 자세히 알아 보십시오.

업데이트: 2007-11-06

 
 
 

애플 온라인 스토어(080-3404-622) 또는 가까운 애플 공인 판매 대리점에서 구입하실 수 있습니다.

Copyright © 2008 애플컴퓨터코리아. 모든 권리 보유사용 약관 | 개인정보 보호정책