@property : getter, setter 를 구현해준다.
상속 받을 때는 ":" 을 사용.
id : 모든 객체를 받을 수 있음.
1. source
//
// main.m
// demo08
//
// Created by SDS107 on 12. 3. 27..
// Copyright (c) 2012년 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
// 절차식 프로그래밍(C언어 스타일의 함수)
typedef enum{
kCircle,
kRectangle,
kTriangle
} ShapeType;
typedef enum{
kRedColor,
kGreenColor,
kBlueColor
} ShapeColor;
typedef struct{
int x, y, width, height;
} ShapeRect;
//typedef struct{
// ShapeType type;
// ShapeColor fillColor;
// ShapeRect bounds;
//}Shape;
NSString *colorName(ShapeColor colorName)
{
switch (colorName) {
case kRedColor:
return @"red";
break;
case kGreenColor:
return @"green";
break;
case kBlueColor:
return @"blue";
break;
}
return @"no clue";
}
// 객체 지향으로 만들기
@interface Shape : NSObject
{
ShapeColor fillColor;
ShapeRect bounds;
}
-(void)setFillColor:(ShapeColor) fillColor;
-(void)setBounds:(ShapeRect)bounds;
-(void)draw;
@end
@implementation Shape
-(void)setFillColor:(ShapeColor) c
{
fillColor = c;
}
-(void)setBounds:(ShapeRect)b
{
bounds = b;
}
-(void)draw
{
NSLog(@"도형을 그립니다.(%d %d %d %d) 색깔:%@",
bounds.x, bounds.y, bounds.width, bounds.height,
colorName(fillColor));
}
@end
@interface Circle : Shape // Shape Class 상속
@end
@implementation Circle
// 상속 받은 메서드 대신에 재정의 한 메서드(자바에선 오버라이딩)
-(void)draw
{
NSLog(@"원을 그립니다.(%d %d %d %d) 색깔:%@",
bounds.x, bounds.y, bounds.width, bounds.height,
colorName(fillColor));
}
@end
@interface Rectangle : Shape
@end
@implementation Rectangle
// 메소드 재정의
-(void)draw
{
NSLog(@"사각형을 그립니다.(%d %d %d %d) 색깔:%@",
bounds.x, bounds.y, bounds.width, bounds.height,
colorName(fillColor));
}
@end
@interface Triangle : Shape
@end
@implementation Triangle
// 메소드 재정의
-(void)draw
{
NSLog(@"삼각형을 그립니다.(%d %d %d %d) 색깔:%@",
bounds.x, bounds.y, bounds.width, bounds.height,
colorName(fillColor));
}
@end
void drawShapes(id shapes[], int count)
{
int i;
for(i=0; i < count; i++){
id shape = shapes[i];
[shape draw];
}
}
int main(int argc, const char * argv[])
{
id shapes[4];
ShapeRect rect0 = {0,0,10,30};
shapes[0] = [Circle new];
[shapes[0] setBounds:rect0];
[shapes[0] setFillColor:kRedColor];
ShapeRect rect1 = {100,200,30,40};
shapes[1] = [Rectangle new];
[shapes[1] setBounds:rect1];
[shapes[1] setFillColor:kGreenColor];
ShapeRect rect2 = {200,300,30,40};
shapes[2] = [Triangle new];
[shapes[2] setBounds:rect2];
[shapes[2] setFillColor:kBlueColor];
drawShapes(shapes, 3);
return 0;
}
2. source
//
// main.m
// demo082
//
// Created by SDS107 on 12. 3. 27..
// Copyright (c) 2012년 __MyCompanyName__. All rights reserved.
//
#import <Foundation/Foundation.h>
// 부모 클래스
@interface Animal : NSObject
-(void)makeNoise;
@end
@implementation Animal
-(void)makeNoise
{
NSLog(@"동물의 울음소리");
}
@end
// 자식 클래스 1
@interface Dog : Animal
@end
@implementation Dog
-(void)makeNoise
{
NSLog(@"멍멍");
}
@end
// 자식 클래스 2
@interface Cat : Animal
@end
@implementation Cat
-(void)makeNoise
{
NSLog(@"야옹야옹");
}
@end
// C 기반 함수
void WorkingAnimal(Animal *obj)
{
[obj makeNoise];
}
int main(int argc, const char * argv[])
{
id list[3];
list[0] = [Animal new];
list[1] = [Dog new];
list[2] = [Cat new];
// 일반적인 접근
[list[0] makeNoise];
[list[1] makeNoise];
[list[2] makeNoise];
// 다형적을 접근하는 코드
for(int i=0; i < 3; i++){
WorkingAnimal(list[i]);
}
return 0;
}
// 간단한 테스트
@interface ClassA : NSObject
{
@private
int privateVar;
@protected
int protectedVar;
}
-(void)MethodA;
@end
@implementation ClassA
-(void)MethodA
{
NSLog(@"변수의 값:%i", privateVar);
}
@end
@interface ClassB : ClassA
@end
@implementation ClassB
-(void)MethodA
{
// NSLog(@"변수의 값:%i", privateVar);
NSLog(@"변수의 값:%i", protectedVar); // 자기 자신뿐만 아니라 파생클래스에도 접근 가능
}
@end