'Objective C/클래스, 객체, 메서드'에 해당되는 글 6건
- 2010.03.27 self 키워드와 인수 이름 없는 메서드 2
- 2010.03.27 static 키워드
- 2010.03.27 메서드내에서 활용하는 변수....지역변수
- 2010.03.27 인터페이스와 구현파일 만들기 1
- 2010.03.01 setter와 getter만들기
- 2010.03.01 클래스 만들기
-(void) reduce
{
int u = numerator;
int v = denominator;
int tmp;
while (v!=0) {
tmp = u%v;
u = v;
v = tmp;
}
numerator /= u;
denominator /= u;
}
reduce를 구현하는 이유는 종전의 클래스에서 add메서드를 실행할 경우 가령 1/4+1/2 = 6/8로 나오기 때문이다 따라서 이를 3/4로 표현하기 위함이다. 그보다...reduce함수안에 지역변수 u,v,tmp를 선언하여 그 값을 초기화하고 활용하고 있다. 메서드가 종료하면 이 값들은 사라지므로 메모리에 남겨두어 나중에라도 값을 참고하고자 한다면 static키워드를 사용해야 한다.
#import <Foundation/Foundation.h>
@interface Fraction : NSObject {
인스턴스 변수를 설정
int numerator, denominator;
}
프로퍼티설정
@property int numerator, denominator;
-(void) print;
-(void) setTo:(int) n over:(int) d;
-(double) operation;
-(void) add:(Fraction *) f;
@end
아래는 Fraction.m의 구현파일 내용이다.
#import "Fraction.h"
@implementation Fraction
@synthesize numerator,denominator;
-(void) print
{
NSLog(@"%i/%i",numerator, denominator);
}
-(void) setTo:(int) n over:(int) d
{
numerator = n;
denominator = d;
}
-(double) operation
{
if( denominator != 0 ){
return (double) numerator/denominator;
}else{
return 1.0;
}
}
-(void) add:(Fraction *) f
{
//두 분수를 더하기
//a/b + c/d = ((a*d)+(b*c))/(b*d)
property에 dot notation으로 접근
numerator = (numerator * f.denominator) + (denominator * f.numerator);
denominator = denominator * [f denominator];
}
@end
#import <Foundation/Foundation.h>
//-------------- interface section -----------------
@interface Fraction : NSObject
{
int numerator;
int denominator;
}
-(void) print;
/*
클래스메서드는 인스턴스 다른 곳의 인스턴스변수에 접근할 수 없다
따라서 함수 setter/getter를 만들어 함수의 return값을 통해 인스턴스 변수의 값을 참조할 수 있다.
또는 헤더파일에서 @property을 설정할 수 있다. 그러면 자동으로 setter/getter로 사용 할 수 있도록 속성을 설정할 수 있다.
actionscript와 다르게 같은 이름의 변수와 함수명에 대하여 에러를 발생하진 않는다.
*/
-(void) setNumerator:(int) n;//numerator의 setter
-(void) setDenominator:(int) d;//denominator의 setter
-(int) numerator; //numerator의 getter
-(int) denominator;//denominator의 getter
@end
//--------------- implementation section ---------------
@implementation Fraction
-(void) print
{
NSLog(@"%i/%i", numerator, denominator);
}
//인스턴스 변수의 setter부분
-(void) setNumerator:(int) n
{
numerator = n;
}
-(void) setDenominator:(int) d
{
denominator = d;
}
//인스턴스 변수의 getter부분
-(int) numerator
{
return numerator;
}
-(int) denominator
{
return denominator;
}
@end
//--------------- program section ----------------
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// insert code here...
Fraction*myFraction = [Fraction new];
[myFraction setNumerator:1];
[myFraction setDenominator:3];
NSLog(@"The Value of myFraction is %i/%i", [myFraction numerator] , [myFraction denominator]);
[myFraction release];
[pool drain];
return 0;
}
#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;
}