프로그래밍/Objective C

Objective C - 동적바인딩과 id형

가카리 2015. 9. 19. 15:29
반응형

 

위와 같이 프로젝트를 구성한우 아래 소스를 입력한다.

 

Fraction.h

 

#import <Foundation/Foundation.h>

 

@interface Fraction : NSObject

 

//아래와 같이 하면 자동으로 세터(setter) 게터(getter) 생성된다.

@property int numerator, denominator;

 

-(void) print;

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

-(double) convertToNum;

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

-(void) reduce;

 

@end

 

Fraction.m

 

 

#import "Fraction.h"

 

@implementation Fraction

 

 

//세터(setter) 게터(getter) 생성시 반드시 아래와 같이 해줘야함

@synthesize numerator, denominator;

 

-(void) print{

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

}

 

-(double) convertToNum{

    if(denominator != 0)

        return (double) numerator / denominator;

    else

        return NAN;

}

 

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

    numerator = n;

    denominator = d;

}

 

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

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

    

    result.numerator = numerator * f.denominator + denominator * f.numerator;

    result.denominator = denominator * f.denominator;

 

    [result reduce];

    

    return result;

}

 

//최대 공약수를 구해서 numerator denominator 나눠주는 함수

-(void) reduce{

    int u = numerator;

    int v = denominator;

    int temp;

    

    while(v != 0){

        temp = u % v;

        u = v;

        v = temp;

    }

    

    numerator /= u;

    denominator /= u;

    

 

    

}

 

@end

 

Complex.h

#import <Foundation/Foundation.h>

 

@interface Complex : NSObject

 

@property double real, imaginary;

 

-(void) print;

-(void) setReal:(double)a andImaginary:(double)b;

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

 

@end

 

Complex.m

 

#import <Foundation/Foundation.h>

#import "Complex.h"

 

@implementation Complex : NSObject

 

@synthesize real, imaginary;

 

-(void) print{

    NSLog(@" %g + %gi ", real, imaginary);

}

 

-(void) setReal:(double)a andImaginary:(double) b{

    real = a;

    imaginary = b;

}

 

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

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

    

    result.real = real + f.real;

    result.imaginary = imaginary + f.imaginary;

    

    return result;

}

 

@end

 

 

main.m

 

#import <Foundation/Foundation.h>

#import "Complex.h"

#import "Fraction.h"

 

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

    @autoreleasepool {

        id dataValue;//id형은 어떤 클래스의 객체든 저장할 있다.

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

        Complex *c1 = [[Complex alloc] init];

        

        [f1 setTo:2 over:5];

        [c1 setReal:10.0andImaginary:2.5];

        

        //dataValue 분수를 대입한다.

        dataValue = f1;

        [dataValue print];

        

        //dataValue 복소수를 대입한다.

        dataValue = c1;

        [dataValue print];

        

    }

    return 0;

}

 

 

실행 화면

 

 

반응형