[iPhone] Object-C : Categories

Objective C를 사용하다 보니 매우 특이한점이 하나 있습니다. 제 생각에는 그 어떤 언어에서도 보기 힘든 모습이 아닐까 싶네요.

굳이 비교를 해보자면 Javascript같은 느낌이랄까요. 그게 무엇이냐 하면 바로 Category입니다.

보통은 특정 클래스에 메서드를 추가하기 위해서는 해당 클래스를 상속받은 이후에 그 상속받아 구현한 클래스를 사용하는것이 일반적인 객체 지향입니다.

그런데 Objective C에 있는 Category라는 개념을 사용하면 기존의 클래스에 내가 구현한 메서드를 추가할 수 있습니다.

그래서 결과적으로 기존의 소스코드에 크게 더럽히지 않고 각각의 클래스들의 기능을 확장 할 수 있습니다.

[code]#import “NSString+Dollar.h”
#import “NSString+Won.h”

– (void)applicationDidFinishLaunching:(UIApplication *)application
{
    NSString *string = @”100″;
   
    NSLog(@”%@”, [string stringWithDollar]);
    NSLog(@”%@”, [string stringWithWon]);
   
    [window makeKeyAndVisible];
}[/code]
NSString+Dollar.h
[code]#import <Foundation/Foundation.h>

@interface NSString (Dollar)

– (NSString *)stringWithDollar;

@end[/code]
NSString+Dollar.m
[code]#import “NSString+Dollar.h”

@implementation NSString (Dollar)

– (NSString *)stringWithDollar
{
    return [NSString stringWithFormat:@”$%@”, self];
}

@end[/code]
NSString+Won.h
[code]#import <Foundation/Foundation.h>

@interface NSString (Won)

– (NSString *)stringWithWon;

@end[/code]
NSString+Won.m
[code]#import “NSString+Won.h”

@implementation NSString (Won)

– (NSString *)stringWithWon
{
    return [NSString stringWithFormat:@”%@원”, self];
}

@end[/code]
사용자 삽입 이미지기본적으로 Category를 정의하는 클래스들의 파일명은 기존클래스명+추가기능으로 합니다.

보시면 아시겠지만 @interface에 괄호()가 들어가며 그 안에는 별칭(Alias)이 들어가게 됩니다.

여기서 보시면 @interface 구현부에 맴버 변수가 정의되는 중괄호{}가 없는걸 아실 수 있습니다.

이와 같은 기능을 사용하여 매우 간편하게 클래스들을 확장할 수 있습니다. 실제로 JSON관련 라이브러리들을 보면 NSDictionary를 확장하고 있습니다.
1058497054.zip