이번 포스팅에서는 Xcode 3에서 2.0으로 업그레이드 된 Objective-C와 추가된 컴파일 옵션에 대해서 알아 보겠습니다.

역시나 깊이도 없고 내용도 별로 없는 제목 그대로 둘러보기 입니다. 자세하고 정확한 자료는 아래의 애플에서 제공하는 문서들을 참고하시기 바랍니다.



1. Objective-C 2.0

1) 가비지 컬렉션 지원
Cocoa Object에 가비지 콜렉션이 지원됩니다. 이제는 더이상 retain, release에 신경을 쓰면서 오브젝트의 retain counts를 관리할 필요가 없게 되었습니다. 가비지 컬렉션은 기본으로 꺼져있습니다. 이를 사용하기 위해서는 Project 정보 윈도우의 Build에서 GCC 4.0 - Code Generation 분류중 'Objective-C Garbage Collection' 항목에서 지원여부를 선택해야 합니다.
   
사용자 삽입 이미지

* Unsupported
가비지 컬렉션을 사용하지 않습니다.

* Supported (-fobjc-gc)
가비지 컬렉션과 이전의 retain/release를 병행해서 사용할 수 있습니다.

* Required (-fobjc-gc-only)
가비지 컬렉션만 사용하고 이전의 retain, release를 사용하지 않습니다. 새롭게 시작하는 프로젝트는 이 옵션을 선택하는 것이 좋을 것 같습니다.

가비지 컬렉션에 의해 메모리에서 삭제되는 오브젝트에게는 finalize이란 메시지가 전달됩니다. 이 메시지를 처리할 경우에는 반드시 super의 finalize도 호출해야 합니다.

- (void)finalize
{
    ...
    ...
    [super finalize];   
}


2) Property

@property와 @synthesize를 이용하여 class 내부변수를 편리하고 쉽게 관리할 수 있습니다.

@property(속성) 타입 변수명;
@synthesize 변수명

property의 속성들은 아래와 같으며 ','로 구분합니다.

* getter
getter=getName과 같이 getter 함수의 이름을 지정합니다. 특별히 지정되지 않았을 경우에는 변수명과 같은 이름이 사용됩니다.

* setter
setter=setName과 같이 setter 함수의 이름을 지정합니다. 특별히 지정되지 않았을 경우에는 set[변수명]으로 사용됩니다.

* readonly
읽기전용으로 getter 함수만 사용 가능하고 setter 함수는 사용할 수 없습니다.

* readwrite
getter, setter 함수 모두 사용할 수 있습니다.

* assign
setter에서 'value = newValue;'와 같이 단순한 할당이 적용됩니다;

* retain
아래와 같이 할당시 변수의 retain이 적용됩니다.
if (value != newValue)
{
    [value release];
    value = [newValue retain];
}

* copy
아래와 같이 할당시 변수의 copy가 적용됩니다.
if (value != newValue)
{
    [value release];
    value = [newValue copy];
}

아래는 property와 synthesize의 사용예입니다. property는 interface내에서 synthesize는 implementation내에서 선언됩니다.

* MyObject.h
#import <Cocoa/Cocoa.h>

@interface MyObject : NSObject {
    NSString *myName;
}

@property(copy,readwrite) NSString *myName;

@end

* MyObject.m
#import "MyObject.h"

@implementation MyObject
@synthesize myName;

@end

이제 getter와 setter의 구현없이 소스코드에서 아래와 같이 사용할 수 있습니다.
MyObject *myObject = [[MyObject alloc] init];

[myObject setMyName:@"KingKong"];
NSLog(@"%@", [myObject myName]);


3) Dot(.) 문법지원
C++, Java에서 사용하는 '.'를 사용할 수 있게되었습니다. '[obj myName]'과 같이 사용하던 것을 'obj.myName'으로 사용할 수 있습니다. 아래가 사용예입니다.

obj.myName = @"cocoa"; // [obj setMyName:@"cocoa"];
NSLog(@"%@", obj.myName); // NSLog(@"%@", [obj myName]);


4) 에뉴뮬레이션 문법 지원
C 스타일의 for문 대신에 "for ([변수] in [collection 오브젝트])"와 같이 편리하게 사용할 수 있습니다. collection 오브젝트에는 NSArray, NSDictionary, NSSet등의 클래스의 인스턴스가 올 수 있습니다.

NSArray *myArray = [NSArray arrayWithObjects: @"A", @"B", @"C", nil];
   
for (int i = 0; i < [myArray count]; i++) {
    NSLog(@"%@", [myArray objectAtIndex:i]);
}
       
for (NSString *str in myArray) {
    NSLog(@"%@", str);
}



2. 다양한 플랫폼 지원

1) OS X 지원
OS X 10.5, OS X 10.4, OS X 10.3(Xcode 설치시 옵션)의 여러 OS X 버젼과 아이폰을 지원합니다.

사용자 삽입 이미지

2) 64bit 아키텍쳐 지원
이제 코코아 어플리케이션도 64비트로 작성할 수 있습니다.  

사용자 삽입 이미지

3) 컴파일러(GCC) 버젼 선택
GCC 버젼을 선택할 수 있습니다. Xcode 2.5에서도 사용했던 4.0 버젼이 기본으로 선택되어 있으며, 최신버젼 4.2 또는 시스템에 실치된 gcc도 사용이 가능합니다. 그리고 LLVM(Low Level Virtual Machine)을 지원하는 gcc도 선택할 수 있습니다.

사용자 삽입 이미지


가비지 컬렉션, Property나 에뮬레이션 지원은 반가운 소식인데 닷('.') 문법 지원은 다소 의외입니다. '.'을 사용한 소스를 보면 C++, Java 프로그래머들은 처음 접할 시에 이질감이 덜하겠지만, Objective-C스러운(?) 맛이 줄어 들지 않을까 기우가 듭니다.

아무튼 애플에 의해 Objective-C가 다른 언어들의 장점을 흡수하면서 발전하는 모습을 보니 좋습니다.
AND