언어 기초

타입

타입 추론과 타입 표기를 설명합니다. 경계 조건에 따라 유니온, 함수 타입, 명목 데이터 중 적절한 형태를 선택하는 방법을 다룹니다.

타입을 활용하면 해당 경계로 유입되는 값의 유형을 실행 전에 검사할 수 있습니다. 초기값으로 타입을 명확히 추론할 수 있는 지역 변수는 대개 타입 표기를 생략해도 됩니다. 입력과 반환값, 혹은 도메인의 주요 선택지를 명시해야 할 때 타입을 표기하세요.

하나의 프로그램에서 시작하기

다음 코드를 types.tpz로 저장하세요.

TOPAZ
type 단계 = "draft" | "ready"

function 설명(단계값: 단계, 검사수: int) -> string {
    "{단계값} after {검사수} checks"
}

let 검사수 = 3
let 현재: 단계 = "ready"
let 표시함수: (단계, int) -> string = 설명

print(표시함수(현재, 검사수))

먼저 타입 경계를 검사하세요. 그다음 실행하세요.

BASH
topaz check types.tpz
topaz run types.tpz

실행 결과는 다음과 같습니다.

출력
ready after 3 checks

결과에서 타입 읽어 내기

검사수에는 타입 표기가 생략되어 있습니다. 초기값이 정수이므로 토파즈가 int로 추론합니다. 반면 현재에는 타입을 명시했습니다. 이는 임의의 string 대신 단계 타입만 받겠다는 의도를 나타냅니다.

단계"draft" | "ready" 리터럴 유니온에 지정한 투명한 별칭입니다. 정의된 두 값 중 하나만 허용하며 다른 문자열은 거부합니다. 타입 별칭은 이러한 선택지에 직관적인 이름을 부여하지만, 별도의 런타임 정체성을 생성하지는 않습니다.

표시함수에는 함수 타입을 사용했습니다. (단계, int) -> string단계int를 받아 string을 반환하는 함수 타입을 의미합니다. 명명된 함수 설명이 이 서명과 일치하므로 바인딩에 할당하여 호출할 수 있습니다.

기본 타입 이름은 소문자로 표기합니다. 여기에는 int·float·bool·string 및 유닛 타입 ()가 포함됩니다. 자주 사용하는 컨테이너는 Array<T>·Map<K, V>·Set<T>와 같은 생성자로 표기합니다. 예측 가능한 값의 부재는 Option<T>로 표현하며, 복구 가능한 실패는 Result<T, E>로 표현합니다.

의도에 맞는 형태 고르기

필요한 것권장 형태이유
타입이 분명한 지역 값타입 추론초기값만으로도 타입이 명확히 드러납니다.
공개 입력·결과 또는 중요한 지역 경계타입 표기검사기와 독자가 의도한 계약을 바로 알아볼 수 있습니다.
정해진 여러 대안 가운데 하나유니온 또는 리터럴 유니온 별칭허용되는 대안이 코드 표현에 그대로 반영됩니다.
나중에 호출할 수 있는 값(int) -> bool 같은 함수 타입매개변수와 반환 타입이 함수 값에 유지됩니다.
도메인 정체성, 필드, 이름 붙은 경우record, enum, newtype내부 구조가 유사하더라도 서로 다른 타입으로 남습니다.

type 별칭은 구문의 가독성을 높여 주지만, 기존 타입과 구별되는 별도의 정체성을 형성하지는 않습니다. 구조가 유사한 두 값을 혼용하는 일을 방지해야 한다면 명목 데이터를 선택하세요. 레코드와 명목 데이터에서 record·enum·newtype의 생성과 패턴을 비교할 수 있습니다.

빈 값에는 문맥 제공하기

일부 값은 그 자체만으로 타입을 온전히 나타내지 못합니다. 빈 배열에는 원소 타입이 지정되지 않으며, None 단독으로는 부재한 값의 타입을 특정할 수 없습니다. 이러한 경우에는 타입 표기·함수 매개변수·반환 타입 선언 등 주변 문맥을 제공하세요.

let 이름들: Array<string> = []
let 선택값: Option<int> = None

위 코드는 올바른 표기 형식만을 나타내고자 텍스트로 기술되었습니다. 본 문서에서 실제로 동작을 검증하는 코드는 상단의 실행 예제입니다.

흔한 실수: 타깃 언어의 타입 표기 가져오기

토파즈의 컬렉션 타입은 Array<T>·Map<K, V>·Set<T> 형태로 표기합니다. 함수 타입은 매개변수 타입을 괄호로 감싼 뒤 -> 구분자와 반환 타입을 기술합니다. 이 표기를 일관되게 유지해야 검사기와 코드 생성 대상이 동일한 소스 계약을 공유합니다.

정확한 한계

  • intfloat 사이의 암묵적 타입 변환은 지원하지 않습니다.
  • 제네릭 타입 매개변수는 무공변입니다. 구조적 유사성만으로 서로 다른 타입 인수가 호환되지는 않습니다.
  • 제네릭 제약 조건은 명명된 함수의 타입 매개변수에만 적용됩니다. 허용되는 1계층 형태는 함수와 제네릭에서 설명합니다.
  • 재귀 타입 별칭, 분산 표기, 고위 다형성, 확장 리플렉션은 지원하지 않습니다.
  • 문맥을 제공하더라도 타입 매개변수가 결정되지 않는 빈 제네릭 값이 존재합니다. 이러한 값은 런타임에 추론하지 않고 정적 오류로 거부합니다.

타입 추론·타입 표기·가변성 개념이 낯설다면 값과 함수 문서를 다시 확인하세요. 값의 부재와 실패를 구분하려면 Null·Option·결과·fault 문서로 이어가세요.