[Rust] 변수와 가변성 이해하기
안녕하세요! 오늘은 Rust 프로그래밍의 가장 기본이 되는 변수와 가변성에 대해 알아보겠습니다. Rust는 다른 언어들과는 조금 다른 독특한 방식으로 변수를 다루는데요, 이 특징이 바로 Rust를 안전하고 강력하게 만들어주는 핵심 중 하나입니다.
변수는 기본적으로 불변입니다
Rust에서 변수를 선언할 때 사용하는 let 키워드는 기본적으로 불변(Immutable)입니다. 즉, 한 번 이름을 값에 묶고 나면 그 값을 바꿀 수 없다는 뜻이죠.
예를 들어 아래와 같은 코드를 작성해 볼까요?
fn main() {
let x = 5;
println!("x의 값: {x}");
x = 6; // 여기서 에러가 발생합니다!
println!("x의 값: {x}");
}
이 코드를 실행하면 Rust 컴파일러는 cannot assign twice to immutable variable x라는 에러를 던집니다. "불변 변수인 x에 값을 두 번 할당할 수 없다"는 뜻이죠.
왜 이렇게 불편하게 만들었을까요? 그 이유는 안전성 때문입니다. 코드의 한 부분에서는 값이 절대 안 변한다고 가정하고 작업하는데, 다른 부분에서 몰래 값을 바꿔버리면 찾기 힘든 버그가 생길 수 있거든요. Rust는 컴파일 단계에서 이를 미리 방지해 줍니다.
가변성이 필요할 땐 mut 키워드
하지만 프로그램을 만들다 보면 값을 바꿔야 하는 상황이 당연히 생기죠. 그럴 때는 mut 키워드를 붙여주면 됩니다.
fn main() {
let mut x = 5;
println!("x의 값: {x}");
x = 6; // 이제 가능합니다!
println!("x의 값: {x}");
}
이렇게 mut을 붙이면 나중에 이 변수의 값이 바뀔 수 있다는 것을 컴파일러와 미래의 동료(혹은 미래의 나)에게 명확하게 알려주는 효과도 있습니다.
상수(Constants)와 변수의 차이
불변 변수와 비슷해 보이지만, 상수(Constants)는 조금 더 엄격합니다. const 키워드를 사용하며 몇 가지 차이점이 있어요.
mut을 절대 사용할 수 없습니다. 상수는 태생부터 끝까지 불변입니다.- 반드시 타입을 명시해야 합니다 (예:
u32). - 실행 시점(Runtime)에 계산되는 값은 넣을 수 없고, 반드시 컴파일 시점에 알 수 있는 상수 표현식만 가능합니다.
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;
상수는 프로그램 전체에서 변하지 않는 고정값(게임의 최대 점수, 빛의 속도 등)을 정의할 때 유용합니다. 대문자와 언더바(_)를 사용하는 것이 관례입니다.
변수 가리기(Shadowing)
Rust에는 섀도잉(Shadowing)이라는 재미있는 개념이 있습니다. 이전에 선언한 변수와 같은 이름으로 새 변수를 다시 선언하는 것이죠.
fn main() {
let x = 5;
let x = x + 1; // 첫 번째 x를 가리고 새로운 x를 만듭니다.
{
let x = x * 2; // 안쪽 스코프에서만 유효한 새로운 x
println!("안쪽 스코프 x: {x}"); // 12
}
println!("바깥쪽 스코프 x: {x}"); // 6
}
Shadowing vs mut
mut과 섀도잉은 다릅니다.
- 불변 유지: 섀도잉은
let을 다시 사용하기 때문에, 변환 작업이 끝난 후의 변수는 여전히 불변 상태를 유지할 수 있습니다. - 타입 변경 가능:
mut은 값은 바꿀 수 있지만 타입은 못 바꿉니다. 반면 섀도잉은 아예 새로운 변수를 만드는 것이라 타입도 바꿀 수 있습니다.
// 섀도잉을 이용한 타입 변환 (가능)
let spaces = " "; // 문자열 타입
let spaces = spaces.len(); // 숫자 타입으로 재탄생!
만약 이걸 mut으로 하려 했다면, 컴파일러가 "문자열 넣기로 해놓고 왜 숫자를 넣니?"라며 혼을 낼 거예요.
요약
- 불변성: Rust 변수는 기본적으로
let으로 선언하며 값을 바꿀 수 없습니다. - 가변성: 값을 바꾸려면
let mut을 사용하세요. - 상수:
const는 항상 불변이며 타입 명시가 필수입니다. - 섀도잉: 같은 이름의 변수를 새로 선언해 값을 변형하거나 타입을 바꿀 수 있습니다.