728x90
반응형
스위프트의 타입캐스팅은
- 인스턴스의 타입을 확인하는 용도
- 클래스의 인스턴스를 부모/자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도
로 사용된다.
키워드로는 is, as 를 사용한다.
기존의 다른 언어들에서는 다음과 같은 식으로 타입캐스팅을 해준다.
let someInt: Int = 100
let someDouble: Double = Double(someInt)
하지만 스위프트에서 이렇게 하는 것은 타입캐스팅이 아니고, 그냥 인스턴스를 하나 더 생성하게 되는 것이다.
- 실습 코드
/* -------------------- 타입캐스팅을 위한 클래스 정의 -------------------- */
class Person {
var name: String = ""
func breath() {
print("숨을 쉽니다.")
}
}
class Student: Person {
var school: String = ""
func goToSchool() {
print("등교를 합니다.")
}
}
class UniversityStudent: Student {
var major: String = ""
func goToMT() {
print("멤버쉽 트레이닝을 갑니다 신남!")
}
}
var kybeen: Person = Person()
var hana: Student = Student()
var jason: UniversityStudent = UniversityStudent()
/* -------------------- 타입 확인 -------------------- */
// is를 사용하여 타입을 확인
var result: Bool
result = kybeen is Person // true
result = kybeen is Student // false
result = kybeen is UniversityStudent // false
result = hana is Person // true
result = hana is Student // true
result = hana is UniversityStudent // false
result = jason is Person // true
result = jason is Student // true
result = jason is UniversityStudent // true
if kybeen is UniversityStudent {
print("kybeen은 대학생입니다.")
} else if kybeen is Student {
print("kybeen은 학생입니다.")
} else if kybeen is Person {
print("kybeen은 사람입니다.")
} // kybeen은 사람입니다.
/* -------------------- 업 캐스팅 --> 많이 사용되지는 X -------------------- */
// as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입 정보를 전환해준다.
// Any 혹은 AnyObject로도 타입정보를 변환할 수 있다.
// 암시적으로 처리되므로 생략해도 무방함
// UniversityStudent는 Person타입의 자식 클래스이기 때문에 Person타입의 변수에 인스턴스 할당 가능
var mike: Person = UniversityStudent() as Person
var jenny: Student = Student()
//var jina: UniversityStudent = Person() as UniversityStudent // 컴파일 오류
var jina: Any = Person() // as Any 생략 가능
/* -------------------- 다운 캐스팅 -------------------- */
// as? 또는 as!를 사용하여 자식클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스의 타입 정보를 전환해준다.
/* 조건부 다운 캐스팅 - as? */
var optionalCasted: Student?
optionalCasted = mike as? UniversityStudent
// 타입 캐스팅 실패 시에는 nil 반환 (옵셔널)
optionalCasted = jenny as? UniversityStudent // nil
optionalCasted = jina as? UniversityStudent // nil
optionalCasted = jina as? Student // nil
/* 강제 다운 캐스팅 - as! */
var forcedCasted: Student
forcedCasted = mike as! UniversityStudent
//forcedCasted = jenny as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! UniversityStudent // 런타임 오류
//forcedCasted = jina as! Student // 런타임 오류
/* -------------------- 타입캐스팅 활용 -------------------- */
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: kybeen)
// 숨을 쉽니다.
- is를 사용한 타입 확인
is 키워드를 통해서 인스턴스를 확인하여 bool값을 반환받을 수 있다.
- as를 사용한 업 캐스팅
as 키워드를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 타입 정보를 전환해준다. (업 캐스팅은 많이 사용되지는 X)
- as? / as!를 사용한 다운 캐스팅
as? 또는 as!를 사용하여 자식클래스의 인스턴스로 사용할 수 있도록 타입 정보를 전환해준다.
- 타입 캐스팅 활용
728x90
반응형
'Swift' 카테고리의 다른 글
[ Swift ] Swift 기초 문법14 - 프로토콜 (0) | 2023.02.19 |
---|---|
[ Swift ] Swift 기초 문법13 - assert와 guard (0) | 2023.02.19 |
[ Swift ] Swift 기초 문법11 - 옵셔널 체이닝과 nil 병합 연산자 (0) | 2023.02.19 |
[ Swift ] Swift 기초 문법10 - 인스턴스의 생성과 소멸 (0) | 2023.02.19 |
[ Swift ] Swift 기초 문법9 - 프로퍼티 (0) | 2023.02.17 |