타입 캐스팅
- 인스턴스의 타입을 확인하는 용도
- 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도
- is, as 사용
//예제 클래스들
class Person {
var name: String = ""
func breath() {
print("숨 쉰다!!!!!")
}
}
class Student {
var school: String = ""
func goToSchool() {
print("학교 쨀 사람?")
}
}
class UniversityStudent: Student {
var major: String=""
func goToMT() {
print("니 술 좀 묵나? 일로 와바라 ㅋㅋ")
}
}
//인스턴스 생성
var park: Person = Person()
var kang: Student = Student()
var wook: UniversityStudent = UniversityStudent()
타입 확인
is를 사용하여 타입을 확인하자
var result: Bool
result = park is Person // true
result = park is Student // false
result = park is UniversityStudent // false
result = kang is Person // true
result = kang is Student // true
result = kang is UniversityStudent // false
result = wook is Person // true
result = wook is Student // true
result = wook is UniversityStudent // true
if park is UniversityStudent {
print("임마 학식이네 ㅋㅋ")
} else if park is Student {
print("임마 급식이네 ㅋㅋ")
} else if park is Person {
print("임마 사람이네 ㅋㅋ")
} // 임마 사람이네 ㅋㅋ
switch wook {
case is Person:
print("wook은 사람이네 ㅋㅋ")
case is Student:
print("wook은 급식이네 ㅋㅋ")
case is UniversityStudent:
print("wook은 학식이네 ㅋㅋ")
default:
print("wook은 사람도, 학생도, 대학생도 아닌 진짜 아무것도 아닙니다")
} // wook은 사람이네 ㅋㅋ
switch wook {
case is UniversityStudent:
print("wook은 학식이네 ㅋㅋ")
case is Student:
print("wook은 급식이네 ㅋㅋ")
case is Person:
print("wook은 사람이네 ㅋㅋ")
default:
print("wook은 사람도, 학생도, 대학생도 아닌 진짜 아무것도 아닙니다")
} // wook은 학식이네 ㅋㅋ
switch의 case에서 순서가 중요하다. 먼저 나오는 게 맞는 게 뜨면 그 case의 구문이 실행된다
업 캐스팅 (Up Casting)
- as를 사용하여 부모 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입 정보를 전환해줌
- Any 혹은 AnyObject로도 타입 정보를 변환할 수 있음
- 암시적으로 처리되므로 꼭 필요한 경우가 아니라면 생략해도 무방
//UniversityStudent 인스턴스를 생성하여 Person 행세를 할 수 있도록 해보자 by '업캐스팅'
var mike: Person = UniversityStudent() as Person
var jenny: Student = Student()
//컴파일 오류
var jina: UniversityStudent = Person() as UniversityStudent
//오류가 뜨는 이유는 Person은 UniversityStudent가 될 수 없기 때문
//UniversityStudent 인스턴스를 생성하여 Any 행세를 할 수 있도록 해보자 by '업캐스팅'
var jina: Any = Person() //as Any 생략 가능
다운 캐스팅(Down Casting)
as? 또는 as! 를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스의 타입 정보를 전환해줌
A. 조건부 다운 캐스팅
- as? 사용
- 캐스팅에 실패하면 ( = 캐스팅하려는 타입이 부합하지 않는 인스턴스라면 ) nil 반환. 그래서 결과의 타입은 옵셔널
var optionalCasted: Student?
optionalCasted = mike as? UniversityStudent
optionalCasted = jenny as? UniversityStudent //nil
optionalCasted = jina as? UniversityStudent //nil
optionalCasted = jina as? Student //nil
B. 강제 다운 캐스팅
- as! 사용
- 캐스팅에 실패하면 ( = 캐스팅하려는 타입이 부합하지 않는 인스턴스라면 ) 런타임 오류
- 캐스팅에 성공하면 옵셔널이 아닌 일반 타입을 반환
var forcedCasted: Student
forcedCasted = mike as! UniversityStudent
//forcedCasted = jenny as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! Student // 런타임 오류
활용
func doSomethingWithSwitch(someone: Person) {
switch someone {
case is UniversityStudent:
(someone as! UniversityStudent).goToMT()
case is Student:
(someone as! Student).goToSchool()
case is Person:
(someone as! Person).breath()
}
}
doSomethingWithSwitch(someone: mike as Person) // 니 술 좀 묵나? 일로 와바라 ㅋㅋ
doSomethingWithSwitch(someone: mike) // 니 술 좀 묵나? 일로 와바라 ㅋㅋ
doSomethingWithSwitch(someone: jenny) // 학교 쨀 사람?
doSomethingWithSwitch(someone: park) // 숨 쉰다!!!!!
func doSomething(someone: Person) {
if let universityStudent = someone as? UniversityStudent {
universityStudent.goToMT()
} else if let student = someone as? Student {
student.goToSchool()
} else if let person = someone as? Person {
person.breath()
}
}
doSomething(someone: mike as Person) // 니 술 좀 묵나? 일로 와바라 ㅋㅋ
doSomething(someone: mike) // 니 술 좀 묵나? 일로 와바라 ㅋㅋ
doSomething(someone: jenny) // 학교 쨀 사람?
doSomething(someone: park) // 숨 쉰다!!!!!
'iOS > Swift' 카테고리의 다른 글
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 26. 프로토콜 (0) | 2021.07.29 |
---|---|
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 25. assert / guard (0) | 2021.07.29 |
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 23. 옵셔널 체이닝과 nil 병합 (0) | 2021.07.25 |
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 22. 인스턴스 생성 / 소멸 (init / deinit) (0) | 2021.07.24 |
[iOS 프로그래밍을 위한 스위프트 기초] Ch2. 다양한 표현 및 확장 - 21. 상속 (클래스의 상속) (2) | 2021.07.24 |