# 변수와 상수

러스트에서 변수는 기본적으로 불변(immutable)이다. 즉, let 키워드로 변수를 선언하면 해당 변수에 새로운 값을 할당할 수 없다. 불변 변수는 전체적인 프로그램의 안정성을 높이는데 기여한다. 만약 같은 이름의 변수를 다른 값으로 다시 정의하려면 섀도잉(shadowing) 기능을 활용할 수 있다. 섀도잉은 이전 변수를 완전히 새로운 변수로 대체하면서, 같은 변수 이름을 재사용한다. 이 기능을 사용하면 불변 변수를 기반으로 새로운 변환 결과나 타입을 안전하게 재할당하는 등의 작업을 수행할 수 있다. 다만 섀도잉은 값이 변경되었다기보다는 전혀 다른 변수가 같은 이름을 이어받았다고 보는 것이 정확하다.

변수에 다른 값을 재할당해야 한다면 가변(mutable) 변수로 선언해야 한다. let 키워드 뒤에 mut 키워드를 붙이면 가변 변수로 선언된다. 이렇게 선언된 변수는 여러 번 값을 변경할 수 있다. 가변성은 유용하지만 프로그램 흐름이 복잡해질 수 있으므로 필요한 경우에만 신중하게 사용해야 한다.

러스트에서는 상수(const)도 선언할 수 있다. 상수는 프로그램 전체가 실행되는 동안 고정된 값을 가지며, 반드시 타입을 명시해야 한다. 보통 상수 이름은 대문자로 작성하고, 여러 단어가 있을 경우 언더스코어로 구분하는 관례를 따른다. 상수는 let 대신 const 키워드를 사용하며, 가변성 여부와 상관없이 항상 불변이며 스코프를 벗어나지 않는다. 또한 반드시 컴파일 타임에 결정될 수 있는 값이어야 하므로, 런타임에 계산되는 값은 상수로 사용할 수 없다.

예시 코드는 다음과 같다.

```
fn main() {
    // 불변 변수 선언
    let x = 10;
    // 여기서 x는 더 이상 변경할 수 없다
    
    // 가변 변수 선언
    let mut y = 5;
    // 이제 y는 다시 할당할 수 있다
    y = 20;
    
    // 섀도잉
    let x = x + 5;
    // 같은 이름 x를 재사용했지만, 이전 x와는 완전히 다른 변수
    
    // 상수 선언
    const MAX_SIZE: u32 = 100;
    // 타입을 반드시 지정해야 하며, 불변이다
    
    println!("x: {}, y: {}, MAX_SIZE: {}", x, y, MAX_SIZE);
}
```

위 예제에서 x는 처음에 10으로 선언된 후 더 이상 변경할 수 없다. 그러나 let x = x + 5 구문이 등장하면서 새로운 변수 x가 섀도잉을 통해 다시 선언되었다. 이전 x는 10이었지만 새로운 x의 값은 15가 된다. y는 가변 변수로 선언되었기 때문에 y = 20 과 같이 재할당이 가능하다. 상수 MAX\_SIZE는 프로그래밍 언어적으로나 표준 라이브러리 규칙상 변경할 수 없는 값으로서, 프로그램 시작부터 종료까지 유효하고 프로그램 내부 어디서나 동일한 값으로 참조된다.

러스트에서 변수와 상수의 개념을 명확히 이해하면, 프로그램의 흐름을 구조적으로 설계하고 메모리 사용 방식을 더욱 예측 가능하게 만들 수 있다. 가변성을 최소화하고 불변 변수와 상수를 적극적으로 활용하면, 안전성과 가독성이 높은 러스트 코드를 작성할 수 있게 된다.
