[Swift 야곰] 2단원. 타입 캐스팅

Jamong·2023년 1월 17일
0

Day 11 - 2023.01.17

스위프트 타입 캐스팅

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

※ 형변환 '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은 대학생입니다

업 캐스팅(Up Casting)

  • 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 생략가능

다운 캐스팅(Down Casting)

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

활용

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) 		// 숨을 쉽니다
profile
새해 목표 : 1일 1 깃, 블로그, 프로그래머스 2문제

0개의 댓글