데이터 타입
Rust에서 모든 값은 데이터 타입입니다. 이는 데이터가 어떤 종류의 데이터로 지정되는지 알려주어 데이터 처리 방식을 더 잘 지정할 수 있게 해줍니다.
데이터 유형에는 스칼라 및 컴포지트의 두 가지 하위 집합이 있습니다.
스칼라 타입
스칼라 타입은 개별 값을 나타내며, Rust에는 네 가지 기본 스칼라 타입이 있습니다:
- 정수
- 부동 소수점
- Boolean
- 문자 유형
정수
숫자 유형은 기본값이 i32입니다.
| 8-bit | i8 | u8 |
| i16 | i16 | u16 |
| i32 | i32 | u32 |
| i64 | i64 | u64 |
| i128 | i128 | u128 |
| arch | isize | usize |
각 이형 상품은 서명되거나 서명되지 않은 값을 가져야 합니다.
부호화된 비트 변형은 -)에서 2^ - 1까지의 숫자를 저장할 수 있고 부호화되지 않은 비트 변형은 2^n - 1까지의 숫자를 저장할 수 있습니다.
isize 및 usize 유형은 프로그램이 실행되는 컴퓨터의 아키텍처에 따라 달라집니다(예: 64비트 아키텍처에서는 64비트, 32비트 아키텍처에서는 32비트).
여러 숫자 유형의 숫자 리터럴에는 66i8과 같은 유형 접미사를 사용할 수 있습니다.
정수 오버플로
Rust는 정수 오버플로 문제도 겪습니다.
- 디버그 모드에서 코드를 컴파일할 때 정수 오버플로 패닉 발생
- Rust는 정수 오버플로 패닉 없이 릴리스 모드에서 코드를 컴파일하는데, 여기서 Rust는 이진 보완 연산을 수행하여 해당 유형이 보유할 수 있는 최대값보다 큰 값은 최소값으로 반올림합니다(예: 최대값이 , 이고 값이 에 바인딩된 경우 , 로 변경되는 등의 방식으로). 이 접근 방식은 Rust가 릴리스 모드에서 정수 오버플로에 대한 당황 없이 코드를 컴파일하는 이유를 설명합니다. 하지만 문제는 변수가 예상한 값을 얻지 못할 수 있다는 것입니다.
- 정수 오버플로 오류에 대한 명시적인 해결책은 표준 라이브러리에서 제공하는 다음과 같은 원시 숫자 유형 메서드를 사용하면 찾을 수 있습니다:
- wrapping_* 메서드
- checked_* 메서드
- overflowing_* 메서드
- saturating_* 메서드
부동 소수점
부동 소수점 유형은 기본적으로 f64입니다. 모든 부동 소수점 유형은 부호화됩니다.
Rust에는 부동 소수점 숫자의 두 가지 유형, 즉 f32와 f64가 있습니다.
fn main() {
let x = 64.0; // f64
let y: f32 = 32.0; // f32
}
Boolean
Rust에는 참과 거짓의 두 가지 부울 유형이 있으며, 부울을 사용하여 유형을 표현합니다.
fn main() {
let t = true;
let f: bool = false;
}
문자 유형
문자 유형에 문자 사용
fn main() {
let c = 'z';
let str: char = 'char';
}
문자 리터럴은 작은따옴표를 사용하여 선언하고, 큰따옴표는 문자열 리터럴을 선언합니다.
복합 유형
복합 유형은 여러 값을 단일 유형으로 조합한 것으로, Rust에는 배열과 튜플이라는 두 가지 기본 유형이 있습니다.
배열
튜플은 여러 다른 유형의 값을 하나의 복합 유형으로 결합하는 주요 방법입니다.
튜플의 길이가 고정되면 다른 언어처럼 길이가 늘어나거나 줄어들지 않습니다.
fn main() {
let tuple: (i32, f64, u8) = (123, 32.1, 1);
}
튜플에서 단일 값을 얻으려면 패턴 매칭을 사용하여 튜플을 해체하면 됩니다.
fn main() {
let tuple = (123, 32.1, 1);
let (x, y, z) = tuple;
println!("The value of x is: {x}"); // 123
}
를 사용할 수도 있습니다. 값 인덱싱을 추가하여 단일 값을 가져올 수도 있습니다.
fn main() {
let tuple = (123, 32.1, 1);
let x = tuple.0;
let y = tuple.1;
let z = tuple.2;
}
값이 없는 튜플을 단위 튜플이라고 하며, 값과 해당 유형은 모두 ()로 표기합니다.
fn main() {
let tuple: () = ();
}
배열
다른 언어와 마찬가지로 배열 유형은 배열 내 요소의 유형이 일관성이 있어야 합니다. 차이점은 Rust에서 배열의 길이는 고정되어 있으므로 불변이라는 것입니다.
fn main() {
let a = [111, 222, 333];
}
배열은 스택에 공간을 할당하거나 예약된 요소의 수를 고정하고 싶을 때 유용합니다. 하지만 배열은 벡터 유형만큼 유연하지 않습니다.
벡터 유형은 표준 라이브러리에서 제공하는 배열과 같은 컬렉션 유형으로, 길이를 늘리거나 줄일 수 있습니다.
배열 유형은 각 요소의 유형을 포함하는 대괄호 뒤에 배열 요소의 개수를 사용하여 다음과 같이 작성할 수 있습니다.
let arr: [i32, 5] = [1, 2, 3, 4, 5];
대괄호 안에 초기 값을 지정하고 요소 수를 추가하여 각 요소에 대해 동일한 값을 갖는 배열을 만들 수도 있습니다:
let arr = [3;5]; // 다음과 같습니다.[3, 3, 3, 3, 3]
인덱스로 요소에 액세스하려고 할 때 Rust는 지정된 인덱스가 배열의 길이보다 작은지 확인합니다. 인덱스가 배열의 길이를 초과하면 Rust는 패닉 상태에 빠집니다.
이러한 오류 처리 메커니즘을 통해 프로그램이 당황하거나 불법적인 메모리 액세스를 유발하지 않도록 할 수 있습니다.





