231208_TIL 타입 캐스팅

ykyo·2023년 12월 8일

타입 캐스팅

  1. is
  • is 연산자는 타입을 체크하는 연산자, 비교 결과를 bool 타입으로 반환
let char: Character = "A"

print(char is Character)
// true
print(char is String)
// false
  1. as, as!, as?
  • as

    • as 연산자는 컴파일 단계에서 캐스팅이 실행됨. 타입 캐스팅이 성공할 경우에만 사용가능
    • 캐스팅에 실패할 경우 에러
    • 캐스팅하려는 타입이 같은 타입 이거나 수퍼클래스 타입이라는 것을 알 때 as 연산자 사용
  • as?

    • as? 연산자는 런타임에 캐스팅 실행
    • 성공하면 옵셔널 타입의 인스턴스를 반환하고 실패하면 nil 반환
    • 실패할 가능성이 있으면 as? 를 사용하는 것이 좋음
  • as!

    • as! 연산자는 런타임에 특정 타입으로 강제 캐스팅함
    • 강제 타입 캐스팅에 실패할 경우 런타임 에러가 발생할 수 있음
    • 캐스팅에 성공한 경우 인스턴스를 반환 (옵셔널 x)
class Person{
	var id = 0
    var name = "name"
    var email = "hgk@gmail.com"
}

class Worker: Person{
	// id
    // name
    // eamil
    var salary = 300
}

class Programmer: Worker{
	// id
    // name
    // eamil
    // salary
    var lang = "Swift"
}
------------------------------------------------------------------------------------------
// 업캐스팅 - as
let person1 = Person()
let worker1 = Worker()
let programmer1 = Programmer()

let personList = [person1, worker1, programmer1] 
// 타입을 선언하지 않았지만 Person 타입으로 인식 -> 업캐스팅이 된 상황
personList[1].name
//personList[1].salary // Person 타입으로 보고 있기 때문에 salary 에 접근하지 못함

let worker2 = Worker()
worker2.salary

let workerPerson = worker2 as Person
//workerPerson.salary // Person	타입으로 보고 있기 때문에 salary 에 접근하지 못함
------------------------------------------------------------------------------------------
// 다운캐스팅 - as? / as!
// as?
let pro = programmer1 as? Programmer // 타입 변환이 될 수도 있고 안 될 수도 있기 때문에 옵셔널 리턴

lf let person2 = programmer1 as? Programmer {
	person2.lang //실행 됨
}

if let person3 = worker1 as? Programmer {
	person3.lang //실행 안됨
}

// as!
let pro2 = worker2 as! Programmer // Error : 타입 변환 실패시 오류
profile
for ios, swift, etc.

0개의 댓글