Rust/Basic

[Rust Tutorial] 3 - Variables

tyoon9781 2024. 11. 14. 20:48

 


 

Intro

Rust language에서 Variable에 대한 간단한 설명을 하고자 합니다.

  1. Immutable : Rust 변수는 기본적으로 불변(Immutable)입니다.
    가변(mutable) 변수로 선언하려면 mut 키워드를 사용해야 합니다.

  2. Static Type : Rust는 static type language입니다. 모든 변수의 Type이 Compile time에 결정됩니다.
    Type은 명시적으로 지정할 수 있지만 대부분의 경우 Compiler가 스스로 추론합니다.
    Rust는 변수를 초기화 하지 않으면 사용할 수 없습니다. (let x; 같은 표현은 불가)

  3. Shadowing : 동일한 이름의 변수를 재 선언하여 이전 변수를 "감출 수"(Shadowing) 있습니다.

  4. Ownership and Lifetimes : Rust 변수는 소유권 규칙을 따릅니다. 이번 글에서는 다루지 않습니다.

 


Code Example

Rust 1.79.0 (released 2024-06-13) 

fn main(){
    println!("Hello, world!");

    /* variables with print */
    // [Error] 변수를 값으로 초기화 해야만 한다.
    // let x;

    // Rust는 null이 없는 대신에 None과 None을 포함하는 Type인 Option<T>가 존재한다.
    // 이 None을 다루는 것은 나중에 알아본다.
    let _x: Option<i32> = None;

    let x1: i32 = 1;            // let과 type을 통해 변수를 선언
    let x2 = 2;            // compiler가 추측가능한 값이면 type을 선언하지 않아도 됨
    println!("{}, {}", x1, x2); // 전통적인 format string
    println!("{x1}, {x2}");     // field formating. rust 1.58부터 사용 가능

    // [Error] 이런 방식은 지원하지 않음
    // println!("{x1+x2}");     

    println!("{result}", result=x1+x2);     // 대신 이런 방식은 지원함.


    /* not used variable */
    // 사용하지 않는 값이면 underscore를 변수앞에 붙여 warning을 방지할 수 있음.
    let _x3 = 3; 


    /* mutable */
    let _x4 = 4;    // let으로 선언한 변수
    // _x4 = 14;         // [Error] rust는 let으로 선언한 것은 기본적으로 값 수정이 불가능하다.
    let _x4 = 14;   // 하지만 let으로 새로 선언하는 것은 가능.
    let mut _x5 = 5;    // let mut로 선언한 변수는 수정할 수 있다.
    _x5 = 15;


    /* const */
    // const는 UPPER_SNAKE_CASE로 작성되어야 함. Type도 반드시 명시해야 함.
    const _THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;

    // [Error] const는 mut로 선언할 수 없다.
    // const mut _THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;    
    
    // [Error] const 변수는 재 선언할 수 없다.
    // const _THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;    

    // [Error] runtime에 결정되는 변수는 const 변수로 선언할 수 없다.
    // const DATA: u32 = get_data();      


    /* static */
    // static 는 const와 비슷.
    static _STATIC_VALUE: u32 = 0;    

    // static mut로 선언할 수 있다. (하지만 그냥 수정할 수는 없다)
    static mut _MUT_STATIC_VALUE: u32 = 0;


    /* shadowing : scope로 인해 같은 이름의 variable이 가려지는 현상. */
    let _x6 = 6;
    // rust는 여러 목적으로 code 중간에 이런 block을 생성할 수 있다. 이를 scope라 한다.
    {   
        // let _x6과 _x6 + 10에서 사용된 _x6은 서로 다른 메모리 주소를 가진다.
        let _x6 = _x6 + 10;

        // 이 이후로 scope 내에서는 밖의 _x6에 접근할 수 없다.
        println!("_x6 : {_x6}");    // 16
    // scope가 종료. scope안의 _x6은 소멸하고 외부에 있던 _x6에 다시 접근할 수 있다.
    }   
    println!("_x6 : {_x6}");        // 6

    // shadowing의 또 다른 예제. let _spaces = _spaces.len(); 에서 좌우 _spaces는 서로 다른 변수임.
    let _spaces = "   ";
    let _spaces = _spaces.len();
}

 


* reference

 - https://doc.rust-lang.org/book/