[Swift] (기초) Type Casting / 타입 캐스팅 / 다운 캐스팅 / 업 캐스팅

2021. 9. 1. 20:10🍏/Swift 기초 공부

/* 타입 캐스팅 */
// 스위프트의 타입캐스팅은
// 인스턴스의 타입을 확인하는 용도
// 또는 클래스의 인스턴스를
// 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지
// 확인하는 용도로 사용합니다.
// is, as를 사용합니다

let someInt: Int = 100
let someDouble: Double = Double(someInt) // double type의 인스턴스를 하나 더 생성을 해준것. 타입캐스팅 x

class Person {
    var name: String = ""
    func  breath(){
        print("숨을 쉽니다")
    }
}

class Student: Person{
    var school: String = ""
    func goToSchoo() {
        print("등교를 합니다")
    }
}

class UniversityStudent: Student{
    var major: String = ""
    func goToMT() {
        print("멤버쉽 트레이닝을 갑니다.")
    }
}

var chan: Person = Person()
var hana: Student = Student()
var jason: UniversityStudent = UniversityStudent()

var result: Bool

result = chan is Person
result = chan is Student
result = chan is UniversityStudent

result = hana is Person
result = hana is Student
result = hana is UniversityStudent

result = jason is Person
result = jason is Student
result = jason is UniversityStudent

if chan is UniversityStudent{
    print("chan은 대학생입니다")
}else if chan is Student{
    print("chan은 학생입니다")
}else if chan is Person{
    print("chan은 사람입니다")
}

if hana is UniversityStudent{
    print("hana은 대학생입니다")
}else if jason is Student{
    print("hana은 학생입니다")
}else if jason is Person{
    print("hana은 사람입니다")
}

switch jason {
case is UniversityStudent:
    print("jason은 대학생입니다")
case is Person:
    print("jason은 사람입니다")
case is Student:
    print("jason은 학생입니다")
default:
    print("jason은 사람도, 학생도, 대학생도 아닙니다.")
} // jason은 맨위에것.


/* 업 캐스팅 */
//     as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록
//    컴파일러에게 타입정보를 전환해줍니다
//    Any 혹은 AnyObject로도 타입정보를 변환할 수 있습니다.
//    암시적으로 처리되므로 생략해도 무방합니다.

var mike: Person = UniversityStudent() as Person
var jenny: Student = Student()
//var jina: UniversityStudent = Person() as UniversityStudent // 컴파일오류
var jina: Any = Person() // as Any 생략가능

var optionalCasted: Student?

optionalCasted = mike as? UniversityStudent
optionalCasted = jenny as? UniversityStudent
optionalCasted = jina as? UniversityStudent
optionalCasted = jina as? Student

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).goToSchoo()
    case is Person:
        (someone as! Person).breath()
    }
}

doSomethingWithSwitch(someone: mike as Person)
doSomethingWithSwitch(someone: mike)
doSomethingWithSwitch(someone: jenny)
doSomethingWithSwitch(someone: chan)

func doSomething(someone: Person){
    if let universityStudent = someone as? UniversityStudent{
        universityStudent.goToMT()
    }else if let student = someone as? Student{
        student.goToSchoo()
    }else if let person = someone as? Person{
        person.breath()
    }
}

doSomething(someone: mike as Person)
doSomething(someone: mike)
doSomething(someone: jenny)
doSomething(someone: chan)