자료형과 형 변환
선택한 언어나 버전에는 이 주제가 없어 같은 영역의 시작 페이지를 표시합니다.
변수에 타입을 적는 것은 값의 종류와 허용할 연산을 정하는 일입니다. 이 장에서는 숫자의 크기, 명시적 형 변환, 타입을 직접 적어야 하는 위치를 다룹니다. 먼저 변수와 값을 읽으세요.
기본 자료형 선택
섹션 제목: “기본 자료형 선택”| 타입 | 용도와 주의점 |
|---|---|
Int (I64) | 기본 정수. 소수 부분이 없는 계산에 사용합니다. |
I8, I16, I32, I64 | 부호 있는 8·16·32·64비트 정수입니다. |
U8, U16, U32, U64 | 부호 없는 정수입니다. 예를 들어 U8의 범위는 0부터 255입니다. |
Float (F64), F32 | 소수 부분이 필요한 계산에 사용합니다. |
Bool | true 또는 false. 조건식에는 이 타입이 필요합니다. |
String | 바이트로 이루어진 불변 문자열입니다. |
Unit | 반환값이 없음을 나타냅니다. 값은 ()입니다. |
타입을 정할 근거가 없는 정수 리터럴은 Int, 실수 리터럴은 Float가 됩니다. let count: I32 = 42;처럼 문맥으로 타입을 알려 줄 수 있습니다. 이미 타입이 정해진 변수는 다른 숫자 타입으로 자동 변환되지 않습니다.
숫자 타입 사이에서 변환하기
섹션 제목: “숫자 타입 사이에서 변환하기”다음을 data_types.xen으로 저장하세요. i64, u8, float는 새 타입의 값을 만듭니다. 원래 변수의 타입을 바꾸지는 않습니다.
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.xenxen run data_types.xen4225521.022.535 / 2는 두 피연산자가 정수이므로 2가 됩니다. 소수 부분이 필요하면 나눗셈 전에 float(5)처럼 변환하세요. float(5 / 2)는 이미 계산된 정수 2를 변환하므로 버린 소수 부분을 되살리지 못합니다.
마지막 출력 3은 "한"의 UTF-8 바이트 수입니다. 문자열 길이는 글자 수가 아닙니다. 문자 인덱싱은 지원하지 않습니다.
타입 불일치 고치기
섹션 제목: “타입 불일치 고치기”다음은 의도적으로 실패하는 완전한 프로그램입니다. numeric_mismatch.xen으로 저장하고 xen check numeric_mismatch.xen을 실행하세요.
fn main() { let wide: Int = 42; let narrow: I32 = wide; println(narrow);}진단에는 다음 부분이 포함됩니다. 파일 경로와 줄 번호는 생략했습니다.
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에서 실패합니다.
fn main() { let value = 256; println(u8(value));}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를 넘을 수 있는 입력인지도 확인하세요.