본문 바로가기
Swift

스위프트에서 제공하는 AnyObject와 NSObject란?

by 밤새는 탐험가89 2025. 12. 22.
728x90
SMALL

1. AnyObject (프로토콜)

AnyObject는 **"모든 클래스 타입"**을 나타내는 특수한 프로토콜입니다.

  • 성격: 모든 클래스(Class)는 암시적으로 AnyObject 프로토콜을 준수합니다.
  • 용도: 어떤 클래스의 인스턴스든 저장할 수 있는 유연한 타입을 만들 때 사용합니다.
  • 제한: 구조체(Struct)나 열거형(Enum)은 AnyObject 타입에 담을 수 없습니다. (오직 참조 타입만 가능)
let someArray: [AnyObject] = [NSString(), MyCustomClass()] 
// 클래스 인스턴스라면 무엇이든 담을 수 있음
class Dog { }
class Cat { }

// AnyObject 타입의 변수에는 개도 담기고 고양이도 담깁니다.
var animal: AnyObject 

animal = Dog() // 가능
animal = Cat() // 가능

 

즉, **"이 변수에는 어떤 클래스의 객체든 들어올 수 있어"**라고 유연하게 선언할 때 쓰는 것이 AnyObject입니다. (단, 구조체(Struct)는 안 됩니다.)

2. NSObject (루트 클래스)

NSObject는 대부분의 Objective-C 클래스 계층의 최상위 루트 클래스입니다.

  • 성격: 클래스 그 자체입니다. 스위프트 클래스가 NSObject를 상속받으면 Objective-C 런타임의 기능을 사용할 수 있게 됩니다.
  • 주요 기능:
    • KVO(Key-Value Observing): 객체의 프로퍼티 변화를 감지.
    • Runtime Check: isKind(of:), responds(to:) 같은 메서드로 런타임에 객체 정보를 확인.
    • Objective-C 프레임워크 호환: UIKit이나 AppKit의 많은 클래스들이 NSObject를 상속받고 있습니다.
class MyView: NSObject {
    // 이제 이 클래스는 Objective-C 방식의 런타임 기능을 사용할 수 있습니다.
}

 

NSObject를 상속받는 이유는 Swift 클래스가 Objective-C의 기능(런타임, KVO, 클래스 식별 등)을 사용할 수 있게 하기 위해서입니다.

  • 언제 쓰나요?
    • UIKit (iOS UI 프레임워크)의 기능을 사용할 때 (대부분 NSObject 기반임)
    • Objective-C로 작성된 오래된 라이브러리를 가져다 쓸 때
    • #selector를 사용하거나 특정 런타임 기능이 필요할 때

 

요약하자면

  • AnyObject는 "이건 클래스이기만 하면 뭐든지 괜찮아"라고 말할 때 사용합니다.
  • NSObject는 "이건 Objective-C의 기능을 가진 클래스여야 해"라고 할 때 사용하거나, 그런 기능을 상속받기 위해 사용합니다.

최근의 순수 스위프트 프로젝트에서는 NSObject 상속 없이 작성하는 경우가 많지만, Delegate 패턴을 구현하거나 UIKit 라이브러리를 깊게 다룰 때는 여전히 NSObject가 필수적입니다.

요약하자면

  • AnyObject는 "이건 클래스이기만 하면 뭐든지 괜찮아"라고 말할 때 사용합니다.
  • NSObject는 "이건 Objective-C의 기능을 가진 클래스여야 해"라고 할 때 사용하거나, 그런 기능을 상속받기 위해 사용합니다.

최근의 순수 스위프트 프로젝트에서는 NSObject 상속 없이 작성하는 경우가 많지만, Delegate 패턴을 구현하거나 UIKit 라이브러리를 깊게 다룰 때는 여전히 NSObject가 필수적입니다.

 
728x90
LIST

'Swift' 카테고리의 다른 글

Facebook 로그인 구현 + Firebase 연결  (0) 2025.01.20
ViewModel  (1) 2025.01.08
setCustomSpacing(_:after:)의 역할  (0) 2025.01.05
UICollectionViewCompositionalLayout 관련 데이터 소스 관리  (0) 2025.01.03
async / await 사용해보기  (0) 2025.01.02