[Swift] 타입 캐스팅

민니·2022년 7월 6일
0

Swift 문법

목록 보기
11/17

타입 캐스팅 ❓

  • 인스턴스의 타입 확인
  • 특정 타입으로 선언된 값을 다른 타입으로 변환하는 것
  • 부모 클래스로부터 상속된 자식 클래스는 자기 자신의 타입이기도 하면서, 부모 클래스의 티입이기도 함 -> 부모 클래스의 타입으로 선언하여 사용 가능
  • 📚 Example
class Vehicle {
    var currentSpeed = 0.0
    
    func accelerate() {
        self.currentSpeed += 1
    }
}

class Car: Vehicle {
    var gear: Int {
        return Int(self.currentSpeed/20)+1
    }
    
    func wiper() {
        //창 닦기
    }
}

let trans: Vehicle = Car()
let car: Car = Vehicle() //error

✏️ 상수 transCar 클래스의 인스턴스를 할당받지만, Vehicle 타입으로 선언될 수 있음


타입 비교 연산

  • 비교 연산자 is 사용
  • 할당된 값을 비교하는 것이 아니라 타입이 일치하는지 여부를 비교 -> Bool 반환

정의 형식

인스턴스(또는 변수, 상수) is 비교대상 타입

✏️ 연산자 왼쪽 인스턴스의 타입이 오른쪽 비교대상 타입과 일치하면 true
✏️ 연산자 왼쪽 인스턴스의 타입이 오른쪽 비교대상 타입의 하위 클래스일 경우 true
✏️ 그외의 경우는 false

📚 Example

SUV() is SUV //true
SUV() is Car //true
SUV() is Vehicle //true

Car() is Vehicle //true
Car() is SUV //false

인스턴스가 할당된 변수를 사용하여 비교할 경우

  • 변수가 선언된 타입이 아니라, 변수에 할당된 실제 인스턴스를 기준으로 타입 비교
  • 📚 Example
let myCar: Vehicle = SUV()

if myCar is SUV {
    print("myCar은 SUV 타입이다.")
} else {
    print("myCar은 SUV 타입이 아니다.")
}
//myCar은 SUV 타입이다.

타입 캐스팅 연산

업캐스팅

  • 하위 클래스 타입을 상위 클래스 타입으로 변환할 때
  • 자식 클래스를 부모 클래스 타입으로 변환하므로, 실패 가능성이 없어 오류 발생 ❌
  • 부모 클래스의 프로퍼티와 메서드만 사용할 수 있음
  • 정의 형식
객체 as 변환할 타입
  • 📚 Example
let anyCar: Car = SUV()
let anyVehicle = anyCar as Vehicle

✏️ Car 타입을 Vehicle 타입으로 캐스팅
✏️ 업캐스팅에 해당하므로, 오류는 발생하지 않음


다운캐스팅

  • 상위 클래스 타입을 하위 클래스 타입으로 캐스팅
  • 캐스팅 과정에서 오류가 발생할 가능성이 있음
  • 따라서 오류 처리를 위해, 옵셔널 캐스팅과 강제 캐스팅을 실행
  • 정의 형식
객체 as? 변환할 타입(결과는 옵셔널 타입)
객체 as! 변환할 타입(결과는 일반 타입)
  • 📚 Example
if let anySUV = anyCar as? SUV {
    print("캐스팅이 성공하였습니다.")
}

✏️ Car 타입을 SUV 타입으로 캐스팅
✏️ 옵셔널 타입으로 반환되므로 옵셔널 해제해 주기

let anySUV = anyCar as! SUV
print("캐스팅이 성공하였습니다.")

✏️ 다운 캐스팅이 반드시 성공할 것이라는 확신이 있다면, 강제 캐스팅 구문을 사용해도 됨



AnyObject & Any

AnyObject와 Any 타입을 사용하면, 상속 관계에 있지 않아도 타입 캐스팅할 수 있음

AnyObject

  • 클래스의 일종
  • 모든 종류의 클래스 타입을 저장할 수 있음
  • AnyObject는 항상 다운 캐스팅만 수행할 수 있음
  • 📚 Example
var allCar: AnyObject = Car()
allCar = SUV()

Any

클래스에 국한되지 않고 스위프트에서 제공하는 모든 타입을 허용

  • 📚 Example
var value: Any = "Sample String"
value = 3
value = false
value = [1,3,5,7,9]
value = {
	print("함수가 실행됩니다.")
}

A. 그러면 그냥 전부 다 Any 쓰면 되는 거 아냐? 🤔
B. Any는 매우 극단적으로 추상화되어 있어서, Any 타입이 할당된 객체가 사용할 수 있는 프로퍼티나 메서드는 제공 ❌
그리고, Any 타입을 사용하면, 실제로 값이 할당되는 시점에 타입이 정해진다. 실행하기 전에는 타입을 알기 어려워 컴파일러가 오류를 잡아내지 못함!








출처)
꼼꼼한 재은씨의 스위프트: 문법편

0개의 댓글