서론

최근 'Meta' 라는 단어를 접할 일이 많아졌습니다.

페이스북은 그 이름 자체를 'Meta'로 만들었고, 온갖 영화들에서 'Metaverse', '메타버스'라는 키워드로 세계를 넓히고, 철학에서는 '형이상학'을 'Metaphysics'라고 표현합니다. '나'를 객관적으로 바라보는 것에 대해 'Metacognition', 메타인지 라는 말들도 생겨났습니다. 그렇다면 이 'Meta'의 사전적 정의는 무엇일까요?

Meta-, 그리스어 μετά에서 유래했습니다. "사이에, 뒤에, 다음에, 넘어서"를 의미합니다.

물질적으로 '넘어'있는 느낌이 아니라, 저기 저 언덕 너머에 있는 것이 아니라 어떠한 비가시적인, 영적인 공간 너머에 있을 때 Meta라는 단어를 사용하는 느낌이네요. 철학적인 관점으로 바라보았을 때, 플라톤이 이야기했던 '이데아'의 개념과 유사한 것 같습니다.

그렇다면 Swift에서 사용하는 Meta, Metatype은 어떤 의미를 가지고 있고, 어떠한 곳에서 사용이 될까요?

제 경험에선, JSON 파일을 Decoding하여 Data Type을 제가 선언한 structure type으로 받아올 때가 떠오르네요.

let (data, _) = JSONDecoder().decode(Type.self, from: data)

data를 Type 형태로 decode를 하고 싶을 때 위의 코드를 사용했습니다. 위의 Type.self라고 쓴 부분이 바로 Swift가 이야기하는 Meta Type입니다.

제가 사용했던 위 메소드는 공식 문서에서 다음과 같이 정의를 하고 있는데요.

func decode<T>(
    _ type: T.Type,
    from data: Data
) throws -> T where T : Decodable

decode를 위한 parameter로 type을 받고 있습니다.

type The type of the value to decode from the supplied JSON object.

JSON 타입으로 '특정 데이터'를 들고 오는데, 해당 value의 '타입'을 넣으라고 합니다.

만약 제가 외부에서 가져온 JSON 파일을 제 앱 안에서 사용하기 위해 이를 Student 타입으로 받아오려는데, 그럼 왜

let (data, _) = JSONDecoder().decode(Student, from: data)

라고 쓰지 않고,

let (data, _) = JSONDecoder().decode(Student.Type, from: data)

라고 쓰라고 하는 것일까요?

본론

정답은 공식 문서에 있을 것이라고 굳게 믿기 때문에, 공식 문서로 들어갔습니다!

공식 문서

metatype type refers to the type of any type, including class types, structure types, enumeration types, and protocol types.

타입들의 '타입을 가르키기 위한' 메타타입이라는 타입.

타입을 가르킨다면, 생각나는 메소드가 있지 않나요? 바로, instance의 Type을 알려주는 type(of:) 메소드 입니다.

func type<T, Metatype>(of value: T) -> Metatype

공식 문서에서도 return되는 값이 Metatype이라는 것을 명시해 주고 있네요!

사용법

The metatype of a class, structure, or enumeration type is the name of that type followed by .Type.

타입 이름 뒤에 .Type 을 붙인 것이 바로 메타 타입입니다.

이유

You can use the postfix self expression to access a type as a value. For example, SomeClass.self returns SomeClass itself, not an instance of SomeClass. And SomeProtocol.self returns SomeProtocol itself, not an instance of a type that conforms to SomeProtocol at runtime.

instance에 접근하는 것이 아닌, Class Type, Protocol Type, Structure Type, enum Type 그 자체에 접근하기 위해 사용합니다

결론

instance가 아니라, 타입 그 자체에 대해 이야기하고 싶을 때, 바로 Metatype을 사용하세요!