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

MetaType에 대하여 설명해주세요. #39

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

MetaType에 대하여 설명해주세요. #39

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

Comments

@0Hooni
Copy link
Collaborator

0Hooni commented Jan 12, 2025

No description provided.

@hsw1920
Copy link
Owner

hsw1920 commented Jan 17, 2025

메타 타입은 타입의 타입을 의미합니다.
static, class 변수와 같은 타입 프로퍼티의 경우 타입의 이름만 알면 호출이 가능하며, 이때 타입의 이름이 메타 타입을 의미합니다.
메타 타입은 인스턴스와 달리 static이나 class 가 붙은 타입 프로퍼티나 타입 메서드만 접근할 수 있습니다. 반면 인스턴스에서는 해당 타입의 모든 프로퍼티나 메서드에 접근할 수 있습니다.

꼬리질문

  • 타입 프로퍼티란 무엇인지 설명해주세요.
    타입 프로퍼티는 인스턴스 프로퍼티와 달리 인스턴스를 생성하지 않고 타입의 이름만 알아도 접근할 수 있으며 전역적으로 사용되는 프로퍼티를 말합니다.
    class var: 상속 가능한 연산 타입 프로퍼티
    static var: 상속 불가능한 연산 타입 프로퍼티

  • Self와 .self의 차이점에 대해 설명해주세요.
    Self는 현재 타입을 의미하며 현재 타입을 참조하거나 해당 타입 인스턴스를 생성할 때 사용할 수 있습니다. 간단한 경우보다는 상속이나 제네릭 타입으로 Self를 통해 현재 타입의 인스턴스를 동적으로 생성할 때 사용됩니다.
    .self는 해당 타입의 메타 타입을 의미합니다. 객체의 메타 타입을 다루는 상황에서 사용됩니다. 제네릭 메타 타입 인자를 통해 동적으로 인스턴스를 생성하는 경우에도 사용될 수 있습니다.

  • 타입 (프로퍼티/메서드)와 인스턴스 (프로퍼티/메서드)의 차이점은 무엇인가요?
    타입 (프로퍼티/메서드)의 경우 인스턴스를 생성하지 않고 해당 타입의 이름만 알면 호출이 가능합니다.
    인스턴스 (프로퍼티/메서드)의 경우 해당 타입을 기반으로 생성된 인스턴스에 포함된 프로퍼티와 메서드입니다. 따라서 타입의 인스턴스가 생성되어야만 접근이 가능합니다. 타입의 경우 전역적으로 동일한 동작이나 값을 제공할 경우 적합하고, 인스턴스의 경우 독립적으로 객체의 상태를 관리하는데 적합합니다.

@youn9k
Copy link
Collaborator

youn9k commented Jan 17, 2025

메타 타입이란 타입의 타입을 말합니다.
타입 자체를 가리켜야 하는 경우에 사용할 수 있습니다.
예를 들어 메타 타입에 따라 다른 인스턴스를 팩토리 메소드를 만들 때 사용할 수도 있고, 테이블뷰에 셀을 등록할 때 AnyClass란 AnyObject의 static metatype으로 등록할 수 있고, type(of:) 메소드를 통한 dynamic metatype을 얻어 런타임에 처리해줄 수도 있습니다.

@Kiyoung-Kim-57
Copy link
Collaborator

메타 타입은 인스턴스가 어떤 타입인지 표현하는 타입입니다.

Swift는 주로 컴파일 타임에 타입 체크를 하게 되는데 메타타입을 활용하면 원하는 런타임 시점에 타입 체크를 활용할 수 있습니다.
타입.self 또는 타입.Type으로 메타 타입을 받아올 수 있고 type(of: 인스턴스)로 특정 인스턴스의 메타 타입을 받아올 수 있습니다.

@0Hooni
Copy link
Collaborator Author

0Hooni commented Jan 17, 2025

🙋🏻 답변

메타타입이란 특정 타입의 타입을 나타내는 개념입니다.

예를 들어 animal이라는 객체의 인스턴스를 만들었다면 해당 인스턴스의 타입은 animal이고, animal의 타입이 메타타입입니다.

주로 제네릭 프로그래밍에서 사용되는데, 인스턴스로 메타타입을 받아 각 타입에 맞춰 작업을 만들어줄 수 있습니다.

.Type를 붙여 메타타입을 얻거나, .self를 붙여 메타타입 값을 만들고, 프로토콜의 메타타입의 경우 .Protocol을 붙여 메타타입을 얻을 수 있습니다.

🏷️ 키워드

타입의타입, 제네릭, 분기, .Type, .self, .Protocol

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