PureHolic’s Blog

순수중독, 방동근, Stefan, PureHolic, Mac, iPod, Travel, Korea…

Track #01 - 이등병의 편지

8월5

Audio clip: Adobe Flash Player (version 9 or above) is required to play this audio clip. Download the latest version here. You also need to have JavaScript enabled in your browser.

Download : 이등병의 편지

 

The Lyrics

1. 집 떠나와 열차타고 훈련소로 가는 날
부모님께 큰절하고 대문밖을 나설 때
가슴속엔 무엇인가 아쉬움이 남지만
풀 한포기 친구얼굴 모든 것이 새롭다
이제 다시 시작이다 젊은 날의 생이여

2. 친구들아 군대가면 편지 꼭 해다오
그대들과 즐거웠던 날들을 잊지 않게
열차시간 다가올 때 두손 잡던 뜨거움
기적소리 멀어지면 작아지는 모습들
이제 다시 시작이다 젊은 날의 꿈이여
젊은 날의 꿈이여

3. 짧게 짤린 내머리가 처음에는 우습다가
거울속에 비친 모습 굳어진다 마음까지
뒷동산에 올라서면 우리마을 보일는지
나팔소리 고요하게 밤하늘에 퍼지면
이등병의 편지한 장 고이 접어 보내오
이제 다시 시작이다 젊은 날의 생이여

 

The Informations

  • Cool Edit 2.1 프로그램
  • COSY C106N(싸구려) 마이크
  • SeJong(나름대로 수제품이라 적혀있음) 통기타
  • Mi Wha MusicBoy (C key) Harmonica (싼거-_-9000원;;)

 

 아마도 처음으로 악기를 연주해서 녹음한 곡인 것 같다. 뭐 홈레코딩이라고도 할 수 없을정도로 처참하고 웃기고 그리고 음질도 그렇다. 뭐 어차피 내가 음악인도 아니고 단순한 취미생활인데 비싼 돈을 투자할 이유가 없지 않은가? 어쩌튼 이런저런 이유로 그렇게 만들었던 나의 노래.(작사/작곡은 당연히 내가 안했음 - 언젠가는 시도할 것임)

 뭐 모르는 사람이 있다면 이상한 노래. 참 슬픈 노래다. 아무리 생각해도 군대란 곳을 간다는 그 생각에 더 슬퍼지는 노래이다. 내가 군대갈 때는 그냥 하루전까지 기말고사를 치고 바로 들어가서 별다른 감흥도 느낄 사이 없이 들어갔다. 아쉽다. 그런것도 이제 다시는 못 해볼 경험이니깐...

코코아개발 #02 - Objective-C의 클래스

8월1

 Objective-C는 브래드 콕스(Brad Cox)란 사람이 옛날 옛적에 C에 스몰토크와 비슷한 클래스들과 메시지 전송 매커니즘들을 추가하여 만든 언어이다. 그래서 문법은 생소할지 몰라도 전체적인 모습은 C언어를 공부하였다면 쉽게 다가갈 수 있다. Objective-C에서 추가된 클래스와 메시지 전송 매커니즘에 대해서 공부를 하였다.

 

Objective-C의 클래스 사용방법

NSMutableArray *foo;
 
foo = [NSMutableArray alloc]; // NSMutableArray의 인스턴스 생성
[foo init]; // foo가 가르키는 객체에 init 메시지 전송
[foo release]; // foo의 인스턴스를 해제

 위의 예제를 보면 알 수 있지만 [foo init] 의 의미는 C언어에서 foo.init(); 과 동일한 의미이다. C언어에서 없는 클래스와 관련된 명령들은 대부분 [     ] 대괄호 안으로 입력이 되는 것을 볼 수 있다.

 

Objective-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의 메세지 전송 매커니즘

 Objective-C의 메시지 전송 매커니즘의 문법은 많은 프로그래머들이 매우 멋지다고 말을 한다. 그 이유는 간단하다. 모든 메서드의 인수의 의미 파악이 쉽기 때문이다.

NSMutableArray *foo;
foo = [[NSMutableArray alloc] init];
 
[foo insertObject:bar];
[foo insertObject:bar atIndex:7];
 
[foo release];

 위의 예제처럼 인수를 넘길 땐, : 를 이용한다. 그리고 복수의 인수가 있을 경우에는 InsertObject:bar atIndex:7 이렇게 적어준다. 스몰토크를 사용할 줄 아는 사람은 이것이 쉽게 다가 온다는데... 난 전혀 안 다가온다. 나중에 이용하면서 적응해 나가야할 듯하다.

코코아개발 #01 - 로또 생성기 (XCode 3.0)

8월1

 코코아 개발을 위한 번역서가 있다. 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]&lt;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를 이용해서 클래스 생성하는 것과 개념은 같은 것 같다. 

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

« Older EntriesNewer Entries »

  • Total Counter : 20364
  • Today : 71
  • Yesterday : 94