카테고리 없음

swift 타입 캐스팅에 대해 알아보기

kingarthur 2024. 6. 8. 22:04

오늘은 특강을 들으면서 타입 캐스팅에 대해 공부하게 되었다. 

타입 캐스팅을 간단하게 말하면 

자식은 부모 또는 부모의 부모 즉 조부모 위에껄 타입으로 변경 할 수 있다는 것이다.

그래서 타입이 변경되면 

자식인 나한테 선언한건 불러 올 수 없다는 것이다. 

아무튼 핵심은 그렇게 이해했다 

 

예시를 보면 알 수 있을 것 같다. 

첫번째 그냥 타입을 변경 시킬 때 

class Person {
    var id = 0
    var name = "name"
    var email = "hgk@maile"
}

class Worker: Person {
    var salary = 300
}

class Programe: Worker {
    var lang = "Swift"
}

let person1 = Person()
let Person2 = Worker()
let person3 = Programe()

let personList = [person1, Person2, person3]// 리스트로 묶어버리면 최 상위 부모로 인식되서 부모에 있는것만 부를 수 있다.

personList[2].name

let worker2 = Worker()

worker2.salary

let workerPerson = worker2 as Person //위에처럼 person 타입으로 변경되어 worker 있는 샐러리는 못 부른다. 부모에 있는것만 가능 즉 워커타입에서 펄슨 타입으로 변경한것

workerPerson.email

 

personList를 묶어버리면 최상이 부모의 클래스를 가져오게 된다.

그래서 id, name, email 불러올 수 있으나 자식꺼는 못 불러오게 된다. 

아주 신박한 개념이였다  이유는 모르겠지만 왜 그렇게 햇는지는 아무튼 부모꺼만 가능하다

 

그리고 타입 변경을 해보았을 때 

부모타입으로 변경하면 내가 가지고 있는 것은 호출을 못 하고 부모꺼 밖에 호출을 못 한다. 

 

타입 변경시 닐값이 날 수도 있으니 여기서 as 이용해서 방지하는 방법이 있다.

하지만 as! 강제호출이기 때문에 런타임 오류가 생길 수 있으니 안쓰는게 좋단다. 

as? 닐 값이면 값이 안나오게 설정이 되어 있단다. 타입을 바꾸는데 실패했을때 

아직 어떻게 유용하게 쓸지는 모르겠지만 알아두면 좋은 정보인거 같다.

꼭 guard let 처럼 

as? / as!

as? 타입 변경시 실패하면 nil 나옴

let pro = person3 as? Programe

if let per = person3 as? Programe {
    per.lang
}

if let per2 = Person2 as? Programe {
    per2.lang
}

//as! 타입 변경시 실패하면 에러 발생

let pro3 = Person2 as! Programe

즉 위에처럼 실패하면 아무값이 아나오고 강제추출은 에러가 나는 걸 볼 수 있다. 

 

하루하루 흘러가긴 하지만 그래도 조금은 배우고 적응은 되어가는 것 같아 

좌절감은 조금씩 줄어드는 것 같다. 

꾸준히 배워보자 아자자!

내가 원하는 어플을 만들때 까지