이 글은 러스트 한국어 문서를 바탕으로 작성되었습니다.
러스트에서의 변수는 기본적으로 불변하다.
즉, 러스트에서는 한 번 값을 할당하면 그 값을 영원히 변경할 수 없다.
다음의 예시 코드를 보자.
fn main() {
let x = 5;
println!("x의 값 : {x}");
x = 6;
println!("x의 값 : {x}");
}
// error[E0384]:
// 불변 변수 x에 두 번 값을 할당할 수 없다.
컴파일러는 불변 변수에 값을 2번 할당하지 말라고 한다. 우리가 불변 변수 x에 두 번째 값을 할당하려고 했기 때문이다.
하지만 우리가 변수를 가변적으로 사용하고 싶을 때는 어떻게 해야 하는가?
mut
키워드mut
키워드는 우리가 변수를 가변적으로 사용하고 싶을 때 사용한다.
이 키워드는 다음과 같이 사용할 수 있다.
fn main() {
let mut x = 5;
println!("x의 값 : {x}");
x = 6;
println!("x의 값 : {x}");
}
cargo run
으로 코드를 실행시켜보자.
$ cargo run
...
x의 값 : 5
x의 값 : 6
정상적으로 작동한다!
상수는 불변 변수와 비슷하나, 변수와는 약간 다른 점이 있다.
일단, 상수는 mut
키워드와 같이 사용할 수 없다.
기본적으로 불변한 것이 아닌, 항상 불변이기 때문이다.
그리고 상수는 일반적 변수처럼 let
으로 선언하지 않고 const
키워드로 정의하며, 값의 타입은 반드시 명시되어야 한다. 타입은 다음 글에서 설명할 것이다.
그리고 마지막 차이점은 상수는 반드시 상수 표현식으로만 설정될 수 있고, 런타임에서만 계산될 수 있는 결과값으로는 안된다는 것이다.
다음은 상수 선언의 간단한 예제이다.
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
여기서 알 수 있는 것은 러스트의 이름 짓기 관례에서 상수는 언더바와 대문자로 이루어져야 한다는 것이다.
또한 위와 같이 상수값을 정할 때에는 컴파일 타임에 연산을 수행하도록 하는 것을 볼 수 있는데, 사용할 수 있는 것들의 종류는 여기서 더 자세히 알아볼 수 있다.
상수는 선언된 스코프 내에서 프로그램이 동작하는 전체 시간 동안 유효하다. 이러한 특성은 프로그램의 여러 부분에서 알 필요가 있는 값들에 유용하다.
Rust에서는 새 변수를 이전 변수명과 같은 이름으로 선언할 수 있다! 이때 이것을 첫 번째 변수가 두 번째 변수에 의해 가려졌다(shadowed)고 표현하며, 이후 이를 사용할 때 두 번째 변수의 값을 사용한다.
다음은 섀도잉의 예시이다.
fn main() {
let x = 5;
let x = x + 1;
{
let x = x * 2;
println!("스코프 안의 x의 값: {x}");
}
println!("x의 값 : {x}");
}
이 프로그램을 해석해보자.
먼저 프로그램은 x
에 5
라는 값을 넣고, 이후 원래 값에 1
을 더한 값을 대입해 x
의 값은 6
이 된다.
그 후 중괄호를 이용해 만들어진 또 다른 x
의 값은 6 * 2
를 평가한 12
가 되고 이것을 출력한다.
이 중괄호의 코드가 끝났으므로 중괄호 내의 섀도잉은 끝나 x는 다시 6으로 돌아오고 이를 출력한다.
그러므로 출력은 다음과 같다.
$ cargo run
...
스코프 안의 x의 값 : 12
x의 값 : 6
섀도잉은 mut
키워드를 사용한 것과는 다르다.
실수로 let 키워드 없이 변수에 값을 재할당하면 컴파일 타임에 에러가 발생하기 때문이다. 그리고 mut
과 섀도잉의 또 다른 차이점은 let으로 새로운 변수를 사용하는 것이기 때문에 다른 타입의 값을 저장할 수 있다는 것이다.
let spaces = " ";
let spaces = spaces.len();
첫 번째 spaces는 문자열이고, 두 번째 spaces는 숫자 타입이다. 따라서 섀도잉은 spaces_str과 같은 구분되는 변수명을 쓸 필요가 없도록 해준다.
mut로 이를 하려고 하면 에러가 발생한다.
let mut spaces = " ";
spaces = spaces.len();
출력은 다음과 같다.
$ cargo run
...
error[E0308]: mismatched types
...
다음 글은 변수가 가질 수 있는 타입들에 대해 알아볼 것이다.