TypeCasting

김윤홍·2024년 6월 14일
post-thumbnail

TypeCasting

타입 캐스팅은 인스턴스의 타입을 확인 하거나, 해당 인스턴스를 슈퍼 클래스나 하위 클래스로 취급한다
또한 프로토콜의 적합여부 확인도 가능하다.

is


let str: String = "hong"
 
str is String       // true
str is Int          // false
 
 
let bool: Bool = true
 
bool is Bool            // true
bool is Character 

클래스의 상속을 받은 경우에도 사용할 수 있다


class Human {
    let name: String
    init(name: String) {
        self.name = name
    }
}
class Teacher: Human { }
class Student: Human { }
 
let teacher = Teacher()
teacher is Teacher      // true
teacher is Human        // true

is로 해당타입을 확인하여 일치하면 true 일치하지 않으면 false를 반환한다.


as, as?, as!

인스턴스의 타입을 확인하거나, 해당 인스턴스를 슈퍼 클래스나 하위 클래스로 취급할 때 사용한다
as연산자는 컴파일 단계에서 캐스팅이 실행되기 때문에 타입 캐스팅이 성공할 경우에만 사용할 수 있다
캐스팅 실패시 에러가 발생하며 캐스팅하려는 타입이 같은 타입이거나 슈퍼 클래스 타입이라는것을 알고 있을때 as를 사용한다


class Human {
	var name: "name"
    var age: 0
    var email: "email"
}

class Teacher: Human {
	var subject = "math"
}

class Student: Human {
	var score: 0
}

let human1 = Human()
let teacher1 = Teacher()
let student1 = Student()

let humanList = [human1, teacher1, student1]

huumanList생성시 human1, teacher1, student1의 공통클래스인 Human타입으로 upcasting된다

upcasting

서브 클래스인스턴스를 상위클래스타입으로 참조한다!
**자식인스턴스 as 부모클래스 --> 부모클래스로 형변환 (업캐스팅)

downcasting

다운캐스팅은 어떤 클래승서 다른 클래스로 변환할 때 안전한 변환을 보장할 수 없으면 컴파일러가 유효하지 않은 변환 시도를 잡아낼 수도 있다

슈퍼 클래스 인스턴스를 "서브 클래스의 타입"으로 참조한다
업캐스팅된 인스턴스를 다시 원래 서브 클래스 타입으로 참조할 때 사용한다
다운 캐스팅은 실패할 수있기에 as?, as! 연산자를 이용한다

downcasting사용예시

class Human {
	var name: "name"
    var age: 0
    var email: "email"
}

class Teacher: Human {
	var subject = "math"
}

class Student: Human {
	var score: 0
}

let human1 = Human()
let teacher1 = Teacher()
let student1 = Student()

if let teacher1 as? Student {
	print(teacher1.subject) //downcasting이 되지않아 출력xx 
}

let teacher2: Teacher? = human1 as? Teacher // nil을 리턴
let teacher2: Teacher = human1 as! Teacher // 런타임 에러!!!

0개의 댓글