시작하기

다른 언어에서 오셨다면

파이썬·자바스크립트·자바·러스트 경험을 이 언어 구문에 매핑하고, 의도적으로 제외된 개념도 함께 살펴봅니다.

학습 결과: 기존 프로그래밍 습관을 이 언어 체계로 전환하고, 의도적으로 제외된 구문 및 메커니즘을 이해합니다.

선행 학습: 다른 프로그래밍 언어 코드를 읽을 수 있어야 합니다. 이 언어에 대한 사전 경험은 없다고 가정합니다.

그대로 옮겨오는 것부터

구문의 상당 부분은 익숙하게 느껴집니다. 값·식별자·함수·조건문·반복문·컬렉션의 역할은 쉽게 파악할 수 있으며, 주요 차이점은 검사기가 명시적으로 지적합니다. 세부 문법을 모두 파악하기 전이라도 아래 예제가 수행하는 동작을 대략 이해할 수 있습니다.

TOPAZ
record 과제 {
    제목: string,
: int
}

function 전체분(과제들: Array<과제>) -> int {
    let mut 전체 = 0
    for 과제하나 in 과제들 {
        전체 = 전체 + 과제하나.
    }
    전체
}

파이썬·자바스크립트·자바·러스트 사용 경험이 있다면 이 예제가 수행하는 역할을 즉시 파악할 수 있습니다. 이 문서가 해당 예제로 시작하는 이유가 여기에 있습니다. 주의 깊게 살펴볼 차이점은 몇 가지에 불과하며, 아래에서 다룹니다.

실제로 중요한 차이 넷

변경은 선택해야 합니다. let으로 선언한 식별자는 재대입할 수 없습니다. let mut으로 명시해야 재대입이 설계 의도임을 밝히게 됩니다. 재대입이 용이한 언어에서는 변수 상태의 변경 여부를 알기 위해 함수의 구체적인 흐름을 추적해야 합니다. 반면 이 언어에서는 바인딩 선언을 통해 변경 여부를 바로 확인할 수 있습니다.

복구 가능한 실패는 값입니다. 별도로 포착해야 할 예외 개념이 존재하지 않습니다. 복구 가능한 실패가 발생하는 함수는 Result를 반환하며, 호출 측에서 이 실패를 직접 처리하거나 ? 연산자로 상위 호출처에 전파합니다. 따라서 구체적인 구현이나 관례를 추측하지 않아도 호출 경계에서 실패의 타입 형태가 명확히 드러납니다. 실행을 중단하는 오류는 복구 불가능한 경계로 별도 구분됩니다.

없음도 타입에 들어갑니다. 일반적인 선택적 결과는 Option<T>로 표현합니다. 외부의 null 수용 가능 데이터를 다룰 때는 T | null 형태를 쓸 수 있으며, 두 모델은 서로 혼용되지 않습니다. 어떤 방식을 사용하든 검사기는 값에 접근하기 전에 부재 상태를 먼저 처리하도록 요구합니다.

호스트 권한에는 명시적인 경계가 있습니다. 파일 및 I/O 연산은 선택한 호스트 또는 제품 프로필을 통해서만 수행할 수 있으며, 웹 제품은 선언된 제한된 기능만 허용받습니다. 함수 시그니처는 데이터와 복구 가능한 실패 형태를 명시하며, 임포트·패키지 설정·선택 프로필을 종합적으로 확인해야 전체 권한 구조가 명확히 드러납니다. 실제 파일 읽기 문서에서는 이러한 요소들을 함께 활용합니다.

일부러 없는 것들

대응하는 개념이 없는 기존 습관은 일찍 파악해 두는 편이 좋습니다. 그래야 이 언어에 맞지 않는 작성 방식을 방지할 수 있습니다.

클래스 계층 구조나 상속 개념은 존재하지 않습니다. 구조는 레코드로 정의하고 동작은 해당 레코드를 전달받는 함수로 구현합니다. 기반 클래스와 메서드 재정의로 모델링하려 하지 말고, 레코드와 명시적인 함수 조합으로 모델링하세요.

런타임에 프로그램을 조사하는 리플렉션, 프로토콜 테이블을 통한 동적 디스패치, 행 다형성은 지원하지 않습니다. 정확한 명세 목록은 레코드와 명목 데이터 문서에 있습니다.

수치 타입 간의 암묵적 변환을 지원하지 않습니다. 주변 표현식의 편의성을 이유로 int 타입이 float 타입으로 자동 변환되지 않습니다.

이러한 경계는 의도적으로 설계된 것입니다. 핵심 선택 사항을 선언부와 제품 설정에서 확인할 수 있게 하되, 함수 시그니처 하나만으로 호스트와의 모든 상호작용을 설명할 수 있다고 과장하지 않습니다.

첫 한 시간을 위한 대응표

dict·Map·HashMap은 컬렉션 구조에 대응하며 컬렉션과 컴프리헨션 문서에서 다룹니다. 데이터 저장 전용 class는 주로 레코드에 대응합니다. 인터페이스 형태의 경계는 명시적인 함수 시그니처로 표현하며, 제네릭 계약이 필요한 경우에는 런타임 동적 디스패치가 없는 정적 프로토콜을 사용합니다. 복구 가능한 tryexcept 처리 흐름은 반환 타입의 Result에 대응합니다. 일반적인 선택적 결과는 Option을, 외부 null 수용 가능 데이터는 필요에 따라 T | null을 사용하며 검사기가 두 방식을 명확히 구분합니다.

직접 해 보기

제목으로 특정 작업을 조회하는 함수가 필요한 상황에서 대상을 찾지 못할 수 있습니다. 정답을 확인하기 전에 반환 타입이 무엇이어야 할지 판단해 보세요.

정답

단순한 작업 객체가 아니라 작업의 Option 타입입니다. 대상을 찾지 못한 상황은 오류가 아니라 조회 연산의 일반적인 결과이므로 값의 부재로서 타입에 포함됩니다. 파일 읽기 등 조회 작업 자체에 실패 가능성이 있다면 그때는 Result 타입을 사용하는 것이 적절합니다. 부재와 실패 중 어느 쪽에 해당하는지 판단할 것을 이 언어는 명시적으로 요구하며, 시그니처에 이를 명시해 두면 호출 측에서 동작을 추측해야 하는 부담이 없어집니다.

이어갈 준비가 된 시점

네 가지 주요 차이점을 설명할 수 있고, 기존 언어의 어떤 습관이 이 언어에서 대응되지 않는지 짚을 수 있으며, 작성하려는 함수에 대해 부재와 실패 중 적절한 타입을 선택할 수 있다면 준비가 완료된 것입니다.

아직 진행하지 않았다면 첫 프로그램 가이드부터 순서대로 과정을 밟으시고, 구문 형태만 빠르게 살펴보려면 문법 한눈에 보기 문서로 직접 이동하세요.