변수와 가변성

변수와 가변성

프로그램에서 값을 담아 두는 가장 기본적인 공간이 바로 변수예요. Rust는 이 변수의 성격을 처음부터 아주 깐깐하게 잡아주는데요, 가장 대표적인 규칙이 "기본적으로 불변(immutable)"이라는 점이에요. 값을 한 번 바인딩하면 바꿀 수 없는 대신, 그만큼 실수로 값을 덮어쓰는 사고를 미리 막아줘요.

출처: The Rust Programming Language - Variables and Mutability

변수를 선언할 때 let을 쓰면 값이 불변으로 고정돼요. 그래서 아래처럼 바인딩한 뒤 값을 바꾸려 하면 컴파일 타임에 에러가 나요.

let x = 5;
x = 6; // error[E0384]: cannot assign twice to immutable variable

그런데 실제 코드에서는 값을 바꿔야 하는 경우도 많죠. 그럴 땐 mut 키워드를 변수 이름 앞에 붙여 주면 돼요. mut은 단순히 구문일 뿐 아니라 "이 값은 앞으로 바뀔 수 있다"는 의도를 다른 개발자에게 전달하는 신호이기도 해요.

let mut y = 5;
y = 6;
println!("y = {y}");

불변만 고집하다 보면 이름이 겹치는 난감한 상황이 생기기도 해요. 그럴 때 Rust는 섀도잉(shadowing)이라는 독특한 기능을 제공해요. 같은 이름으로 새 변수를 선언하면, 이후 코드에서는 새 변수가 이전 변수를 가려요(shadow). 이름을 새로 짓지 않고 재사용할 수 있다는 점이 편리하죠.

let spaces = "   ";
let spaces = spaces.len(); // 이름은 그대로, 타입은 usize로 바뀜

여기서 첫 번째 spaces는 문자열 타입이고, 두 번째 spaces는 숫자 타입이에요. 섀도잉 덕분에 spaces_str, spaces_num 같은 이름을 따로 만들 필요가 없어요. 다만 이 경우에 mut을 쓰면 타입을 바꿀 수 없어서 컴파일 에러가 나요. mut은 같은 타입 안에서 값만 비꾸는 도구이고, 섀도잉은 아예 새 변수를 만드는 도구라서 성격이 달라요.

더 알아보기