타입 캐스팅 (Type Casting)
- 인스턴스의 "타입"을 확인하거나, 해당 인스턴스를 슈퍼 클래스나 하위 클래스로 취급하는 방법
- Swift에서 타입 캐스팅은 "is"나 "as" 연산자로 구현
- 타입 캐스팅을 사용하여 타입이 프로토콜에 적합한지 여부도 확인 가능
is
- 타입을 체크하는 연산자
- 런타임 시점에 실제 체크가 이루어짐
- 반환 값은 Bool 형
- 표현식이 Type과 동일하거나, 표현식이 Type의 서브클래스인 경우 True를 반환
- 이 외에는 False 반환
//1
let char: Character = "A"
char is Character // true
char is String // false
//2
class Animal { }
class Dog: Animal { }
let dog: Dog = .init()
dog is Dog // true
dog is Animal // true
1. 동일한 타입을 확인할 때 사용
2. Animal 클래스를 Dog란 클래스가 "상속" 받을 경우, dog 인스턴스는 Animal 클래스의 서브 클래스이기 때문에 true 반환
as
- 표현식(의 타입)이 변화할 Type과 호환된다면, 변환할 Type으로 캐스팅된 인스턴스를 리턴
- 상속 관계인 업캐스팅(Upcasting)과 다운 캐스팅(Downcasting)에서 사용
- Any와 AnyObject 타입을 사용할 경우, 상속 관계가 아니어도 예외적으로 사용 가능
업캐스팅 (Upcasting)
- 서브 클래스 인스턴스를 "슈퍼 클래스의 타입"으로 참조
- 업캐스팅은 항상 성공
- as 연산자를 사용 (컴파일 시점에 캐스팅 가능 여부를 결정)
- as : "컴파일 시점"에 타입 캐스팅(업캐스팅)을 하며, 실패할 경우 에러가 발생 패턴 매칭(switch)에도 사용
class Animal {
let name: String = "Pobi"
}
class Dog: Animal {
let color: String = "White"
}
// 1. as를 사용한 업캐스팅
let animal1 = Dog.init() as Animal
animal1.name //Pobi
animal1.color // Value of type 'Animal' has no member 'color'
// 2. Type Annotation을 사용한 업캐스팅
let animal2: Animal = Dog.init()
Dog 타입의 인스턴스를 생성하지만, 이를 Animal 타입으로 업캐스팅해서 animal에 저장
animal이 Dog란 서브 클래스를, Animal이란 슈퍼클래스 타입으로 참조하는"업캐스팅"을 한 것이기 때문에, animal의 접근 범위가 "Animal" 멤버로 한정되는 것
따라서 Animal 클래스의 멤버인 name엔 접근할 수 있지만, 서브 클래스 Dog의 멤버인 color에는 접근할 수 없음
다운캐스팅 (Downcasting)
- 슈퍼 클래스 인스턴스를 "서브 클래스의 타입"으로 참조
- 업캐스팅된 인스턴스를 다시 원래 서브 클래스 타입으로 참조할 때 사용
- 다운 캐스팅은 실패할 수 있기 때문에 as? 또는 as! 연산자 사용
- as? : "런타임 시점"에 타입 캐스팅(다운 캐스팅)을 하며, 실패할 경우 nil을 리턴
- as! : "런타임 시점"에 타입 캐스팅(다운 캐스팅)을 하며, 실패할 경우 에러 발생
class Animal {
let name: String = "Pobi"
}
class Dog: Animal {
let color: String = "White"
}
let animal = Dog.init() as Animal
var dog: Dog = animal as! Dog
dog.name //Pobi
dog.color //White
반응형
'⌨️ Language > swift' 카테고리의 다른 글
[Swift] 프로토콜 (Protocol) (0) | 2023.02.06 |
---|---|
[Swift] assert와 guard (0) | 2023.02.06 |
[Swift] 클래스(Class)와 구조체(Struct) (0) | 2023.02.06 |
[Swift] 옵셔널 (Optional) (0) | 2023.02.06 |
[Swift] 열거형 (Enumerations) (0) | 2022.02.08 |
댓글