타입 정보 조회

타입 정보 조회 (@typeInfo)

특정 타입에 대해 컴파일 타임에 정보를 꺼내 보고 싶을 때가 있어요. 예를 들어 구조체에 어떤 필드가 들어 있는지, enum 값은 몇 개인지 같은 것들이요. 그럴 때 쓰는 내장 함수가 @typeInfo예요. 이 함수가 돌려주는 타입 정보에는 필드(fields)와 선언(declarations)이 담기는데, 여기서 가장 기억할 특징은 이 요소들이 소스 파일에 나타난 순서 그대로 보관된다는 보장이에요. 어떤 타입에 무엇이 담기는지, 그 순서 보장이 왜 중요한지 함께 살펴볼게요.

출처: Zig Documentation

본문

@typeInfo는 타입 반사(type reflection)를 제공하는 내장 함수예요. 시그니처는 다음과 같아요.

@typeInfo(comptime T: type) std.lang.Type

첫 번째 매개변수 Tcomptime 타입으로 선언돼 있어서, 이 함수는 실행 중이 아니라 컴파일 시점에 타입의 정보를 정적으로 조사해요. 그 결과로 std.lang.Type이라는, 타입의 정보를 담는 구조체를 돌려주죠.

여기서 돌려주는 정보에 두 가지 보장이 붙어 있어요.

첫째, struct, union, enum, 그리고 error set(에러 셋)의 타입 정보에는 **필드(fields)**가 담기는데, 이 필드들의 순서가 소스 파일에 나타난 순서와 동일하다는 것이 보장돼요. 필드를 나열하면서 원본 순서를 재현해야 할 때 신뢰하고 쓸 수 있는 이유예요.

둘째, struct, union, enum, 그리고 opaque(불투명 타입)에는 **선언(declarations)**이 담겨요. 여기서도 마찬가지로, 선언들이 소스 파일에 나타난 순서 그대로 유지된다는 보장이 있어요. 필드와 선언을 구분해서 볼 필요가 있는데, 필드는 타입이 지닌 데이터 항목을, 선언은 해당 타입 안에서 선언된 항목들을 가리킨다고 보면 돼요.

더 알아보기

  • @TypeOf — 타입 자체를 알아내는 내장 함수예요. @typeInfo와 짝을 지어, 타입을 얻고 그 정보를 까보는 흐름으로 이어서 쓸 수 있어요.
  • struct · union · enum — 각 타입의 필드가 어떻게 정의되는지 확인해 볼 수 있어요.
  • Error-Set-Type — 필드를 갖는 네 번째 대상인 에러 셋이 어떤 구조인지 다뤄요.
  • opaque — 선언을 갖는 대상 중 하나인 불투명 타입에 대한 설명이에요.