안녕하세요, 오늘은 TypeCasting에 대해 알아 보겠습니다.
그 전에 많은 분들이 본인이 작성한 변수에 타입이 어떤건지 확인하고 싶으실 때가 있을텐데요, 이럴때는 아래 is 연산자로 해당 변수에 타입을 확인 할 수 있습니다.
A.type check operator
문법: expression is Type
is 연산자로 부르기도 함. 이항 연산자임.
형식을 확인할 대상이 왼쪽 표현식에 옴. 오른쪽에는 언제나 형식이 옴.
1.연산 결과는 두 피연산자의 형식이 동일하다면 true.
2.왼쪽피연산자가 오른쪽과 동일한 상속계층이고 오른쪽이 super클래스면 true
let num = 123
num is Int // true
중요: 컴파일타임이 아닌 런타임에 타입을 체크
B. type casting operator
as연산자라고 부르기도 함.
왼쪽에 표현식이 오고 오른쪽에 형식이 옴.
expression as Type (compile time cast) 주로 bridging에 사용. (예: 구조체인 String자료형은 클래스인 Nsstring자료형과 호환이 가능함. 이 경우는 as만 사용해도 됨. 실패시 컴파일에러가 발생.)
-----------------------------------------------------------------------
expression as? Type (runtime cast) - 런타임에 실행됨. 컴파일 타임에는 결과를 알 수 없음. 캐스팅에 성공하면 캐스팅된 인스턴스를 리턴하고, 실패하면 nil을 리턴함.
expression as! Type
주의: 새로운 인스턴스가 리턴되는게 아니라 이미 존재하는 인스턴스에서 오른쪽 피연산자 형식에 있는 멤버만 접근할 수 있는 임시 인스턴스만 리턴되는 것.
let list = [t, r, s, c]
가장 인접한 슈퍼클래스인 figure 클래스로 업캐스팅 됨.
for item in list {
item.draw()
}
“str” as Int // error
주로 다운캐스팅이나 값형식을 다른형식으로 바꿀때 사용.
t as? Triangle
t as! Triangle
아래와 같이 옵셔널 바인딩과 컨디셔널 캐스팅을 같이 사용하는 것이 좋음.
if let c = upcated as? Circle {
}
let list = [g, t, t, d]
다형성
구조체인 string인 클래스인 nsstring과 호환됨.
let nsstr =”str” as NSString
“str” as Int // error 캐스팅에 실패하면 컴파일 에러가 발생함.
conditional cast도 캐스팅에 성공하면 캐스팅된 인스턴스를 리턴하고 실패하면 nil을 리턴함.
var upcasted: Figure = s
upcasted = s as Figure //이렇게 업캐스팅도 가능.
upcasted as? Square // 원래형식으로 다운캐스팅은 성공.
upcasted as! Square
이런식으로 옵셔널 바인딩과 병행.
if let c = upcasted as? Circle {
}
let list = [t, r, s, c]
배열에는 동일한 형식만 저장할 수 있는데 지금은 서로 다른 형식들을 저장하고 있음.
list배열에 자료형을 보면 가장 인접한 슈퍼클래스로 업캐스팅돼서 저장됨.
figure배열로 되어 있음.
for item in list {
item.draw()
if let c = item as? Circle {
c.radius
}
}
draw메소드를 호출하면 피겨형식에서 호출했지만 overriding된 메소드가 호출됨.(이게 다형성임.)
업캐스팅된 인스턴스에서 메소드를 호출하여도 실제형식에서 오버라이딩한 메소드가 호출됨. 속성은 figure속성에서 선언된 멤버만 접근 할 수 있음. 속성에 접근하고 싶다면 다운캐스팅해서 접근해야 함.
'Swift' 카테고리의 다른 글
Swift - guard 문 (0) | 2020.03.30 |
---|---|
Swift - Comparison Operator (비교연산자) (0) | 2020.03.23 |
Swift - In Out Parameters (입출력 파라미터) (0) | 2020.03.22 |
Swift - Generics(제네릭) (0) | 2020.03.22 |
Swift - Self & Super (0) | 2020.03.22 |