-
as 연산자 / is 연산자Swift/swift 문법 2023. 5. 26. 19:36
상속은 필요한 데이터를 추가하는 메모리 구조
undergraduate 타입은 person을 상속받는다.
메모리 구조 -> person에서 undergraduate의 프로퍼티가 추가된다.
is 연산자
: 특정 타입이 맞는지 확인한다.
반환값: Bool type
as 연산자
: 인스턴스 타입의 힌트를 변경하는 연산자.
다운캐스팅에 성공할 경우, 접근가능한 항목(상속받은 클래스의 프로퍼티)의 수를 늘려준다.
let person: Person = Undergraduate()
-> Person: 변수에 정의된 타입
Undergraduate: 실제 메모리 공간의 인스턴스
Person type보다 Undergraduate type 항목의 개수가 더 많다.
하지만 현재 Person type으로 person변수에는 정의되어 있으므로 Person type의 프로퍼티만 접근 가능하다.(오개념)-> person의 타입은 Undergraduate이나, Person의 프로퍼티에만 접근할 수 있다.
let apple:Fruit = Rosaceae() print(type(of: apple)) ////Rosaceae
type을 print해보면 Rosaceae type으로 출력된다.
하지만 Rosaceae class에서 추가된 프로퍼티에는 접근 불가.
-> 타입 캐스팅 필요.
접근 가능한 프로퍼티를 늘려주기 위해서는 as? 연산자로 타입을 바꾸어 주어야 한다.
ex. if let apple = person as? Rosaceae
person을 Rosaceae로 바인딩해서 사용
성공하면 옵셔널 값이 추출
[코드 예시]
class Fruit { var flower:String var tree:Bool init() { self.flower = "rose" self.tree = false } } //fruit을 상속받는 Rosaceae class Rosaceae: Fruit { var color : String override init() { //자신의 메모리 구조를 초기화 한 후 상위(부모) 속성의 메모리 이니셜라이저 호출이 필요. self.color = "blue" super.init() } } //타입 힌트는 Fruit이지만 실제 메모리 구조는 Rosaceae로 생성 let apple:Fruit = Rosaceae() print(type(of: apple)) ////Rosaceae apple.tree apple.flower //Fruit type의 프로퍼티에만 접근할 수 있다. (에러) //apple.color //apple 인스턴스를 Rosaceae로 타입캐스팅하여 appleWithRose에 담는다. if let appleWithRose = apple as? Rosaceae { print(type(of: apple)) //Rosaceae print(type(of: appleWithRose)) //Rosaceae //Rosaceae type의 프로퍼티 flower에 접근 가능하도록 변경됨. print(appleWithRose.flower) }
'Swift > swift 문법' 카테고리의 다른 글
Defer 문 (0) 2023.06.05 열거형 - 연관값, 열거형 (0) 2023.06.05 Protocol의 메모리 주소와 프로토콜의 확장 구현시 실행 메서드 (0) 2023.05.13 [swift] 타입의 종류 (0) 2023.05.13 문자열: 출력 형식 지정자 (0) 2023.05.08