Dog foot print

[SWIFT] Type casting 본문

IOS/Swift

[SWIFT] Type casting

개 발자국 2021. 7. 20. 18:53

Type casting

타입 캐스팅은 어떤 클래스가 슈퍼 클래스 혹은 자신을 상속 받은 서브 클래스 로 타입으로 간주되는 것을 의미합니다. 이를 한국어로는 형변환이라고 합니다.

Note : 부모와 자식간의 관계를 가진 클래스 중에서는 타입 캐스팅으로 인하여, 오류가 발생하는 경우가 존재합니다.

Up Casting , Down Casting

타입 캐스팅은 캐스팅 전 타입과 캐스팅 후 타입의 상위/하위 관계에 따라 업 캐스팅다운 캐스팅으로 나뉩니다. 이를 구분하는 조건은 다음과 같습니다.

Upcasting

  • 하위 클래스 타입을 상위 클래스 타입으로 변환할 때
  • 캐스팅하기 전 타입이 하위 클래스, 캐스팅한 후 타입이 상위 클래스일 때
  • 캐스팅한 결과, 캐스팅 하기 전 타입보다 추상화 될 때(로직이 더 구체적이지 않다.)
  • 일반적으로 캐스팅 과정에서 오류가 발생할 가능성이 없음

Downcasting

  • 상위 클래스 타입을 하위 클래스 타입으로 캐스팅 할 때
  • 캐스팅하기 전 타입이 상위 클래스, 캐스팅한 후 타입이 하위 클래스
  • 캐스팅한 결과, 캐스팅하기 전 타입보다 구체화 될 때
  • 캐스팅 과정에서 오류가 발생할 가능성이 있음
  • 오류에 대한 처리 방식에 따라 옵셔널 캐스팅과 강제 캐스팅으로 나뉘어 짐

업 캐스팅 의 경우 더 추상화 되었기 때문에, 오류가 발생할 가능성이 없는 안전한 캐스팅이다. 그러나, 다운 캐스팅은 슈퍼 클래스에서 서브 클래스로 변환하는 만큼 로직이 더 구체화 되며, 슈퍼 클래스에서 존재하지 않는 메서드나 프로퍼티를 사용할 가능성이 있는 만큼 오류의 가능성은 높다.

다운 캐스팅 과정에서 오류가 발생하면 nil이 반환 된다. 이 값을 통하여, 옵셔널 캐스팅 혹은 강제 캐스팅을 하여, 로직을 작성하면 된다.

캐스팅을 하기 위하여, 사용하는 문법은 as 입니다.

업캐스팅

//객체 as 변환할 타입 
import UIKit

class SuperClass{

    func foo(){
        print("hello world");
    }

}

class SubClass : SuperClass{
    func boo(){
        print("boo");
    }
}

let subOBJ = SubClass();
let superOBJ : SuperClass = subOBJ as SuperClass;
superOBJ.foo()

다운 캐스팅

객체 as? 변환할 타입 //옵셔널 캐스팅
객체 as! 변환할 타입 //포스드 캐스팅 

import UIKit

class SuperClass{
    func foo(){
        print("hello")
    }
}

class SubClass : SuperClass{
    override func foo(){
        print("world")
    }
}

let superOBJ : SuperClass = SubClass();
let subOBJ : SubClass? = superOBJ as? SubClass;

다운 캐스팅을 할때는 실제로 슈퍼클래스의 인스턴스서브 클래스 처럼 취급 받는게 아닙니다. 서브클래스는 슈퍼클래스의 정의를 만족하고 있기 때문에, 슈퍼 클래스 타입으로 인스턴스화 하여도 슈퍼클래스 처럼 취급 받을 수 있습니다. 그러나, 슈퍼 클래스의 인스턴스는 서브 클래스에서 오버라이딩 된 메서드나 추가된 프로퍼티로 인하여 동일하지 않습니다.

반응형

'IOS > Swift' 카테고리의 다른 글

[SWIFT] enumeration  (0) 2021.07.21
[SWIFT] 초기화  (0) 2021.07.20
[SWIFT] 상속  (0) 2021.07.15
[SWIFT] 메서드  (0) 2021.07.13
[SWIFT] 프로퍼티  (0) 2021.07.13
Comments