
Objc-C 에는 클래스 확장이라는 개념이 존재함.
클래스에 대한 private Interface 를 정의하는데 사용되며, 클래스 내부에서만 사용할 메서드와 속성을 만드는 데 주로 사용함.
클래스 확장은 주로 .m 파일에 정의됨.
특징은 다음과 같음
헤더파일(.h)
기본 형태임.
#import <Foundation/Foundation.h>
@interface 신규 클래스명 : NSObject
// 읽기 전용, 복사 가능
@property (readonly, copy) NSString * name;
- (void)publicMethod;
@end
구현파일(.m)
비공개 메서드와 속성을 정의함.
#import "신규 클래스명.h"
// 클래스 익스텐션을 통해
// 내부적으로 프로퍼티를 재선언해서 변경이 가능함.
// 추가로 사용할 함수나 변수를 선언할 수 있음.
// 내부에서만 사용할 인스턴스 변수로 사용 가능함.
@interface 신규 클래스명 ()
{
// 내부적으로 사용할 변수
NSNumber * age;
}
// 재선언 - 쓰기 가능
@property (readwrite, copy) NSString * name;
- (void)privateMethod; // 비공개 메서드
@end
@implementation MyClass
// 초기화 될 때, self 검사해서 age 에 3을 넣어줌.
- (id)init
{
self = [super init];
if (self) {
age = [NSNumber numberWithInt:3];
}
return self;
}
- (void)publicMethod {
// 공개 메서드 구현
NSLog(@"Public method called");
// 프로퍼티 자체가 readonly 라서 setter 가 없는 상황이지만
// 클래스 익스텐션으로 내부적으로는 프로퍼티를 재선언하고 readwrite로
// 설정했기 때문에 사용 가능함.
[self setName:name];
}
- (void)privateMethod {
// 비공개 메서드 구현
NSLog(@"Private method called");
}
@end
클래스 확장은 클래스의 구현 파일 내에서만 사용, 비공개로 유지 가능
카테고리를 사용하여 확장시, 추가된 메서드는 모두 공개됨.
| 클래스 확장 | 카테고리 | |
|---|---|---|
| 목적 | 비공개 메서드와 속성 추가 | 공개 메서드 추가 |
| 정의 위치 | 구현 파일 | 헤더, 구현 파일 |
| 접근성 | 클래스 내부에서만 접근 | 클래스 외부에서도 접근 |
| 인스턴스 변수 | 비공개 인스턴스 변수 추가 기능 | 인스턴스 변수 추가 불가, 오직 메서드만 가능 |
| 사용 해야하는 상황 | 클래스의 내부 구현을 감추고 비공개 기능을 추가할 때 | 기존 클래스에 기능을 확장하고 공개 메서드를 추가할 때 |