순수중독, 방동근, Stefan, PureHolic, Mac, iPod, Travel, Korea…
Objective-C는 브래드 콕스(Brad Cox)란 사람이 옛날 옛적에 C에 스몰토크와 비슷한 클래스들과 메시지 전송 매커니즘들을 추가하여 만든 언어이다. 그래서 문법은 생소할지 몰라도 전체적인 모습은 C언어를 공부하였다면 쉽게 다가갈 수 있다. Objective-C에서 추가된 클래스와 메시지 전송 매커니즘에 대해서 공부를 하였다.
NSMutableArray *foo; foo = [NSMutableArray alloc]; // NSMutableArray의 인스턴스 생성 [foo init]; // foo가 가르키는 객체에 init 메시지 전송 [foo release]; // foo의 인스턴스를 해제
위의 예제를 보면 알 수 있지만 [foo init] 의 의미는 C언어에서 foo.init(); 과 동일한 의미이다. C언어에서 없는 클래스와 관련된 명령들은 대부분 [ ] 대괄호 안으로 입력이 되는 것을 볼 수 있다.
C언어에서 확장된 Objective-C기 때문에 객체의 선언 부분은 약간 특이하다. 특히 적응되지 않는 [ ] 대괄호의 사용은 언젠가 계속 접하다보면 편해지길 바라며 쓸 뿐이다.
File > New file... > Objectvie-C class 선택하여 작성.
foo.h 파일
#import <Cocoa/Cocoa.h> @interface foo : NSObject { NSMutableArray *array; int foo_no; int prev_no; int next_no; } - (void)setNumber:(int)no; - (int)foo_no; - (int)prev_no; - (int)next_no; @end
foo.m 파일
#import "foo.h" @implementation foo - (void)setNumber:(int)no { foo_no = no; } - (int)foo_no { return foo_no; } - (int)prev_no { return prev_no; } - (int)next_no { return next_no; } @end
위와 같이 Objective-C에서의 클래스는 다른 언어(JAVA, C# 등)들과 의미는 같지만 문법이 약간 다르다. 적응하는데 약간 시간이 걸릴듯하다.
Objective-C의 메시지 전송 매커니즘의 문법은 많은 프로그래머들이 매우 멋지다고 말을 한다. 그 이유는 간단하다. 모든 메서드의 인수의 의미 파악이 쉽기 때문이다.
NSMutableArray *foo; foo = [[NSMutableArray alloc] init]; [foo insertObject:bar]; [foo insertObject:bar atIndex:7]; [foo release];
위의 예제처럼 인수를 넘길 땐, : 를 이용한다. 그리고 복수의 인수가 있을 경우에는 InsertObject:bar atIndex:7 이렇게 적어준다. 스몰토크를 사용할 줄 아는 사람은 이것이 쉽게 다가 온다는데... 난 전혀 안 다가온다. 나중에 이용하면서 적응해 나가야할 듯하다.
코코아 개발을 위한 번역서가 있다. Cocoa programming for MAC OS X 코코아 프로그래밍, 하지만 이는 XCode 2.0을 기준으로 하여 제작되었기 때문에 현재 XCode 3.0의 버젼에서는 많은 벽에 부딪히게 된다.
나도 처음으로 코코아 프로그래밍을 공부하기 위해서 책을 펼쳤으나 시작하자 마자 클래스와 인터페이스간의 연동을 하지도 못하고 실패하였다. 하지만 그냥 포기할 순 없어 검색을 통해 XCode 3.0 Toturial 이란 동영상을 보고 대충 감을 잡고 나와 같이 헤매는 분들을 위해서 그리고 공부하는 것 정리하는 겸 또 글 하나 작성한다.


#import "PLMController.h" @implementation PLMController - (IBAction)create:(id)sender { NSNumber *lotteryNumber; NSMutableArray *lotteryArray; NSString *lotteryString; lotteryArray = [[NSMutableArray alloc]init]; //lotteryArray = [NSMutableArray new]; 위와 동일 while([lotteryArray count]<6) { lotteryNumber = [[NSNumber alloc]initWithInt:random()%45]; // 배열에 동일한 숫자가 있으면 패스 if([lotteryArray containsObject:lotteryNumber]==NO) { [lotteryArray addObject:lotteryNumber]; } // 임시 숫자의 해제 [lotteryNumber release]; } lotteryString = [[NSString alloc]initWithFormat: @"%02d-%02d-%02d-%02d-%02d-%02d", [[lotteryArray objectAtIndex:0] intValue], [[lotteryArray objectAtIndex:1] intValue], [[lotteryArray objectAtIndex:2] intValue], [[lotteryArray objectAtIndex:3] intValue], [[lotteryArray objectAtIndex:4] intValue], [[lotteryArray objectAtIndex:5] intValue] ]; // 배열의 해제 [lotteryArray release]; [lotteryField setStringValue:lotteryString]; [lotteryString release]; } @end
위의 소스를 보면 일단 로또 번호가 중복되지 않게 16번째 줄에 containsObject 메서드가 사용되었다. containsObject는 배열안에 동일한 객체가 있는지 isEqual메시지를 날려준다. 그리고 동일한 객체가 있을 때, BOOL값인 YES를 반환한다.
만약 20번째줄의 구문이 없다면 lotteryNumber의 객체는 소유 횟수(retain count)가 처음 생성될 때 1, 배열에 포함될 때 1(NSMutableArray는 배열에 값을 추가할 때 배열값을 복사하지 않는다.)이 되어서 소유 횟수은 총 2가 된다. 그래서 꼭 20번째 줄처럼 선언을 해줘야 소유 횟수를 1로 줄여서 배열이 release될 때 함께 소유 횟수를 0으로 만들어 메모리를 반환하도록 해야한다.
자바의 Garage Collection과 유사한 기능으로 Objective-C에서는 소유 횟수(retain count)의 개념이 있는데 이는 소유 횟수를 통하여 객체의 메모리 반환 등을 관리하기 위해서이다.
이제 지금까지 만든 프로그램을 실행하여서 테스트를 하면 다음과 같은 창이 뜬다. 그럼 코코아 프로그래밍의 첫발자국을 내민 것이다.

처음하는 코코아 프로그래밍이었다. 매우 힘들다. 그리고 인터페이스 빌더를 이용해서 클래스를 생성하고 이런 것은 처음에는 약간 생소했지만 가만히 생각하니깐 Visual Studio에서 MFC를 이용해서 클래스 생성하는 것과 개념은 같은 것 같다.
앞으로 한국에서 크게 될 "코코아 프로그래머"가 되길 바라며!