Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AnyObject와 class 차이에 대해 설명해주세요. #40

Open
0Hooni opened this issue Jan 12, 2025 · 4 comments
Open

AnyObject와 class 차이에 대해 설명해주세요. #40

0Hooni opened this issue Jan 12, 2025 · 4 comments

Comments

@0Hooni
Copy link
Collaborator

0Hooni commented Jan 12, 2025

No description provided.

@0Hooni 0Hooni changed the title AnyObject와 class 차이에 대해 설명해주세요. AnyObject, class 차이에 대해 설명해주세요. Jan 12, 2025
@0Hooni 0Hooni changed the title AnyObject, class 차이에 대해 설명해주세요. AnyObject와 class 차이에 대해 설명해주세요. Jan 12, 2025
@youn9k
Copy link
Collaborator

youn9k commented Jan 17, 2025

AnyObject란 모든 클래스들이 암묵적으로 준수하는 프로토콜입니다.
애플에서 제공하는 클래스뿐만 아니라 개발자가 만든 커스텀 클래스 또한 AnyObject를 준수합니다.

AnyClass는 모든 클래스 타입들이 암묵적으로 준수하는 프로토콜입니다.
즉 AnyObject의 메타타입으로 typealias로 구현되어 있습니다.
typealias AnyClass = AnyObject.Type

둘의 공통점으로는 타입의 유연함을 제공한다는 특징이 있지만, AnyObject는 클래스 인스턴스와 타입 모두에 대해 유연함을 제공하고 AnyClass는 클래스의 타입에 대해서만 유연함을 제공한다는 차이가 있습니다.

@hsw1920
Copy link
Owner

hsw1920 commented Jan 17, 2025

AnyObject의 경우 프로토콜의 상속 목록에 추가하여 프로토콜 채택을 오직 클래스만으로 제한할 수 있는 프로토콜입니다.
예를 들어, Delegate 패턴을 구현할 때, 순환 참조 문제를 해결하기 위해 delegate 객체를 weak로 선언해야합니다.
하지만 프로토콜은 열거형, 구조체도 채택할 수 있기 때문에 weak로 delegate 객체를 선언할 수 없습니다.
따라서 AnyObject로 class only protocol로 제한하여 delegate 패턴의 순환참조 문제를 해결할 수 있습니다.


근데 이거랑 별개로 class only protocol로 제한하기 위해서 사용할 때 classAnyObject 둘 중 어떤걸 채택하든 같다고하네요

Image

Image

@Kiyoung-Kim-57
Copy link
Collaborator

AnyObject는 모든 클래스들이 준수하는 프로토콜입니다. 그래서 프로토콜에 AnyObject를 채택하면 해당 프로토콜은 클래스만 채택하도록 제한할 수 있습니다.
클래스는 그래서 클래스 타입을 정의하기 위해 사용되는 키워드라고 볼 수 있고 AnyObject는 그런 클래스들이 채택하는 프로토콜입니다. class를 프로토콜에 채택하여 AnyObject와 같이 동작할 수 있으나 이는 내부적으로 AnyObject를 typealias로 명칭을 바꾼 것이라 사실상 동일하고 현재는 deprecated 경고가 AnyObject를 대신 사용하라고 알려줍니다.

@0Hooni
Copy link
Collaborator Author

0Hooni commented Jan 17, 2025

🙋🏻 답변

AnyObject는 모든 클래스들이 암묵적으로 채택하고 있는 프로토콜입니다. 모든 클래스 타입을 나타내는 프로토콜로 클래스라면 모두 AnyObject로 업캐스팅 될수도 있습니다.

AnyObject는 주로 다양한 Class 타입을 하나의 리스트에 담을 때 리스트의 타입으로 사용할 수 있고, 특정 프로토콜을 Class만 채택할 수 있도록 만들기 위해 사용할 수도 있습니다.

특히 delegate 패턴에서 순환참조를 방지하기 위해 weak 키워드를 사용하는데, 이 때 delegate 프로토콜에 AnyObject를 채택하여 참조 타입으로 만들어주어 weak 키워드를 사용할 수 있게 만들어줄 수 있습니다.

class도 AnyObject와 유사하게 동작하게 할 수 있습니다. 하지만 이는 class의 정의에서 typealias로 AnyObject에서 이름만 바꾼것이라 사실상 동일하다고 볼 수 있습니다.

🏷️ 키워드

모든클래스, 프로토콜, 업캐스팅, 리스트, delegate, 참조타입, weak, 유사, typealias

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

4 participants