Day 11 - 2023.01.17
※ 형변환 'ex. let someDouble = Duble(2)' 타입 캐스팅이 아니라 새로운 값을 생성하는 것이다.
ex.swift
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 jamong: Person = Person()
var hana: Student = Student()
var jason: UniversityStudent = UniversityStudent()
is
를 사용하여 타입을 확인한다.
var result: Bool
result = jamong is Person // true
result = jamong is Student // false
result = jamong 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 jamong is UniversityStudent {
print("jamong은 대학생입니다.")
} else if jamong is Student {
print("jamong은 학생입니다.")
} else if jamong is Person {
print("jamong은 사람입니다.")
}
// jamong은 사람입니다.
// switch 가장 먼저 만족하는 조건 수행
switch jason {
case is Person:
print("jason은 사람입니다")
case is Student:
print("jason은 학생입니다")
case is UniversityStudent:
print("jason은 대학생입니다")
default:
print("jason은 사람도, 학생도, 대학생도 아닙니다")
}
// jason은 사람입니다
switch jason {
case is UniversityStudent:
print("jason은 대학생입니다")
case is Student:
print("jason은 학생입니다")
case is Person:
print("jason은 사람입니다")
default:
print("jason은 사람도, 학생도, 대학생도 아닙니다")
}
// jason은 대학생입니다
as
를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보를 전환해준다.Any
혹은 AnyObject
로도 타입정보를 변환할 수 있다.// UniversityStudent 인스턴스를 생성하여 Person 행세를 할 수 있도록 업 캐스팅한다.
var mike: Person = UniversityStudent() as Person
// 컴파일 오류
var jina: UniversityStudent = Person() as UniversityStudent
var jenny: Student = Student()
// UniversityStudent 인스턴스를 생성하여 Any 행세를 할 수 있도록 업 캐스팅
var jina: Any = Person() // as Any 생략가능
as?
또는 as!
를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스의 타입정보를 전환해준다.
as?
를 사용한다.var optionalCasted: Student?
optionalCasted = mike as? UniversityStudent
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 doSomethingWithSwitch(someone: Person) [
switch someone {
case is UniversityStuden:
(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: jamong) // 숨을 쉽니다
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: jamong) // 숨을 쉽니다