본문 바로가기

아이폰개발2/Objective-C

[object-c 객체생성 init] 객체생성 기본원리 init


object-c 객체생성 기본원리 int 


1) 일단 파일부터 생성하겠습니다. 새프로젝트 생성해서 Application -> Command Line Tool -> choose 클릭




기본프로젝트 생성후 Class1 클래스를 생성해야합니다.

2) 일단 Class1 파일을 만들기위해서  File -> New File 클릭




아래 그림처럼 Cocoa Class-> Object -> Next 버튼 클릭



Class 이름을 넣어주시고  Also Create "......" 체크해주셔야 합니다.



기본 프로젝트가 완료되었습니다.

3)  이제 부터 소스 코딩을 하겠습니다.

Class1.h 헤더 파일에서 코딩

#import <Cocoa/Cocoa.h> // Foundation 헤더 포함



@interface Class1 : NSObject{

int a, b;

}



-(void) initAB;

-(void) printAB;


@end






 Class1.m 에서 아래와 같이 코딩

#import "Class1.h"



@implementation Class1


-(void) initAB{     // 객체를 생성후 init함수를 이용하여 변수 초기화

a = 10;

b = 20;


}

-(void) printAB{

printf("%d, %d\n", a,b);

}


@end






메인 함수에서



#import <Foundation/Foundation.h>

#import "Class1.h" // Class1 헤더 포함


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

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


// start

Class1  *class1 = [Class1 new];

[class1 initAB];

[class1 printAB];

    [pool drain];

    return 0;

}



실행시켜 보겠습니다. 아래와 같이 결과가 나오겠지요



다시 소스를 보면

-(void) initAB{     // 객체를 생성후 init함수를 이용하여 변수 초기화

a = 10;

b = 20;



KEY 
 :이 함수를 객체를 초기화 하는 역할을 하는 함수이므로 처음부터 객체를 생성할때
 호출하면 편리함






3) 그래서 Class 헤더 파일에는 선언하지 않고 m 파일에서 소스를 추가합니다.



Edit -> Insert Text => Object-C => init Definition 클릭






#import "Class1.h"



@implementation Class1


==========================================
- (
id) init  => 이함수가 자동생성된다.

{

self = [super init]; 

if (self != nil){
                                    

}

return self;

}

==========================================



-(void) initAB{

a = 10;

b = 20;


}

-(void) printAB{

printf("%d, %d\n", a,b);

}


@end


 

=> init 함수가 자동생성하는 이유는 Class1이 NSObject 클래스를 상속했기에 NSObject 기능까지 같이 물려받았기 때문이다.


 - (id) init  

{

self = [super init]; 

if (self != nil){
                 
printf("init 메소드 호출\n");   => 새로이 추가                

}

return self;

}


위와 같이 추가한후 다시 실행시키면 아래와 같은 결과가 나온다.



위와 같이 나오는 이유는 객체가 생성되면서 init()함수를 호출하기때문이다.


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

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


// start

Class1  *class1 = [Class1 new]; => class1 이 생성되면서 init()함수를 호출

[class1 initAB];

[class1 printAB];

    [pool drain];

    return 0;

}




그래서 결론은
자동으로 이루줘야 할 작업()들은 init(변수초기화, 다른 inner 객체생성)함수에서 해주면 된다. 처음부터 객체를 설계할때 처음에 해주어야 할작업은 init() 함수에 해주면 됩니다.

.