타입 캐스팅은 변수의 타입을 다른 타입으로 변환하는 것을 의미한다.
프로그램의 안정성과 유연성을 유지하면서 다양한 데이터 타입을 처리하는 데 중요하게 사용된다.
기본 데이터 타입 사이의 캐스팅은 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 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 타입이라는 것을 알고 있으므로 안전하게 캐스팅할 수 있다.