카테고리 없음
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
즉 위에처럼 실패하면 아무값이 아나오고 강제추출은 에러가 나는 걸 볼 수 있다.
하루하루 흘러가긴 하지만 그래도 조금은 배우고 적응은 되어가는 것 같아
좌절감은 조금씩 줄어드는 것 같다.
꾸준히 배워보자 아자자!
내가 원하는 어플을 만들때 까지