타입 캐스팅

- 인스턴스의 타입을 확인하는 용도 또는 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도로 사용

- 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
Posted by khon98
,