^야곰님의 강좌^

타입캐스팅이란?

인스턴스의 타입을 확인하거나 인스턴스를 같은 계층에 있는 다른 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 //런타임 에러