Rust의 기본 변수는 불변성 입니다. 이는 Rust가 제공하는 안전성과 손쉬운 동시성이라는 장점을 취할 수 있도록 강제하는 요소 중 하나입니다. 변수가 불변성인 경우, 값이 bound되면 해당 값을 변경할 수 없습니다. 불변성 변수에 재할당을 하려고 할 때 컴파일러 에러가 발생하게 됩니다.
Rust에서는 컴파일러가 변경되지 않은 값에 대한 보증을 해줍니다. 코드를 작성하거나 분석할 때 변수의 값이 어떻게 변경되는지 추적할 필요가 없어지기 때문에 코드를 더 합리적으로 만들어줍니다.
변수는 기본적으로 불변성이지만 변수명의 접두어로 mut
을 추가하는 것을 통해 가변성 변수 선언이 가능합니다. 이는 향후 코드를 보는 사람에게 코드의 다른 부분에서 변수의 값을 변경할 것이라는 의미를 전달할 수 있습니다.
fn main() {
let mut x = 5;
println!("The value of x is: {}", x);
x = 6;
println!("The value of x is: {}", x);
}
위의 코드를 수행하면 x의 값이 5에서 6으로 변경된 것을 확인할 수 있습니다.
변수의 불변성은 상수를 떠올리게 합니다. 하지만 상수와 변수는 조금 다릅니다. 상수는 const
키워드를 사용해야 하며 mut
을 사용할 수 없습니다. 또한 상수는 값의 유형을 선언해야 합니다. 상수는 전체 영역을 포함해 어떤 영역에서도 선언될 수 있습니다. 그리고 상수는 오직 상수 표현식만 설정될 수 있으며 함수 호출의 결과값이나 그 외의 실행 시간에 결정되는 값이 설정될 수 없습니다.
const MAX_POINTS : u32 = 100_000;
위의 예제는 MAX_POINTS
라는 이름을 갖는 상수를 선언하며 값을 100,000으로 설정합니다. Rust의 상수 명명 규칙에 따라 모든 단어를 대문자로 사용합니다.
let 키워드를 사용해 이전에 선언한 변수와 같은 이름의 새 변수를 선언할 수 있고, 새 변수는 이전 변수를 shadows하게 됩니다. 달리 말해, 첫 변수가 두 번째에 의해 shadowed 된 것입니다.
fn main() {
let x = 5;
let x = x + 1;
let x = x * 2;
println!("The value of x is: {}", x);
}
실행 결과 : The value of x is: 12
shadowing의 사용은 변수를 mut
으로 선언하는 것과는 차이가 있습니다. let
키워드를 사용하지 않고 변수에 새로운 값을 대입하려고 하면 컴파일시에 에러가 발생하기 때문입니다.
shadowing은 let
키워드를 사용하여 효과적으로 새 변수를 선언하고, 값의 유형을 변경할 수 있으면서도 동일 이름을 사용할 수 있습니다. 예를 들어, 공백 문자들을 입력받아 얼마나 많은 공백 문자가 있는지 보여주고자 할 때 실제로 저장하고자 하는 것은 공백의 개수인 상황에서 효과적으로 사용할 수 있습니다.
let spaces = " ";
let spaces = spaces.len();
shadowing을 통해 space_str
이나 space_num
과 같이 대체된 이름을 사용하는 대신 간단히 spaces 이름을 사용할 수 있습니다. 만약 mut
을 사용한 변수 선언으로 위와 같은 일을 수행하려 한다면 변수의 유형을 변경할 수 없다는 컴파일 에러를 얻게 됩니다.