Anyobject에 대해 설명하시오.

이하연·2021년 8월 15일
0

[Swift] 스위프트

목록 보기
2/27
post-custom-banner

Swift는 Type에 민감한 언어기 때문에 특정하지 않은 타입에 대해 동작하도록 특별한 타입 두가지를 제공합니다.

원래는 타입 캐스팅을 수행할 때, 일반적으로 상속 관계에 있는 클래스끼리만 캐스팅이 가능하지만, Any, AnyObject 타입을 사용할 경우, 상속 관계에 있지 않아도 타입 캐스팅이 가능합니다.

Any

Any는 함수타입을 포함하여 모든 타입의 인스턴스를 나타낼 수 있습니다.

value 타입(구조체, 열거형), Reference 타입(클래스, 클로저)이건 상관 없이 저장이 가능합니다.

한마디로, Any는 모든 타입 포함할 수 있는 범용 타입입니다.

AnyObject

AnyObject는 모든 클래스 타입의 인스턴스를 나타낼 수 있는 프로토콜입니다.

AnyObject로 선언 시, "클래스 타입"만 저장할 수 있습니다.

따라서 클래스 타입이 아닌 구조체, 열거형, Reference Type인 클로저는 AnyObject에 해당하지 않습니다 → 에러 뜸

장점

Any, AnyObject는 모든 타입, 모든 클래스 타입을 저장할 수 있다는 장점

Any, AnyObject의 타입 캐스팅 ( 단점 )

하지만, 이 두가지는 매번 타입 체크 및 형변환을 해야하기때문에 필요에 의한 것이 아니라면 사용하지 않는 것이 좋습니다. 그럼에도 불구하고 사용한다면 switch문을 활용하여 각 타입마다 as를 통해 캐스팅이 성공하면 case문이 실행하게 만들어줍니다.

  • as를 이용

    원래 as는 업캐스팅이나 패턴 매칭에 사용

  • as? as!를 이용한 다운캐스팅

    var name: Any = "Sodeul"

    위와 같이 String형을 Any로 선언해주어도, name에 String 메서드나 프로퍼티에 접근하려고 하면 에러가 납니다.

    → 이유는, Any AnyObject는 런타임 시점에 타입이 결정하기 때문에 컴파일 시점에는 해당 타입에 대해서 알 수가 없고 따라서 해당 타입의 멤버에도 접근할 수 없습니다.

    → 해결 : as나 as?를 통해서 다운 캐스팅을 한 후 사용해야 합니다.

    if var name = name as? String {
        name.append("다운캐스팅")
    }
post-custom-banner

0개의 댓글