Swift: Type Casting / 타입 캐스팅

Wooyo·2023년 10월 23일
0
post-thumbnail

1. 타입 캐스팅

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

2. 예제를 위한 클래스 정의

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

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

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

// 인스턴스 생성
var me: Person = Person()
var jimin: Student = Student()
var winter: UniversityStudent = UniversityStudent()

2. 타입 확인

  • is를 사용하여 타입 확인
var result: Bool

result = me is Person // true
result = me is Student // false
result = me is UniversityStudent // false

result = jimin is Person // true
result = jimin is Student // true
result = jimin is UniversityStudent // false

// if or switch 문을 통한 타입 확인
if me is UniversityStudent {
	print("대학생")
} else if me is Student {
	print("학생")
} else if me is Person {
	print("사람")
}
// 사람

switch jimin {
	case is Person:
    	print("사람")
   	case is Student:
    	print("학생")
    case is UniversityStudent:
    	print("대학생")
    default:
    	print("모두 아님")
}
// 사람

3. 업 캐스팅

  • as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입정보 전환
// UniversityStudent 인스턴스를 생성하여 Person 행세를 할 수 있도록 업 캐스팅
var mike: Person = UniversityStudent() as Person
var jenny: Student = Student()
//var jina: UniversityStudent = Person() as UniversityStudent // 컴파일 오류
// UniversityStudent 인스턴스를 생성하여 Any 행세를 할 수 있도록 업 캐스팅
var jina: Any = Person() // as Any 생략가능

4. 다운 캐스팅

  • as? 또는 as! 를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴스 타입정보를 전환
  • 조건부 다운 캐스팅 : as? 를 사용 / 캐스팅에 실패시 nil 반환
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 // 런타임 오류

5. 활용 코드

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()
    }
}
doSomethingWithSwitch(someone: mike as Person) // 멤버쉽 트레이닝을 갑니다 신남!
doSomethingWithSwitch(someone: mike) // 멤버쉽 트레이닝을 갑니다 신남!
doSomethingWithSwitch(someone: jenny) // 등교를 합니다
doSomethingWithSwitch(someone: me) // 숨을 쉽니다
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: me) // 숨을 쉽니다
profile
Wooyo의 개발 블로그

0개의 댓글