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