코코아 개발을 위한 번역서가 있다. Cocoa programming for MAC OS X 코코아 프로그래밍, 하지만 이는 XCode 2.0을 기준으로 하여 제작되었기 때문에 현재 XCode 3.0의 버젼에서는 많은 벽에 부딪히게 된다.

 나도 처음으로 코코아 프로그래밍을 공부하기 위해서 책을 펼쳤으나 시작하자 마자 클래스와 인터페이스간의 연동을 하지도 못하고 실패하였다. 하지만 그냥 포기할 순 없어 검색을 통해 XCode 3.0 Toturial 이란 동영상을 보고 대충 감을 잡고 나와 같이 헤매는 분들을 위해서 그리고 공부하는 것 정리하는 겸  또 글 하나 작성한다.

 

01. 프로젝트 생성

  1. File > New Project > Application > Cocoa Application
  2. 프로젝트의 제목 PureLotteryMachine

 

02. 유저 인터페이스 제작

  1. 위의 화면과 같이 오른쪽의 Library 의 아이템을 Drag&Drop 하여 만든다.

 

03. 인터페이스와 컨트롤러의 연동

  1. Library 항목 중 Object 항목을 *독윈도우로 Drag&Drop한다.
    *독윈도우 : File's owner, First Responder 등이 있는 창.
  2. Object의 Inspector(단축키 : 사과+Shift+i)을 열어 Object Identity의 항목으로 이동하여 Class를 PLMController로 설정
  3. Inspector의 Indentity 항목에서 아웃렛(컨트롤 객체라고 생각하면 쉬움), 액션(이벤트 함수)를 생성
    액션 create:
    아웃렛 lotteryField: 
  4. Windows창에서 버튼을 Ctrl을 누르고 PLMController 위로 Drag&Drop하면 다음과 같이 만들어둔 액션이 뜨게 된다.

     버튼이 액션 중에 어떤 것과 연동이 될지 선택하는 것인데 여기서 create:를 선택하면 된다. 그리고 액션은 꼭 뒤에 : 가 존재한다.
  5. 텍스트필드에 로또 번호가 뜰 수 있게 우리가 선언한 아웃렛 lotteryField와 연동하기 위에서는 위와 동일한 방법으로 PLMController에서 Ctrl을 누르고 위의 윈도우창의 텍스트 필드 창으로 Drag&Drop을 하면 된다. 그리고 아웃렛들중(우린 하나밖에 만들지 않았으므로 하나일 것이다) lotteryField를 선택한다.

 

04. 클래스의 생성/액션의 선언

  1. 기본적으로 방금 PLMController를 만들면서 선언하였던 액션과 아울렛을 자동으로 생성할 수 있다. 방법은 PLMController을 선택하고 Interface Builder 메뉴중 File > Write Class Files... 을 선택한다.
  2. 생성된 PLMController.m 파일을 열어서 다음과 같이 수정한다.
#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)의 개념이 있는데 이는 소유 횟수를 통하여 객체의 메모리 반환 등을 관리하기 위해서이다.

 

05. 프로그램의 실행

 이제 지금까지 만든 프로그램을 실행하여서 테스트를 하면 다음과 같은 창이 뜬다. 그럼 코코아 프로그래밍의 첫발자국을 내민 것이다.

 처음하는 코코아 프로그래밍이었다. 매우 힘들다. 그리고 인터페이스 빌더를 이용해서 클래스를 생성하고 이런 것은 처음에는 약간 생소했지만 가만히 생각하니깐 Visual Studio에서 MFC를 이용해서 클래스 생성하는 것과 개념은 같은 것 같다. 

 앞으로 한국에서 크게 될 "코코아 프로그래머"가 되길 바라며!