Rust

[Rust] 불변성과 섀도잉

yjk490 2024. 3. 31. 16:00

불변성 (Immutable)

  • 러스트에서는 변수가 기본적으로 불변성을 지님
  • 변수가 한 번 선언되면 이후 다른 값을 저장할 수 없음
  • mut 키워드를 지정하여 가변 변수로 선언할 수 있음
fn main() {
    let x = 5;
    println!("The value of x is: {x}");

    // 아래 코드를 주석 해제하면 에러 발생
    // x = 10;  // Error, x에는 이미 값이 할당되었기 때문에 다른 값을 할당할 수 없음
    println!("The value of x is: {x}");
}
fn main() {
    let mut x = 5;
    println!("The value of x is: {x}");

    x = 10;   // Success, mut 키워드를 통해 가변 변수임을 명시하여 다른 값을 할당함 
    println!("The value of x is: {x}");
}

불변성의 장점

  • 메모리 안정성
    • 변수의 값이 변경되지 않기 때문에 다른 부분에서 동시에 접근하더라도 안전하게 사용할 수 있다. 이는 런타임 에러를 방지함으로써 프로그램의 안정성을 향상시킨다.
  • 가독성
    • 앞 부분에 선언된 변수의 값은 코드가 실행됨에 따라 값이 변경되지 않음을 보장한다. 즉, 해당 변수의 값이 어디서 어떻게 바뀔지 추적할 필요가 없기 때문에 가독성이 향상된다.
    • 값이 변경될 변수의 경우 mut 키워드를 추가해야하기 때문에 코드를 읽는 사람을 하여금 이 변수의 값이 변경될 것이라는 의도를 전달할 수 있다.

상수와의 차이점

  • 불변 변수는 런타임에 값을 할당할 수 있으나, 상수는 컴파일 타임에만 값을 할당할 수 있음
const MAX_NUM: u32 = 100; // 상수 선언

fn main() {
    let num = 50;

    if num < MAX_NUM {
        println!("Number is less than MAX_NUM.");
    }

    // 다음 줄의 주석을 해제하면 컴파일 에러가 발생
    // MAX_NUM = 200; // 상수의 값은 동적으로 할당할 수 없음
}

섀도잉 (Shadowing)

  • 새 변수명을 이전 변수명과 같은 이름으로 선언하는 것
  • 첫 번째 변수가 두 번째 변수에 의해 가려졌음(Shadowed)을 의미
  • 블록 단위로 작동함
fn main() {
    let x = 5;

    {
        let x = x * 2; // let 키워드로 같은 이름의 변수를 다시 선언함 (섀도잉)
        println!("Inner x: {}", x); // Inner x: 10 출력
    } // 이 블록을 빠져나가면 내부의 변수 x는 사라짐

    println!("Outer x: {}", x); // Outer x: 5 출력. 외부에서는 이전 변수 x에 접근 가능합니다.

    let x = x + 3; // x를 섀도잉하여 새로운 값을 할당함
    println!("Shadowed x: {}", x); // Shadowed x: 8 출력
}

섀도잉과 mut 키워드의 차이점

  • 섀도잉은 let 키워드 사용을 강제하기 때문에 값의 변경 이후 불변성을 유지할 수 있음
  • 또한, let 키워드를 사용하면 같은 이름의 변수에 다른 타입을 할당할 수 있음
  • mut 키워드를 통해 값을 변경할 때는 타입은 변경할 수 없음
fn main() {
    let space = "   ";
    let space = space.len();

    println!("space : {space}");

    let mut mut_space = "   ";
    // mut_space = mut_space.len();  // 이 라인을 주석 해제하면 에러 발생, 변수 mut_space는 문자열 타입이기 때문.
}