Swift의 타입 캐스팅은 Python에서 말하는 타입 캐스팅이랑 좀 다르다. Python에서는 데이터 타입을 다른 데이터 타입으로 변환하는, 흔히 형 변환이라고 불리는 개념을 타입 캐스팅이라고 한다. 그래서 Swift의 타입 캐스팅이라는 용어를 처음 접했을 때도 자연스럽게 형 변환을 떠올렸는데...
클래스 계층 구조에서 인스턴스의 타입을 확인하거나 특정 타입으로 변환하는 기능입니다.
무슨 말이지..?
Int
나 String
같은 기본 데이터 타입은 구조체로 정의되어 있으니, 기본 데이터 타입을 변환하는 것은 Swift에서의 타입 캐스팅이 아니란 말인데...
뭔가 Python과는 다른 새로운 세계가 펼쳐지는 느낌이다. 그래서 이번에는 Swift의 타입 캐스팅이 어떤 개념인지, 그리고 어떻게 사용하는지 정리해 보기로 했다.
Type Casting?
Swift에서 타입 캐스팅(Type Casting)은 특정 타입으로 데이터를 확인하거나 변환하는 기능으로, 런타임 시 데이터의 타입을 검사하거나 다른 타입으로 변환하는 데에 유용하다. 특히 Swift에서는 클래스 계층 구조를 다룰 때 자주 사용된다.
중요한 점은 오로지 클래스 및 클래스 계층 구조에만 사용된다는 점이다. 구조체와 열거형은 값 타입이기 때문에, 타입 캐스팅을 사용할 필요가 없다.
왜 구조체와 열거형은 타입 캐스팅이 안 될까?
구조체와 열거형은 값 타입이다: 클래스는 참조 타입이므로 런타임 시 타입을 변환하거나 확인하는 작업이 필요하다. 반면, 구조체와 열거형은 값 타입이므로 상속 계층 구조가 존재하지 않고, 타입 캐스팅이 필요하지 않다.
열거형은 고유 타입으로 정의된다: 열거형은 특정 값을 가지는 명시적인 타입으로 설계되었기 때문에, 타입 캐스팅으로 변환할 필요가 없다. 대신, 열거형에서는 패턴 매칭을 사용해 특정 case를 확인하거나 처리한다.
is
키워드
is
키워드는 인스턴스가 특정 타입인지 확인할 때 사용한다. 결과는 true
또는 false
로 반환된다.
class Animal {}
class Cat: Animal {}
let pet = Cat()
if pet is Cat {
print("pet은 Cat 타입입니다.")
} else {
print("pet은 Cat 타입이 아닙니다.")
}
pet is Cat
를 통해 pet
이 Cat
타입인지 확인한다.
as
키워드
as
: 컴파일 타임에 호환되는 타입 간의 변환에만 사용됨예를 들어, 하위 클래스 → 상위 클래스 (업캐스팅), 또는 프로토콜의 명시적 준수에 사용됨
as?
: 조건부 변환, 변환이 실패하면nil
반환as!
: 강제 변환이며, 타입 변환이 실패하면 런타임 오류가 발생함변환 성공을 확신할 때만 사용하는 것이 적합함
class Animal {}
class Cat: Animal {}
let pet: Animal = Cat()
// 업캐스팅 (호환되는 타입 간 안전한 변환)
let animal: Animal = pet as Animal
print("업캐스팅 성공: \(animal)")
// 조건부 변환
if let cat = pet as? Cat {
print("pet을 Cat으로 성공적으로 캐스팅했습니다.")
} else {
print("pet을 Cat으로 캐스팅하지 못했습니다.")
}
// 강제 변환 (권장되지 않음)
let cat = pet as! Cat
print("강제 변환 성공: \(cat)")
업캐스팅과 다운캐스팅
타입 캐스팅은 업캐스팅(Upcasting)과 다운캐스팅(Downcasting)으로 나뉜다.
업캐스팅:
하위 클래스 → 상위 클래스로의 변환
항상 안전하며 별도의 키워드 없이 자동으로 처리되거나
as
를 사용
다운캐스팅:
상위 클래스 → 하위 클래스로의 변환
안전하지 않을 수 있으므로
as?
또는as!
를 통해 처리
타입 캐스팅 사용 시 주의점
as!
사용을 최소화: 강제 변환은 런타임 오류의 위험이 있음타입 확인 우선: 캐스팅 전에
is
를 사용하여 확인하면 안전함옵셔널 처리:
as?
를 사용해 변환 실패 시nil
처리