[Swift 기본 문법] typeCasting

dora·2024년 3월 16일

Swift 기본 문법

목록 보기
8/12

타입 캐스팅

swift의 타입 캐스팅은 instance의 타입을 확인하는 용도 또는 클래스의 인스턴스를 부모 혹은 자식 클래스의 타입으로 사용할 수 있는지 확인하는 용도이다.

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 dora: Person = Person()
var hana: Student = Student()
var jason: UniversityStudent = UniversityStudent()

'is'를 사용하여 타입 확인

var result: Bool

result = dora is Person
result = dora is Student
result = dora 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 와 switch 문에서 활용

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

switch jason{
case is Person:
    print("jason은 사람입니다")	
case is Student:
	print("jason은 학생입니다")
case is UniversityStudent:
	print("jason은 사람도, 학생도, 대학생도 아닙니다")
}

Upcasting

많이 사용되지는 않으나, as를 사용하여 부모클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 타입 정보를 전환해 준다.

  • Any 혹은 AnyObject로도 타입 정보를 변환할 수 있다.
  • 암시적으로 처리되므로 생략해도 무방하다.
var mike: Person = UniversityStudent() as Person
var jenny: Student = Student()

var jina: Any = Person()

Downcasting

as? 또는 as!를 사용하여 자식 클래스의 인스턴스로 사용할 수 있도록 컴파일러에게 인스턴슷의 타입 정보를 전환해 준다.

// 조건부 다운 캐스팅
var optionalCasted: Student?

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

//강제 다운 캐스팅
var forcedCasted: Student

var forcedCasted: Student()
optionalCasted = mike 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()
    }
}

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

0개의 댓글