Rust의 내장 타입 시스템
학습 목표: Rust의 기본 데이터 타입(
i32,u64,f64,bool,char)과 타입 추론, 명시적 타입 주석에 대해 알아봅니다. 특히 C/C++와 비교했을 때 암시적 형변환(Implicit Conversion)이 없다는 점과 명시적 캐스팅(Explicit casts)의 중요성을 이해합니다.
- Rust는 강력한 타입 추론 기능을 제공하지만, 필요한 경우 변수 이름 뒤에
:를 붙여 타입을 명시적으로 지정할 수 있습니다.
| 분류 | 타입 종류 | 코드 예시 |
|---|---|---|
| 부호 있는 정수 | i8, i16, i32, i64, i128, isize | -1, 42, 1_00_000, 1_00_000i64 |
| 부호 없는 정수 | u8, u16, u32, u64, u128, usize | 0, 42, 42u32, 42u64 |
| 부동 소수점 | f32, f64 | 0.0, 0.42 |
| 유니코드 문자 | char (4바이트) | 'a', '윤', '$', '🦀' |
| 논리형 | bool | true, false |
- 팁: 큰 숫자의 가독성을 위해 중간에
_를 자유롭게 사용할 수 있습니다. (예:1_000_000)
타입 지정과 값 할당
Rust에서 변수를 선언할 때는 let 키워드를 사용합니다. 타입은 값의 접미사로 붙이거나 변수명 뒤에 명시할 수 있습니다.
fn main() { let x: i32 = 42; // 변수명 뒤에 타입 명시 // 아래 두 방식은 결과적으로 동일합니다. let y: u32 = 42; let z = 42u32; // 리터럴 접미사를 통한 타입 지정 }
- 함수 시그니처: 함수의 매개변수와 반환값은 반드시 타입을 명시해야 합니다.
#![allow(unused)] fn main() { // u8 타입 인자를 받아 u32 타입을 반환하는 함수 fn multiply_and_cast(x: u8) -> u32 { // Rust는 암시적 확장을 허용하지 않으므로 'as' 키워드로 캐스팅해야 합니다. return (x as u32) * (x as u32); } }
- 팁: 선언만 하고 사용하지 않는 변수 때문에 발생하는 경고를 끄려면 변수명 앞에
_를 붙이세요. (예:let _unused = 10;)
타입 추론 (Type Inference)
Rust 컴파일러는 코드의 문맥을 분석하여 변수의 타입을 똑똑하게 추론해냅니다.
fn print_u32(x: u32) { println!("u32 값: {}", x); } fn print_u8(x: u8) { println!("u8 값: {}", x); } fn main() { let a = 42; // 여기서 a는 아래 print_u32 함수의 인자로 쓰이므로 u32로 추론됩니다. let b = 42; // 여기서 b는 아래 print_u8 함수의 인자로 쓰이므로 u8로 추론됩니다. print_u32(a); print_u8(b); }
▶ Rust Playground에서 직접 테스트해 보세요.
변수의 가변성 (Mutability)
Rust의 변수는 기본적으로 **불변(Immutable)**입니다. 값을 변경해야 한다면 반드시 mut 키워드를 명시해야 합니다.
fn main() { let a = 42; // a = 43; // 에러! 불변 변수는 다시 할당할 수 없습니다. let mut b = 42; // 'mut'를 붙여 가변 변수로 선언 b = 43; // 정상 작동 }
변수 섀도잉 (Shadowing)
동일한 이름의 변수를 다시 선언하여 이전 변수를 '가리는' 기법입니다. 이는 기존 값을 유지하면서 타입만 바꾸거나, 불변성을 유지하며 값을 가공할 때 유용합니다.
fn main() { let a = 42; { let a = "Hello"; // 새로운 블록에서 이전 'a'를 가립니다. 정수 -> 문자열로 타입 변경 가능. println!("블록 안: {}", a); } println!("블록 밖: {}", a); // 다시 원래의 정수 42가 나타납니다. let a = a + 1; // 동일 레벨에서도 섀도잉이 가능합니다. 새 변수를 만드는 개념입니다. }
이 방식은 C++에서 변수 이름을 a_str, a_int 등으로 계속 새로 짓는 수고를 덜어주며 가독성을 높여줍니다.