객체의 실제 타입을 확인하거나 다른 타입으로 변환하는 데 사용된다. 주로 클래스의 상속 구조에서 많이 사용한다. 타입 캐스팅을 위해 is, as, as?, as! 키워드를 제공한다.
객체가 특정 타입인지 확인할 때 사용한다. 결과는 Bool(true or false) 값을 반환한다.
let animal: Any = "고양이"
if animal is String {
print("animal은 String 타입이에요!")
}
주로 컴파일 시점에 명확히 타입이 보장되는 경우에 사용한다. 보통은 업캐스팅이나 프로토콜 타입으로의 변환에 사용된다.
class Animal {}
class Dog: Animal {}
let dog = Dog()
let animal = dog as Animal // Dog → Animal 업캐스팅
옵셔널 타입으로 결과를 반환하므로, 안전하게 사용할 수 있다. 실패하면 nil이 반환되므로, if let, guard let 등과 함께 사용한다.
let animal: Animal = Dog()
if let dog = animal as? Dog {
print("animal은 실제로 Dog 타입이에요!")
}
실패하면 런타임 오류가 발생하므로, 변환이 반드시 성공한다고 확신할 때 사용하는 것이 좋다. 🚨절대로 확신이 없으면 as!는 피하는 게 좋다. as?가 더 안전하다.
let animal: Animal = Dog()
let dog = animal as! Dog // 다운캐스팅 성공 (실패하면 앱 종료됨)
| 키워드 | 설명 | 결과 타입 | 실패 시 동작 |
|---|---|---|---|
is | 타입인지 확인 | Bool | - |
as | 업캐스팅 / 명확한 변환 | 명시된 타입 | 컴파일 오류 |
as? | 조건부 다운캐스팅 | 옵셔널 | nil 반환 |
as! | 강제 다운캐스팅 | 명시된 타입 | 런타임 오류 |