^야곰님의 강좌^
타입캐스팅이란?
인스턴스의 타입을 확인하거나 인스턴스를 같은 계층에 있는 다른 superclass나 subclass로 취급하는 방법
-
is, as 연산자사용
-
타입캐스팅을 이용하면 특정 프로토콜을 따르는지 확인할 수도 있다.
-
실제 인스턴스나 값을 바꾸는 것이 아니라 지정한 타입으로 취급하는 것 뿐!!!!!
예제를 위한 예시 클래스와 객체
class Person {
var name: String
func breath() {
print("숨쉬기")
}
}
class Student: Person {
var school: String
func goToSchool() {
print("등교")
}
}
class HighschoolStudent: Student {
var grade: Int
func takeTheCSAT(){
print("수능시험")
}
}
var yagom: Person = Person()
var hana: Student = Student()
var daeun: HighschoolStudent = HighschoolStudent()
형확인
- is 연산자를 이용하여 특정 인스턴스의 타입을 확인할 수 있다.
예시)
var result: Bool
result = yagom is Person //true
result = yagom is Student //false
result = yagom is HighschoolStudent //false
result = hana is Person //true
result = hana is Student //true
result = hana is HighschoolStudent //false
result = daeun is Person //true
result = daeun is Student //true
result = daeun is HighschoolStudent //true
업캐스팅
- as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해준다.
예시)
var mike: Person = HighschoolStudent() as Person
var jenny: Student = Student()
//var jina: HighschoolStudent = Person() as HighschoolStudent //컴파일 오류
var jina: Any = Person() //as Any 생략가능
-
특별한타입 두가지
-
Any : 함수 타입을 포함한 모든 타입
-
AnyObject : 모든 클래스 타입의 인스턴스
다운캐스팅
-
특정 클래스 타입의 상수나 변수는 특정 서브클래스의 인스턴스를 참조하고 있을 수 있다.
-
as? 와 as! 연산자를 이용해 어떤 타입의 인스턴스인지 확인할 수 있다.
-
as?를 사용하는 경우
: 특정 타입이 맞는지 확신할 수 없을 때
옵셔널 값을 반환하기 때문에 런타임 에러가 발생하지 않는다.
- as!를 사용하는 경우
: 특정 타입이라는 것이 확신 할 수 있을 때
단, as!로 다운캐스팅을 했는데 지정한 타입이 아니라면 런타임 에러 발생
var optionalCasted: Student?
optionalCasted = mike as? HighschoolStudent
optionalCasted = jenny as? HighschoolStudent //nil
optionalCasted = jina as? HighschoolStudent //nil
var forcedCasted: Student
forcedCasted = mike as! HighschoolStudent
forcedCasted = jenny as! HighschoolStudent //런타임 에러
forcedCasted = jina as! HighschoolStudent //런타임 에러
forcedCasted = jina as! Student //런타임 에러
댓글