AnyObject 정의
모든 클래스가 암시적으로 준수하고 있는 프로토콜
확인해 보기
모든 클래스가 암시적으로 준수하고 있다 하였으니 개발자가 만들어준 임의의 클래스도 해당 프로토콜을 명시적으로 채택해주지 않아도 AnyObject프로토콜을 준수하고 있는지 확인해 보자
위 코드에서 보았듯이 임의로 만들어준 클래스에서도 is연산자로 Type Checking을 수행해 봤더니 AnyObject프로토콜을 채택하고 있음을 알 수 있다.
마찬가지로 위와 같이 응용하여 서로 다른 클래스를 공통의 타입으로 묶어서 사용하게 할 수 있다.
불편한 점
AnyObject를 사용하여 타입을 지칭하게 되면 모든 클래스 타입을 공통으로 묶어서 사용할 있는 장점도 있지만 Swift의 AnyObject는 어떤 클래스의 인스턴스를 가리키는지 컴파일 타임이 아닌 런타임 시점에 결정되기 때문에 실제 해당 인스턴스의 메서드나 프로퍼티에 접근하려면 결국 as?, as! 연산자를 통해 구체타입으로 다운캐스팅 하여 사용해야 한다.
class Person {
func hello() {
print("hello person")
}
}
class Pet {
func hello() {
print("hello pet")
}
}
var arr: [AnyObject] = [Person(), Pet()]
var person = arr[0] as! Person
person.hello() // hello person
컴파일 타임에는 알 수 없는 AnyObject를 런타임 시점에 구분하여 사용하기 위해 아래 코드와 같이 사용할 수 있다.
var object: AnyObject
if let someInstance = object as? SomeClass {
// object가 SomeClass의 인스턴스인 경우, someInstance 상수에 할당됩니다.
} else if let someOtherInstance = object as? SomeOtherClass {
// object가 SomeOtherClass의 인스턴스인 경우, someOtherInstance 상수에 할당됩니다.
} else {
// object가 어떤 클래스의 인스턴스도 아닌 경우
}
런타임 시점에 결정?
런타임 시점에 결정된다라는건 코드가 컴파일될 때는 정보가 충분치 않아 프로그램이 실행 중일 때 타입이나 동작이 결정된다는 것을 의미하며 이를 통해 동적 프로그래밍이 가능하게 해준다.
Swift에서 런타임때 타입이 결정되는 것들은 다음과 같다
1. Protocol Type
2. Type Casting
3. AnyObject, Any Type
'iOS > Swift' 카테고리의 다른 글
weak, [weak self]를 사용하여 순환참조를 해결하기 + 메모리 영역 확인 (0) | 2023.11.09 |
---|---|
[Swift] Subscript 알아보기 :: String에서는 subscript를 사용할 수 없는 이유 (0) | 2023.03.02 |
[Swift] String과 Substring을 메모리에서 효율적으로 관리하는 방법 (0) | 2023.02.18 |
[Swift] 문자열은 무엇으로 구성되어 있을까? - Extended Grapheme Clusters (0) | 2023.02.18 |
[Swift] Convenience initializer 알아보기 (0) | 2023.02.16 |