Objective-C (타입캐스팅)

이한솔·2024년 8월 1일

Objective-C 문법 🍎

목록 보기
9/12

타입캐스팅

타입 캐스팅은 변수의 타입을 다른 타입으로 변환하는 것을 의미한다.
프로그램의 안정성과 유연성을 유지하면서 다양한 데이터 타입을 처리하는 데 중요하게 사용된다.

기본 타입캐스팅

기본 데이터 타입 사이의 캐스팅은 C 스타일의 타입 캐스팅을 사용한다.

// int -> float
int integerValue = 42;
float floatValue = (float)integerValue;
NSLog(@"Float value: %f", floatValue); // 출력: 42.000000


// char -> int
char character = 'A';
int asciiValue = (int)character; 
NSLog(@"ASCII value: %d", asciiValue); // 출력: 65

객체 타입 캐스팅

객체 타입 캐스팅은 주로 클래스 상속 관계에서 사용된다. Objective-C에서는 id 타입을 통해 어느 클래스의 객체든 받을 수 있으며, 특정 클래스로의 캐스팅이 가능하다.

id 타입 사용

id object = @"This is a string";
if ([object isKindOfClass:[NSString class]]) {
    NSString *string = (NSString *)object;
    NSLog(@"String: %@", string);
}

클래스 상속 관계에서의 캐스팅

@interface Animal : NSObject
@end

@implementation Animal
@end

@interface Dog : Animal
@end

@implementation Dog
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Animal *animal = [[Dog alloc] init]; // 업캐스팅
        if ([animal isKindOfClass:[Dog class]]) {
            Dog *dog = (Dog *)animal; // 다운캐스팅
            NSLog(@"This is a dog!");
        }
    }
    return 0;
}

안전한 캐스팅

Objective-C는 안전한 캐스팅을 위해 isKindOfClass, respondsToSelector같은 메소드를 제공한다. 이 메소드를 사용하여 객체가 특정 클래스의 인스턴스인지 또는 특정 메소드를 구현하는지 확인할 수 있다.

id unknownObject = ...; // 어떤 객체일지 모름

if ([unknownObject isKindOfClass:[NSString class]]) {
    NSString *string = (NSString *)unknownObject;
    NSLog(@"String: %@", string);
} else {
    NSLog(@"Not a string!");
}

if ([unknownObject respondsToSelector:@selector(length)]) {
    NSUInteger length = [(NSString *)unknownObject length];
    NSLog(@"Length: %lu", (unsigned long)length);
} else {
    NSLog(@"Does not respond to length selector!");
}

참조 타입캐스팅

주로 컬렉션 타입을 다룰 때 유용하다. 런타임 에러를 줄이고, 객체지향 프로그래밍의 장점을 극대화할 수 있다.

NSArray *array = @[@"Hello", @"World"];
NSString *firstString = (NSString *)[array firstObject];
NSLog(@"First string: %@", firstString);

이 예제에서 NSArray의 첫 번째 객체가 NSString 타입이라는 것을 알고 있으므로 안전하게 캐스팅할 수 있다.

0개의 댓글