본문 바로가기
프로그래밍/Xcode-iOS

Objective-C 카테고리 정의

by Mr-후 2017. 11. 1.
반응형

Objective-C 카테고리 정의


앞 포스팅 프로토콜에 이어 이번에는 카테고리(category) 정의와 사용에 대해 정리를 해본다. 

이번 회사 프로젝트에서 만든 정적 라이브러리는 여러가지 사정상, 카테고리 메서드를 사용할 수 없는 사태가 발생되어 카테고리로 정의해서 구현했던 함수를 별도의 클래스로 만들어 인스턴스 메서드로 추가해서 싱글톤으로 접근하고 사용이 가능하도록 변경해야만 했다. 


정확한 이유는 알 수 없지만 빌드 옵션 > Other Linker Flags 의 -ObjC옵션을 사용할 수 없는 경우는 정적 라이브러리에서 사용하는 카테고리 메서드는 로드가 되지 않고 소스상에서 찾을 수 없다는 오류를 내뱉는다. 

따라서 카테고리로 구현할지, 별도의 클래스로 구현할지에 대한 부분은 만드는 프로젝트의 성격에 따라 신중하게 결정해서 사용하길 바란다. 

정적라이브러리 형태의 개발이 아니고 단독 프로젝트를 진행할 경우 NSObject 를 상속받는 클래스(SDK내부)들의 확장 메서드 개념으로 카테고리를 선언해서 인스턴스 메서드를 추가할 수 있다. 단, 인스턴스 변수는 확장하려는 클래스에 추가할 수 없다는 것! 

카테고리의 정의는  클래스의 메서드를 분류하는 기능으로 기존의 클래스에 메서드를 추가할 수도 있기 때문에 유연성이 확보된다. 

보통 UIViewController, UINavigationController, NSString, NSData, NSDate, NSMutableArray, NSMutableDictionary, 등의 클래스에서 서비스의 특정 기능을 그룹(분류)할 때 모아서 사용하게 되고 재사용성과 유연성이 좋아 잘 만들어진 카테고리 메서드들은 생산성을 높혀 주는 요소로 작용을 한다. 


정의 방법

보통 일반적인 파일 .h와 .m파일 안에 다음과 같이 선언한다. 

@interface 클래스명 (카테고리명) 

- 메서드 선언

@end 

구현 방법 

@implementation 클래스명(카테고리명) 

- 메서드 구현

@end 


그리고 파일명(클래스명)은 보통 기존 클래스명 + 확장기능 식으로 정의하는데 다음과 같다. 

NSString+Encript.h 


NSString+MD5.h 등 과 같이 기능을 그룹핑하고 그룹명을 파일명에 +기호와 함께 사용하는 방식이다. 정해진 규칙은 없고 대부분 이런식으로 작성된 파일은 카테고리를 정의한 파일이라고 보면 된다. 

다음 그림은 UIFont+Custom.h 라는 카테고리 확장 클래스의 선언부와 구현부 내용이다. 



UIFont+Custom.h 선언부 


UIFont+Custom.m 구현부 

사용방법은 다음과 같다. 


    UILabel *lable = [[UILabel alloc] init];

    [lable setFont:[UIFont boldApplicationFontOfSize:16.0f]];


일반적인 UIFont 사용법과 동일하며 확장된 인스턴스 메서드를 사용하기만 하면 된다. 

확장된 카테고리의 인스턴스 메서드 내부에서 self는 바로 자신 확장한 클래스(UIFont, NSString ...)가 

된다. 


반응형