본문 바로가기

C/Objective C/Objective C

Objective C Class 초기화 예제 따라하기

클래스 초기화 하기

Fraction *myFract = [[Fraction alloc] init];
두 메서드가 호출된 뒤, 보통 다음과 같이 새 객체에 값을 대입한다.
객체를 초기화하고 나서 초기값을 설정하는데, 보통 한 메서드에서 이 두 작업을 동시에 수행한다. 예를 들어, initWith:: 메서드를 정의하여 분수를 초기화하고 두 인수를 제공해 분자, 분모의 값을 설정할 수 있 다.
클래스에서 초기화 메서드의 이름은 보통 init... 으로 시작한다.
만일 클래스가 초기화 메서드를 하나 이상 갖는다면, 그 가운데 하나는 ‘지정된 초기화 메서드’여야 하고, 다른 메서드는 모두 이 초기화 메서드를 사용해야 한다.
지정된 초기화 메서드는 대개 가장 복잡한 초기화 메서드, 즉 가장 많은 인수를 받는 메서드다. 지정된 초 기화 메서드를 만들면 주요 초기화 코드를 단일한 메서드에 집중시킬 수 있다.
상속받은 인스턴스 변수를 적절히 초기화해 주어야 한다. 가장 쉽게는 먼저 부모의 지정된 초기화 메서드 (보통 init이다)를 호출해 주는 방법이 있다. 그 후 새로 정의한 인스턴스 변를 초기화해 주면 된다.
이러한 내용을 바탕으로 보건대, Fraction 클래스의 초기화 메서드는 initWith::는 다음과 비슷한 형태일 것이다.

-(Fraction *) initWith: (int) n: (int) d {

self = [super init]; if(self)

[self setTo: n over: d]; return self;

}
이 메서드는 부모의 초기화 메서드인 NSObject의 init 메서드를 먼저 호출한다. 초기화 메서드는 메모리 상의 객체를 바꾸거나 이동시킬 권한이 있기 때문에, 반환 값을 self에 할당해 주어야 한다.
super를 초기화한 후에(그리고 반환 값이 0이 아니어서 초기화가 성공한 경우) setTo:over: 메서드를 사 용하여 Fraction의 분자와 분모를 설정해 준다. 다른 초기화 메서드와 마찬가지로, 초기화된 객체를 반환 해 주어야 한다.


- 소스 코드

#import <Foundation/Foundation.h>


@interface Fraction : NSObject

int numerator;

int denominator; }

@property int numerator, denominator; 

-(Fraction *) initWith: (int) n: (int) d; 

-(void) print;

-(void) setTo: (int) n over: (int) d; 

-(double) convertToNum;

-(void) reduce;

-(Fraction *) add: (Fraction *) f;


@end 

#import "Fraction.h"


@implementation Fraction


@synthesize numerator, denominator; 

-(Fraction *) initWith: (int) n: (int) d {

self = [super init];

if (self)

[self setTo: n over: d];

return self; }

-(void) print {

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

}

-(double) convertToNum {

if (denominator != 0)

return (double) numerator / denominator;

else

return 1.0;

}


-(void) setTo: (int) n over: (int) d {

numerator = n;

denominator = d; 

}


-(void) reduce {

int u = numerator; int v = denominator; int temp;

while (v != 0) { temp = u % v;

u = v;

v = temp; }

numerator /= u;

denominator /= u; }


-(Fraction *) add: (Fraction *) f {

// To add two fractions:

// a/b + c/d = ((a*d) + (b*c) / (b * d)

// result will store the result of the addition Fraction 

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

int resultNum, resultDenom;

resultNum = numerator * f.denominator + denominator * f.numerator

resultDenom = denominator * f.denominator;

[result setTo: resultNum over: resultDenom]; [result reduce];

return result; 

}

@end 

#import <Foundation/Foundation.h>

#import "Fraction.h"


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

{


Fraction *a, *b;

a = [[Fraction alloc] initWith: 1: 3]; 

b = [[Fraction alloc] initWith: 3: 7];

[a print]; [b print];


return 0;

} 


- 실행 화면