Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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, usize0, 42, 42u32, 42u64
부동 소수점f32, f640.0, 0.42
유니코드 문자char (4바이트)'a', '윤', '$', '🦀'
논리형booltrue, 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 등으로 계속 새로 짓는 수고를 덜어주며 가독성을 높여줍니다.