변수의 가변성#

let#

Rust에서 변수를 선언할 때 다음과 같이 let 키워드를 사용합니다.

fn main() {
    let apple = 10;
}

하지만, let 은 기본적으로 불변(immutable)이기 때문에, 다음처럼 apple의 값을 변경하려고 하면 에러가 발생합니다.

fn main() {
    let apple = 10;
    apple = 20;
}
error[E0384]: cannot assign twice to immutable variable `apple`

let mut#

값을 수정하기 위하여 다음과 같이 let mut 키워드를 사용해야 합니다.
여기서, mut는 mutable을 의미합니다.

fn main() {
    let mut apple = 10;
    apple = 20;
}

변수를 사용할 때 가변(mutable)과 불변(immutable)을 명확히 구분하는 이유는 Human error를 줄이고, 가독성 개선, 디버깅 효율성 개선, SW 품질 보장 등의 장점을 가질 수 있습니다.

Shadowing#

Rust에서는 다음과 같이 첫 번째 변수 apple이 두 번째 변수 apple에 가려진 것을 Shadowing 이라 표현합니다.
apple 변수를 사용할 때 2번째 apple을 바라보게 됩니다.

fn main() {
    let apple = 1;
    let apple = 2;
}

다음 코드처럼 Inner scope(중괄호) 에서 apple이 Shadowing되는데, 이것은 Inner scope 안에서만 유효합니다.

fn main() {
    let apple = 1;
    let apple = 2;

    {
        let apple = 3;
        println!("@@@ apple: {apple}");
    }

    println!("### apple: {apple}");
}

다음은 실행된 결과 입니다.
Inner scope 에서는 @@@ apple: 3 이 출력되고, Inner scope를 빠져나가면 ### apple: 2 가 출력됩니다.

@@@ apple: 3
### apple: 2

Shadowing 되면서 변수의 Type이 변경될 수 있습니다.
다음 코드는 apple 변수가 integer type에서 string으로 변경되었습니다.

fn main() {
    let apple = 1;
    let apple = "semonan";
}

constant#

다음 코드에서 let 기반 불변 변수 apple과 const기반 상수 banana는 값을 변경할 수 없다는 점에서 유사하지만, 다른 점이 분명히 있습니다.

fn main() {
    let apple = 1;
    const banana:u32 = 2;
}
  • 상수는 mut 과 함께 사용할 수 없습니다.
  • 상수는 프로그램이 실행되는 동안 절대로 값이 변경될 수 없습니다.
  • 상수를 생성할 때 값의 Type이 반드시 명시되어야 합니다.