본문 바로가기

Swift

Swift - Type Casting

안녕하세요, 오늘은 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