이전 시간에 작성한 Hello.h 파일과 Hello.m 파일의 Hello 클래스를 사용해서 간단한 Hello World  프로그램을 작성해 볼려고 합니다.


이해하기 쉽도록 Hello 클래스 부분을 다시 한번 기록하도록 하겠습니다.


// Hello.h 파일


#import <Foundation/Foundation.h>


@interface Hello : NSObject{

}

-(void)print;

-(void)printNSLog;

@end



//Hello.m 파일


@implementation Hello

-(void)print{

printf("Hello World~!\n");

}

-(void)printNSLog{

NSLog(@"Hello World~!!!!");

}

@end


위 두파일이 Hello 클래스 작성파일이다.


지금은 이해를 돕기 위해서 본 내용에 작성하였습니다.


많은 Objective C의 장점을 설명하는것을 보게되면, Objective C는 클래스 부분을 굳이 보지 않아도, 프로그램을 작성할수 있다는 이점이 있다고 합니다. 보통은 메소드만 알고 있으면, 해당 클래스를 사용할수 있는것입니다.


그럼 실제적인 프로그램 실행 부분을 작성하도록 하겠습니다.


해당 파일명은 main.m 으로 하도록 하겠습니다.


main.m 이 맘에 들지 않으시면 다른것으로 하셔도 무방합니다.


#import <Foundation/Foundation.h>

#import "Hello.h"


int main(int argc, const char argv[]){

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];


Hello *myHello = [[Hello alloc] init];


[myHello print];

[myHello printNSLog];


[myHello release];

[pool drain];

return 0;

}


위 파일이 클래스를 불러와서 사용한 프로그램 부분입니다.

먼저 컴파일 하는 방법을 설명하도록 하겠습니다.

이전에 설명한 부분과 같습니다.

$ gcc -framework Foundation Hello.m main.m -o hello

위 와 같이 입력하고 return 을 입력했을때 에러가 없다면, 실행이 될것이고, 컴파일 에러가 있다면 에러가 있는 파일에서 해당 부분을 검토해 보시기 바랍니다.

정상적으로 컴파일이 되었다면, 실행을 해보도록 하겠습니다.

$ ./hello

위와 같이 실행을 하게되면 아래와 같은 결과가 나옵니다.

Hello World~!
2011-04-25 12:41:27.212 hello[839:903] Hello World~!!!!

위와 같은 실행내용을 보실수 있습니다.

첫번째 라인의 Hello World~!는 printf() 함수의 출력결과이고, 아래의 Hello World~!!!! 는 NSLog()의 출력 결과 입니다.

그럼 프로그램을 설명해 보도록 하겠습니다.

#import <Foundation/Foundation.h>
이 부분은 수도 없이 설명을 한거 같습니다.

#import "Hello.h"
이 부분은 Hello.h  에 작성된 Hello 클래스를 import시킨다는 이야기 입니다.

int main() 함수는 처음장에서 설명드린 그 main 함수와 동일합니다.

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

위 내용은 해당 프로그램의 autoreleasePool 을 선언하고 초기화 한 부분입니다.

어떻게 이루어진 것인지 자세한 사항은 바로 다음에 오는 내용에서 조금더 자세히 설명하도록 하겠습니다.

Hello *myHello = [[Hello alloc] init];

위 부분은 중요한 부분중에 한 라인입니다.

공식을 보게 되면, 바로 위에 설명된 autoreleasePool 부분과 동일하다는것을 알것입니다.

위 라인을 3개의 부분으로 나누어진것을 하나로 합쳐 놓은것입니다.

Hello *myHello;
myHello = [Hello alloc];
myHello = [hello init];

위 세줄 라인을 한줄로 작성한것이 되겠습니다.

위 라인을 하나하나 보도록 하겠습니다.

Hello *myHello

C 언어에서 많이 사용하는 포인터 타입과 비슷합니다.

Hello 클래스의 포인터로 객체 myHello 을 선언한것입니다.

선언만으로는 쓸수 없으며, 메모리를 할당 하고 초기화 시켜야 합니다.

할당하는 방법은

myHello = [Hello alloc];

와 같이 작성합니다.

myHello 객체를 Hello 클래스 타입으로 allocate 메모리를 할당한 것입니다.

위 부분과 같은 공식을 추후에 자주 보게 될 것입니다. 현재로서는 이렇다고만 알고 있고, 왜 저렇게 작성했는지는 아래 부분을다시 설명하도록 하겠습니다.

메모리를 할당했으면 해당 메모리를 초기화 해야 합니다.

myHello = [myHello init];

myHello 객체를 init 즉 initial(초기화)해 줍니다.

위 세라인을 한줄로 기록하게 되면 아래와 같은 공식으로 적용됩니다.

ClassName *objectName = [[ClassName alloc] init];

위 공식에 대입해서 해당 클래스로 내가 사용할 Object(객체)를 선언하고, 메모리를 할당하고, 초기화 합니다.

하나의 클래스로 여러 객체를 생성할수 있습니다.

자세한 사항은 추후에 설명이 될것입니다.

현재 예제에서는 myHello 라는 객체를 생성한 것입니다.

[myHello print];

이 항목에 대한 설명을 하겠습니다.

Objective C는 일반적으로 호출이라는 개념으로 설명이 됩니다.

위 코드는 Hello 클래스로 생성된 myHello 객체가 print 라는 메소드를 호출한 것입니다.

print 메소드를 호출했을시 print 메소드의 프로그램 결과는 printf() 함수를 이용해서 Hello World~! 결과를 출력하게 됩니다.

마찬가지로

[myHello printNSLog];

위 호출 내용은 myHello 객체가 Hello 클래스의 printNSLog 메소드를 호출한 것입니다.

해당 메소드의 내용인 NSLog() 로 Hello World~!!!! 를 출력 하게 되는것입니다.

[myHello release]
위 라인은 myHello 객체가 release 메소드를 호출한 것입니다.

하지만 우리는 Hello 클래스에 release 라는 메소드를 생성한적이 없는데, 사용하였습니다.

이 부분은 Foundation/NSObject에 포함되어 있는 메소드 입니다.

해당 기능은 할당된 메모리를 해제해 주는 역할을 하는것입니다.

메모리 관리에 대해선 추후에 자세히 다시 설명할 기회가 있을것입니다.

지금 기억해야 하는 공식은

클래스에서 객체를 생성하고 할당하고 초기화 해주었다면 마지막에 release 해주어야 한다는것입니다.

항상 해당 프로그램 마지막부분에 해제 하는 코드를 넣어주시면 됩니다.

공식은

[objectiveName release];

입니다.

이후에 NSAutoreleasePool 의 pool 을 drain 해서 메모리를 비워줍니다.

return 0; 로 OS에 0을 되돌려서 프로그램을 종료합니다.