Objective-C : Class Extension

준우·2024년 5월 16일

Objective-C 이야기

목록 보기
8/19
post-thumbnail

Class Extension

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

카테고리와의 차이점

클래스 확장은 클래스의 구현 파일 내에서만 사용, 비공개로 유지 가능

카테고리를 사용하여 확장시, 추가된 메서드는 모두 공개됨.

클래스 확장 카테고리
목적 비공개 메서드와 속성 추가 공개 메서드 추가
정의 위치 구현 파일 헤더, 구현 파일
접근성 클래스 내부에서만 접근 클래스 외부에서도 접근
인스턴스 변수 비공개 인스턴스 변수 추가 기능 인스턴스 변수 추가 불가, 오직 메서드만 가능
사용 해야하는 상황 클래스의 내부 구현을 감추고 비공개 기능을 추가할 때 기존 클래스에 기능을 확장하고 공개 메서드를 추가할 때

0개의 댓글