콘텐츠로 이동
Xen / docs

문서 검색

한국어 · v0.1.0-demo.2

검색어를 입력하세요.

    EN
    Xen / learn v0.1.0-demo.2

    자료형과 형 변환

    변수에 타입을 적는 것은 값의 종류와 허용할 연산을 정하는 일입니다. 이 장에서는 숫자의 크기, 명시적 형 변환, 타입을 직접 적어야 하는 위치를 다룹니다. 먼저 변수와 값을 읽으세요.

    타입용도와 주의점
    Int (I64)기본 정수. 소수 부분이 없는 계산에 사용합니다.
    I8, I16, I32, I64부호 있는 8·16·32·64비트 정수입니다.
    U8, U16, U32, U64부호 없는 정수입니다. 예를 들어 U8의 범위는 0부터 255입니다.
    Float (F64), F32소수 부분이 필요한 계산에 사용합니다.
    Booltrue 또는 false. 조건식에는 이 타입이 필요합니다.
    String바이트로 이루어진 불변 문자열입니다.
    Unit반환값이 없음을 나타냅니다. 값은 ()입니다.

    타입을 정할 근거가 없는 정수 리터럴은 Int, 실수 리터럴은 Float가 됩니다. let count: I32 = 42;처럼 문맥으로 타입을 알려 줄 수 있습니다. 이미 타입이 정해진 변수는 다른 숫자 타입으로 자동 변환되지 않습니다.

    다음을 data_types.xen으로 저장하세요. i64, u8, float는 새 타입의 값을 만듭니다. 원래 변수의 타입을 바꾸지는 않습니다.

    data_types.xen
    fn main() {
    let narrow: I32 = 42;
    let wide: Int = i64(narrow);
    let small: U8 = u8(255);
    let half: Float = float(wide) / 2.0;
    println(wide);
    println(small);
    println(half);
    println(5 / 2);
    println(float(5) / 2.0);
    println("한".len());
    }
    터미널 창
    xen check data_types.xen
    xen run data_types.xen
    data_types.stdout
    42
    255
    21.0
    2
    2.5
    3

    5 / 2는 두 피연산자가 정수이므로 2가 됩니다. 소수 부분이 필요하면 나눗셈 전에 float(5)처럼 변환하세요. float(5 / 2)는 이미 계산된 정수 2를 변환하므로 버린 소수 부분을 되살리지 못합니다.

    마지막 출력 3은 "한"의 UTF-8 바이트 수입니다. 문자열 길이는 글자 수가 아닙니다. 문자 인덱싱은 지원하지 않습니다.

    다음은 의도적으로 실패하는 완전한 프로그램입니다. numeric_mismatch.xen으로 저장하고 xen check numeric_mismatch.xen을 실행하세요.

    numeric_mismatch.xen
    fn main() {
    let wide: Int = 42;
    let narrow: I32 = wide;
    println(narrow);
    }

    진단에는 다음 부분이 포함됩니다. 파일 경로와 줄 번호는 생략했습니다.

    numeric_mismatch.stderr
    expected I32, found Int (I64)

    let narrow: I32 = i32(wide);로 고칩니다. 더 작은 타입으로 옮길 때는 값이 대상 타입의 범위에 들어가는지도 확인해야 합니다.

    범위 초과 변환과 정수 연산 구분

    섹션 제목: “범위 초과 변환과 정수 연산 구분”

    숫자 변환에서 범위를 벗어나는 것은 정수 덧셈의 되감기와 다른 동작입니다.

    • u8(255)는 성공하지만 u8(256)처럼 범위를 벗어난 리터럴은 검사 단계에서 오류입니다.
    • 실행 중 변환하는 값도 범위를 벗어나면 런타임 오류로 종료합니다.
    • 정수의 +, -, *는 타입 범위를 넘으면 되감깁니다. 변환이 실패한다는 이유로 산술 연산에도 같은 검사가 있다고 가정하지 마세요.
    • 0으로 나누기, 부호 있는 최솟값을 -1로 나누기는 런타임 오류입니다.

    다음 프로그램은 xen check conversion_error.xen은 통과하지만 xen run conversion_error.xen에서 실패합니다.

    conversion_error.xen
    fn main() {
    let value = 256;
    println(u8(value));
    }
    conversion_error.stderr
    numeric conversion to U8 failed

    빈 컬렉션과 값 없는 variant에는 원소 타입을 결정할 정보가 없습니다.

    let values: Vec<Int> = [];
    let missing: Option<String> = Option.None;

    함수의 매개변수와 반환 타입도 명시합니다. 제네릭 함수는 인자로부터 타입을 추론하며, 반환값을 받을 변수의 타입만으로 추론하지는 않습니다. 그 차이는 제네릭과 타입 추론에서 다룹니다.

    필요한 표현선택
    같은 타입의 값 여러 개Vec<T>
    서로 다른 값을 위치로 묶기(Int, String) 같은 튜플
    이름 있는 필드로 묶기struct
    여러 형태 중 하나enum, Option<T>, Result<T, E>
    복사하지 않는 임시 읽기 뷰Slice<T>
    소유권을 가진 재귀 연결Box<T>

    이 타입들은 전달 비용과 사용 가능 범위도 다릅니다. 구조체와 enum, 복사·이동·참조, 슬라이스와 이터레이터를 이어서 읽으세요. 정확한 규칙은 타입 레퍼런스에서 조회할 수 있습니다.

    예제에서 float(5) / 2.0을 float(5 / 2)로 바꾸고 출력 차이를 설명해 보세요. U8에 담을 값을 선택한 뒤, 그 값이 255를 넘을 수 있는 입력인지도 확인하세요.