SMALL
타입 캐스팅
변수나 객체의 타입을 다른 타입으로 변환하는 프로세스
인스턴스의 "타입"을 확인 하거나,
해당 인스턴스를 슈퍼 클래스(부모 클래스)나
하위 클래스(자식 클래스)로 취급하는 방법
is
is 연산자는 타입을 체크하는 연산자로, 비교 결과를 bool 타입을
반환합니다.(타입 체킹)
let char: Character = "A"
print(char is Character)
// 출력값: true
print(char is String)
// 출력값: false
let bool: Bool = true
print(bool is Bool)
// 출력값: true
print(bool is Character)
// 출력값: false
* as, as!, as? *
타입
기본 데이터 타입
(Int, Double, Bool, String) 등
옵셔널
(Optional)
커스텀 데이터 타입
(struct, class, enum, protocol 등)
* 클래스의 상속 *
// Person은 슈퍼 클래스(부모 클래스)
class Person {
}
// Student는 서브 클래스(자식 클래스) - 상속받은 클래스
class Student: Person {
}
// Teacher는 서브 클래스(자식 클래스) - 상속받은 클래스
class Teacher: Person {
}
// 부모 타입 Person 인스턴스는 자식의 타입을 가질 수 없습니다.
let person: Person = Person() - 가능
let person: Student = Person() - 불가능
let person: Teacher = Person() - 불가능
// 자식타입 Student 인스턴스는 자신의 타입과 부모의 타입을 가질 수 있습니다. 자식의 타입은 가질 수 없습니다.
let student: Person = Student() - 가능
let student: Student = Student() - 가능
let student: Teacher = Student() - 불가능
// 자식타입 Teacher 인스턴스는 자신의 타입과 상위 부모의 타입을 가질 수 있습니다. 바로 자기 자신의 부모 타입은 가질 수 없습니다.
let teacher: Person = Teacher() - 가능
let teacher: Student = Teacher() - 불가능
let teacher: Teacher = Teacher() - 가능
as
Upcasting(업캐스팅)
(자식타입으로 지정되있는 것을 부모타입으로 끌어올림)
"as" 연산자는 컴파일 단계에서 캐스팅이 실행
따라서 항상 타입 캐스팅이 성공할 경우에만 사용 가능
캐스팅에 실패할 경우 에러가 발생
캐스팅하려는 타입이 같은 타입 이거나
수퍼클래스 타입이라는 것을 알 때 "as" 연사자를 사용
as?
Downcasting(다운캐스팅)
(부모타입으로 지정되있는 것을 자식타입으로 되려내림)
"as?" 연산자는 런타임에 캐스팅이 실행
성공하면 옵셔널 타입의 인스턴스를 반환하고 실패하면 nil 을 반환
실패할 가능성이 있으면 "as?"를 사용하는 것을 선호
as!
Downcasting(다운캐스팅)
(부모타입으로 지정되있는 것을 자식타입으로 되려내림)
"as!" 연산자는 런타임에 특정 타입으로 강제 캐스팅
강제 타입 캐스팅에 실패할 경우 런타임 에러가 발생
캐스팅에 성공한 경우 인스턴스를 반환 (옵셔널 x)
class Person {
var id = 0
var name = "name"
var email = "hgk@gmail.com"
}
class Worker: Person {
// id 부모에게서 물려받음
// name 부모에게서 물려받음
// email 부모에게서 물려받음
var salary = 300
}
class Programmer: Worker {
// id 부모에게서 물려받음
// name 부모에게서 물려받음
// email 부모에게서 물려받음
// salary 부모에게서 물려받음
var lang = "Swift"
}
// 업캐스팅 - as
let person1 = Person()
let worker1 = Worker()
let programmer1 = Programmer()
let personList = [person1, worker1, programmer1] // 타입을 선언하지 않았지만 Person 타입으로 인식 -> 즉 업캐스팅이 되었음
/*
위 let personList = [per ... 부분을 보고 이상함을 감지 해야합니다.
이유는 위 업캐스팅에서 정의한 부부들에 상수들에게 타입을 적어 주지 않았습니다.
그렇다면 타입추론에 의해서 각자 person1은 Person타입이되고 worker1은 Worker타입,
programmer1은 Programmer타입으로 추론이 되는 것이고, 근데 정의된 personList에서는
다 타입이 다른 상태에서 배열에 들어갔는데 그럼에도 불구하고 에러가 나지 않는 이유는
컴파일러가 업캐스팅을 했기 때문에 Person 타입으로 묶였기 때문이에요.
3개의 타입의 연관성을 비교를 하는데 Person 타입으로 묶으면 3개의 타입이 묶일 수 있기 때문에
worker는 Person을 상속 받았으며, programmer는 worker를 상속 받았으니 Person을 상속 받은 상태입니다.
그렇기 때문에 각각의 3개의 타입은 Person이라는 공통의 조상으로 묶일 수 있는 것입니다.
*/
personList[1].name
//personList[1].salary // Person 타입으로 보고 있기 때문에 salary에 접근하지 못함
let worker2 = Worker()
worker2.salary
// 인스턴스와 worker의 경우는
let workerPerson = worker2 as Person
//workerPerson.salary // Person 타입으로 보고 있기 때문에 salary에 접근하지 못함
// 다운캐스팅 - as? / as!
// as?
let pro = programmer1 as? Programmer // 타입 변환이 될 수도 있고 안될 수도 있기 때문에 옵셔널을 리턴
if let person2 = programmer1 as? Programmer {
person2.lang
}
if let person3 = worker1 as? Programmer { // 다운캐스팅 해당 안됨
person3.lang
}
// as!
let pro2 = worker2 as! Programmer // Error : 타입 변환 실패시 오류
728x90
'IOS > Swift-Study' 카테고리의 다른 글
[Swift-Study] 심화 문법종합반 2주차 2일차 정리 - 클로저 (0) | 2024.03.22 |
---|---|
[Swift-Study] 심화 문법종합반 2주차 2일차 정리 - 접근제한자 (0) | 2024.03.12 |
[Swift-Study] 심화 문법종합반 2주차 1일차 정리 - 프로퍼티 옵저버 (0) | 2024.03.12 |
[Swift-Study] 기초 문법종합반 1주차 4일차 정리 - 초기화 (0) | 2024.03.12 |
[Swift-Study] 기초 문법종합반 1주차 4일차 정리 - 상속 (0) | 2024.03.12 |