iOS/Swift
[Swift] 타입 캐스팅(Type Casting), 업 캐스팅(Up Casting), 다운 캐스팅(Down Casting)
겸둥이xz
2021. 4. 9. 02:38
반응형
스위프트 타입 캐스팅
- 인스턴스의 타입을 확인하는 용도로 쓰입니다.
- 클래스의 인스턴스를 부모(Up) 혹은 자식(Down) 클래스의 타입으로 사용할 수 있는지 확인하는 용도
- is, as를 사용합니다
타입 캐스팅 예제
class Person {
var name: String = ""
func breath() {
print("숨을 쉽니다.")
}
}
class Student: Person {
var school: String = ""
func goToSchool() {
print("등교를 합니다.")
}
}
class UniversityStudent: Student {
var major: String = ""
func goToLib() {
print("도서관을 갑니다..")
}
}
// 인스턴스 생성
var james: Person = Person()
var hana: Student = Student()
var joe: UniversityStudent = UniversityStudent()
is를 이용한 타입확인
var result: Bool
result = james is Person // true
result = james is Student // false
result = james is UniversityStudent // false
result = hana is Person // true
result = hana is Student // true
result = hana is UniversityStudent // false
result = joe is Person // true
result = joe is Student // true
result = joe is UniversityStudent // true
// if
if james is UniversityStudent {
print("james는 대학생입니다.")
} else if james is Student {
print("james는 학생입니다.")
} else if james is Person {
print("james는 사람입니다.")
} // james는 사람입니다.
// switch, case
switch james {
case is Person:
print("james는 사람입니다.")
case is Student:
print("james는 학생입니다.")
case is UniversityStudent:
print("james는 대학생입니다.")
default:
print("james는 사람도, 학생도, 대학생도 아닙니다!")
} // james는 사람입니다.
Person is Student 사람은 학생이다.(X) - 모든 사람은 학생이 아니다.
Student is Person 학생은 사람이다.(O)
업 캐스팅(Up Casting)
- as를 사용하여 부모 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해줍니다.
- Any 혹은 AnyObject로도 타입정보를 변환할 수 있습니다.
- 암시적으로 처리되므로 꼭 필요한 경우가 아니면 생략가능합니다.
// UniversityStudent 인스턴스를 생성하여 Person(부모클래스)로 업 캐스팅
var mike: Person = UniversityStudent() as Person
var jenny: Student = Student()
//var jina: UniversityStudent = Person() as UniversityStudent // 컴파일 오류
// UniversityStudent 인스턴스를 생성하여 Any 행세를 할 수 있도록 업 캐스팅
var jina: Any = Person() // as Any 생략가능
다운 캐스팅(Down Casting)
- as?(조건부) 또는 as!(강제) 를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해줍니다.
var optionalCasted: Student?
optionalCasted = mike as? UniversityStudent
optionalCasted = jenny as? UniversityStudent // nil
optionalCasted = jina as? UniversityStudent // nil
optionalCasted = jina as? Student // nil
mike는 UniversityStudent이지만, 현재 Person으로 Up Casting 되어있는 상태입니다.
- var mike: Person = UniversityStudent() as Person
그래서 as?를 통해서 UniversityStudent로 Down Casting이 가능합니다.
2. 강제 다운 캐스팅
- as!를 사용하고, 캐스팅에 실패하면 런타임 오류가 발생합니다. 캐스팅 성공시 일반 타입을 반환합니다.
var forcedCasted: Student
forcedCasted = mike as! UniversityStudent
//forcedCasted = jenny as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! Student // 런타임 오류
<참고자료>
반응형