'init의 역할'에 해당되는 글 1건

  1. 2010.03.01 클래스 만들기
Objective-C에서 실행할 수 있는 클래스를 만들기 위해서는 논리적으로 크게 3가지 부분으로 나누어진다.
@interface
인터페이스는 보통 *.h로 따로 나누기도하고 *.m파일 안에 포함시키기도한다.
인터페이스의 역할은 상속받은 부모클래스 선언과 테이터 요소(인스턴스 변수), 메서드를 선언한다.
인터페이스의 형태는 아래와 같다.
@interface 클래스이름:부모클래스이름
{
멤버변수선언
}
메서드선언
@end
인터페이스를 반드시 선언하여야 컴파일러에게 사용할 것들은 준비시킨다.

@implementation
인터페이스에서 선언한 메서드의 구현을 담당하고 보통 *.m파일 안에 선언되며 실제 실행할 명령문을 중괄호'{명령문}'안에 작성한다.
구현의 형태는 아래와 같다
@implementation 클래스이름:상속받은 부모클래스 이름(보통은 생략) 
메서드 설정
@end

program
위에서 만든 인스턴스들에 값을 설정하고 실제 사용할 부분이며 어딘가에 선언된 main루틴 안에서 실행한다.
이부분에서 변수에 값을 설정하고 메서드에 메시지를 보낸다.

아래는 분수를 출력하는 클래스이다. 별도의 헤더파일 없이 objc파일 안에 interface를 선언하였다.
 

#import <Foundation/Foundation.h>


//-----------interface section ----------

@interface Fraction : NSObject

{

int numerator;

int denominator;

}


-(void) print;

-(void) setNumerator:(int) n;

-(void) setDenominator:(int) d;


@end


//-----------implementation section ----------

@implementation Fraction


-(void) print

{

NSLog(@"%i/%i",numerator,denominator);

}


-(void) setNumerator:(int) n

{

numerator = n;

}


-(void) setDenominator:(int) d

{

denominator = d;

}


@end


//-----------program section ----------


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

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

//인스턴스 생성 초기화 : * 사용하여 사용할 클래스의 레퍼런스 또는 포인터를 의미

Fraction*myFraction = [[Fraction alloc] init];

/*

또는 아래처럼 순서대로 설정

myFraction = [Fraction alloc]; - Fraction형을 myFraction으로 지정하다(인스턴스를 생성하다,메모리에 할당하다)

* alloc 부모클래스에서 상속받은 것이므로 별도로 구현할 필요가 없다.

* 클래스에 alloc 메시지를 보내 클래스의 새로운 인스턴스를 반환 받는다.

* 반환된 클래스는 myFraction 저장된다.

    * alloc 객체의 모든 인스턴스 변수를 0으로 초기화 한다. 하지만 충분하지 않음으로 init으로 초기화 하여야 한다.

    (alloc 통해 초기화 것은 Fraction객체이며 별도로 myFraction 초기화 하기위해 인스턴스에 init메시지를 보낸다


myFraction = [myFraction init]; - 인스턴스 myFraction init(설정하다 or 생성하다.)

* 클래스 인스턴스(myFraction) 초기화 한다.

*/

//변수값 설정

[ myFraction setNumerator : 1 ];

[ myFraction setDenominator : 3 ];

//myFraction 출력 메서드 호출

NSLog(@"The value of myFraction is :");

myFraction.print;

//myFraction 인스턴스가 사용한 메모리 해제

* referance count에서 1 감소하여 rc 0이되면 시스템은 객체가 필요없다고 인식하고 메모리에서 제거한다.

[myFraction release];


//시스템에 의하여 foundation에서 사용한 모든 객체풀을 사용하고 나면 시스템에서 자동으로 release하도록 한다.

[pool drain];

    return 0;

}


실행하면 콘솔창에 'The value of myFraction is :'와 '1/3'이라고 출력한다.

인스턴스 변수선언
int numerator; 
(데이터타입 변수명)

인스턴스 메서드 선언
반환 값이 없는 경우
-(void) print;
반환값이 없고 인수가 있는 경우 - 함수이름 끝에  :  를 선언하여 인수를 받는 메서드로 선언한다. 
-(void) print:(NSString) msg;
반환값이 있고 인수가 있는 경우
-(int) setNumerator:(int) n;
반환값이 있고 인수가 없는 경우
-(BOOL)  returnMsg;

메서드 구조
- (반환형) 메서드이름:(인수형) 인수이름;
메서드의 앞에  " - "는 메서드 형태이다 (-)인 경우는 컴파일러에게 인스턴스 메서드라고 알려주고 (+)는 클래스 메서드라고 알려준다. 

Posted by 버터백통