· 로그인
· 텍스트큐브 홈
language/Objective C | 2009/07/29 16:02 | marocchino
클래스는 인터페이스(선언)랑 임플리먼트(구현)로 구성됨미다.
각각 클래스명.h와 클래스명.m 에 따로 관리하시는게 깔끔하나 그냥 한파일에 넝쿨칡 얽히듯 얽어놔도 실행에는 지장이없습니다.
일단 선언부는.
@interface 클래스이름 : 아빠클래스이름{ 인스턴스 변수들...}
@property 변수이름들
클래스(+)혹은 인스턴스(-) 메소드들
@end
요런모양이고.
구현부는
@implementation 클래스이름 : 아빠클래스이름
@synthesize 변수이름들
클래스(+)혹은 인스턴스(-) 메소드들
@end
요런모양이됨미다.
이렇게만든 클래스를 사용하려면 자바에서는
클래스이름 변수이름 = new 클래스이름();
의 모양으로 선언 해주지만
오브젝티브씨에서는 따로 생성자가없고 메모리할당하고 초기화하는 함수를 불러주는것으로 생성자를 대신합니다.
클래스이름 변수이름 = [[클래스이름 alloc] init];
[클래스이름 alloc]에서 눈치 채신횽들도있겠지만 오브젝티브씨에서는 .대신 []으로 함수를 구분합니다.
처음보면 참 더럽다라는 생각밖에 안드는데 사용할수록 많은 장점이 있습니다.
예를들어 인수가 9개인 메서드를 선언할떄..
ob.camera(1,1,1,1,1,1,1,1,1)
형식이라면 레퍼런스를 보기전에는
각위치에 뭐가들어가는지 알아보기힘들지만
오브젝티브씨스타일으로는 이게 읽기편하게 정리된다능.
[ob camerax:1 y:2 z:3 tx:1 ty:2 tz:3 uz:1 uy:2 uz:3 ];
물론 그만큼 쓰기길어지기는하지만 가독성이 높아진다는부분이있으니..
권장하지는 않지만 그냥 귀찮다 싶은사람은 다른데서 하던것처럼
[ob camera:1 :2 :3 :1 :2 :3 :1 :2 :3 ]
요런식으로 선언해도 에러는 나지않습니다.
설명만있는거보단 예제를 보면서 이해하는게 더 간단하고 이해가 잘될듯싶으니 셈플코드를 하나 붙여보겠다능.
접어두기..
#import <Foundation/Foundation.h>
@interface Fraction : NSObject
{
int numerator;
int denominator;
}
@property int numerator,denominator;
- (void)print;
- (void)setTo:(int)n :(int)d;
- (double)convertToNum;
- (Fraction *)add:(Fraction *)f;
- (Fraction *)subtract:(Fraction *)f;
- (Fraction *)multiply:(Fraction *)f;
- (Fraction *)divide:(Fraction *)f;
- (void)reduce;
@end
@implementation Fraction
@synthesize numerator,denominator;
- (void)setTo:(int)n :(int)d
{
numerator = n;
denominator = d;
}
- (void)print
{
NSLog(@"%i/%i", numerator,denominator);
}
- (double)convertToNum
{
if(denominator!=0)
{
return (double) numerator/denominator;
}else{
return 1.0;
}
}
- (Fraction *)add:(Fraction *)f
{
Fraction *rFraction = [[Fraction alloc] init];
[rFraction setTo: ((numerator*f.denominator)+(f.numerator*denominator))
:denominator*f.denominator];
[rFraction reduce];
return rFraction;
}
- (Fraction *)subtract:(Fraction *)f
{
Fraction *rFraction = [[Fraction alloc] init];
[rFraction setTo: ((numerator*f.denominator)-(f.numerator*denominator))
:denominator*f.denominator];
[rFraction reduce];
return rFraction;
}
- (Fraction *)multiply:(Fraction *)f
{
Fraction *rFraction = [[Fraction alloc] init];
[rFraction setTo: numerator*f.numerator
:denominator*f.denominator];
[rFraction reduce];
return rFraction;
}
- (Fraction *)divide:(Fraction *)f
{
Fraction *rFraction = [[Fraction alloc] init];
[rFraction setTo: numerator*f.denominator
:denominator*f.numerator];
[rFraction reduce];
return rFraction;
}
- (void)reduce
{
int n = numerator;
int d = denominator;
int temp;
while(d!=0){
temp = n % d;
n = d;
d = temp;
}
numerator /= n;
denominator /= n;
}
@end
int main (int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
Fraction *aFraction = [[Fraction alloc] init];
Fraction *bFraction = [[Fraction alloc] init];
[aFraction setTo:1 :2];
[bFraction setTo:1 :4];
[[aFraction divide: bFraction] print];
[[aFraction multiply: bFraction] print];
[[aFraction subtract: bFraction] print];
[[aFraction add: bFraction] print];
[aFraction release];
[bFraction release];
[pool drain];
return 0;
}
접어두기..
