타입 캐스팅
- 인스턴스의 타입을 확인하는 용도 또는 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도로 사용
- is, as를 사용함
업 캐스팅
- as를 사용하여 부모 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입 정보를 전환해줌
- Any 혹은 AnyObject로도 타입 정보를 변환할 수 있음
- 암시적으로 처리되므로 생략해도 무방함
다운 캐스팅
- as?(조건부 다운 캐스팅) 또는 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 ptToMT() {
print("멤버쉽 트레이닝을 갑니다")
}
}
var khon: Person = Person()
var khon01: Student = Student()
var khon02: UniversityStudent = UniversityStudent()
// 타입 확인
// is를 사용하여 타입을 확인 함
// 연산의 결과는 true, false로 나옴
var result: Bool
// khon이라는 변수안에 인스턴스가 Person 타입이면 true 아니면 false
result = khon is Person // true
result = khon is Student // flase
result = khon is UniversityStudent // false
// Strudent 클래스의 khon01은 Person 클래스를 상속 받았기 때문에 Person도 true
result = khon01 is Person // true
result = khon01 is Student // true
result = khon01 is UniversityStudent // false
result = khon02 is Person // true
result = khon02 is Student // true
result = khon02 is UniversityStudent // true
if khon is UniversityStudent {
print("khon은 대학생입니다") // khon은 사람이므로 이 문구는 넘어감
} else if khon is Student {
print("khon은 학생입니다") // khon은 사람이므로 이 문구는 넘어감
} else if khon is Person {
print("khon은 사람입니다")
}
// khon은 사람입니다
switch khon01 {
case is Person:
print("khon01은 사람입니다")
case is Student:
print("khon01은 학생입니다")
case is UniversityStudent:
print("khon01은 대학생입니다")
}
// khon01은 사람입니다
switch khon02 {
case is UniversityStudent:
print("khon02는 대학생입니다")
case is Student:
print("khon02는 학생입니다")
case is Person:
print("khon02는 사람입니다")
}
// khon02는 대학생입니다
// 업 캐스팅
var khon03: Person = UniversityStudent() as Person
var khon04: Studnet = Student()
var khon05: Any = Person() // Any 타입은 어떤 타입도 들어 올 수 있음, as Any 생략 가능
// 조건부 다운 캐스팅 / as?
var optionalCasted: Student?
// 사람 타입으로 지정되어 있는데 학생일 수 있느냐 이런것들을 물어봄
optionalCasted = khon03 as? UniversityStudent
optionalCasted = khon04 as? UniversityStudent // nil
optionalCasted = khon05 as? UniversityStudent // nil
optionalCasted = khon05 as? Student // nil
// 강제 다운 캐스팅 / as!
var forcedCasted: Student
optionalCasted = khon03 as! UniversityStudent
optionalCasted = khon04 as! UniversityStudent // 오류 발생
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()
}
}
// if let 구문을 사용하게 되면 캐스팅과 동시에 인스턴스를 반환 받아서 옵셔널을 추출해서 쓸 수 있음
func doSomething(someone: Person) {
if let unversityStudent = someone as? UniversityStudent { // 옵셔널 결과 값을 받아와서
unversityStudent.goToMT() // 인스턴스를 옵셔널 추출해서 사용하게 됨
} else if let student = someone as? Student {
student.goToSchool()
} else if let person = someone as? Person {
person.breath()
}
}
doSomething(someone: khon03 as person)
// 멤버쉽 트레이닝을 갑니다
doSomething(someone: khon03)
// 멤버쉽 트레이닝을 갑니다
doSomething(someone: khon04)
// 등교를 합니다
doSomething(someone: khon)
// 숨을 쉽니다
'Swift > 문법' 카테고리의 다른 글
프로토콜(protocol) (0) | 2021.01.30 |
---|---|
assert와 guard(assertion / early exit) (0) | 2021.01.30 |
옵셔널 체이닝 / nil 병합 연산자 (0) | 2021.01.29 |
인스턴스의 생성과 소멸(init / deinit) (0) | 2021.01.29 |
상속(inheritance) (0) | 2021.01.28 |