블로그로 돌아가기

[Rust] 변수와 가변성: Rust가 데이터를 다루는 안전한 방법

(수정됨: 2026년 3월 21일)

안녕! Rust라는 새로운 언어를 배우기 시작한 걸 진심으로 환영해. 처음에는 조금 까다롭게 느껴질 수 있지만, 사실 Rust는 네가 더 안전하고 튼튼한 코드를 짤 수 있도록 옆에서 도와주는 든든한 조력자 같은 언어야. 오늘은 Rust의 가장 기초가 되는 변수와 가변성, 그리고 상수와 섀도잉에 대해 함께 알아보자.


변수는 기본적으로 바꿀 수 없어요 (Immutability)

Rust에서 변수를 선언할 때 사용하는 let 키워드는 기본적으로 불변(Immutable)이야. 즉, 한 번 값을 정하면 나중에 바꿀 수 없다는 뜻이지. 왜 이렇게 만들었을까? 바로 데이터의 안정성 때문이야. 코드 한쪽에서 값을 쓰고 있는데 다른 쪽에서 몰래 바꿔버리면 버그가 생기기 쉽거든.

예시를 한번 볼까? 이 코드는 컴파일이 안 될 거야.

Rust
fn main() {
    let x = 5;
    println!("x의 값: {x}");
    x = 6; // 여기서 에러 발생!
    println!("x의 값: {x}");
}

이 코드를 실행하려고 하면 Rust 컴파일러가 "불변 변수 x에 값을 두 번 할당할 수 없어!"라고 친절하게(하지만 단호하게) 알려줄 거야.


하지만 바꾸고 싶을 때가 있죠? mut 키워드

프로그램을 만들다 보면 당연히 값이 변해야 하는 상황이 생겨. 그럴 때는 변수 이름 앞에 mut라는 키워드만 붙여주면 돼. "이 변수는 앞으로 값이 변할 수도 있어"라고 미리 선언하는 거지.

Rust
fn main() {
    let mut x = 5;
    println!("처음 x의 값: {x}");
    x = 6; // 이제 가능해요!
    println!("바뀐 x의 값: {x}");
}

이렇게 mut를 사용하면 나중에 코드를 읽는 사람도 "아, x는 중간에 값이 바뀌는 변수구나"라고 쉽게 이해할 수 있어.


절대 변하지 않는 값, 상수 (Constants)

변수와 비슷해 보이지만 조금 더 엄격한 녀석이 바로 상수(Constants)야. 상수는 const 키워드를 사용해서 선언해.

변수와 다른 점은 세 가지야:

  1. mut를 절대 사용할 수 없어. 태어날 때부터 끝까지 불변이야.
  2. 타입을 반드시 명시해야 해. (나중에 배울 u32 같은 것들 말이야.)
  3. 실행 중에 계산되는 값이 아니라, 컴파일 시점에 알 수 있는 고정된 값만 넣을 수 있어.
Rust
const THREE_HOURS_IN_SECONDS: u32 = 60 * 60 * 3;

보통 전체 대문자에 언더바(_)를 섞어서 이름을 짓는 게 관례야. 게임의 최대 점수나 빛의 속도처럼 프로그램 어디서든 변하지 않는 기준값을 정할 때 아주 유용해.


변수 이름을 재사용하는 마법, 섀도잉 (Shadowing)

Rust에는 섀도잉(Shadowing)이라는 재미있는 개념이 있어. 이미 사용한 변수 이름을 다시 let 키워드로 선언하는 거야. 그러면 뒤에 나온 변수가 앞의 변수를 가려버리게 돼.

Rust
fn main() {
    let x = 5;
    let x = x + 1; // 5 + 1 = 6

    {
        let x = x * 2; // 6 * 2 = 12
        println!("안쪽 중괄호에서의 x 값: {x}");
    }

    println!("바깥쪽 x 값: {x}"); // 다시 6이 출력돼
}

mut와 섀도잉의 차이점은 뭐야?

  • 타입 변경 가능: 섀도잉을 쓰면 이름은 같지만 데이터 타입을 바꿀 수 있어. 예를 들어, 공백 문자열 " "을 받아서 그 길이인 숫자 3으로 바꿔서 다시 저장할 때 유용해. mut로는 불가능한 일이지.
  • 불변성 유지: 섀도잉은 새로운 변수를 만드는 것이기 때문에, 값을 변형한 직후에는 다시 불변 상태가 되어 안전해.

전체 내용 요약

개념설명
ImmutabilityRust 변수는 기본적으로 불변이야. 코드의 안정성을 높여줘.
mut변수 이름 앞에 붙여서 값을 수정할 수 있게 만들어줘.
Constantsconst로 선언하며, 영원히 변하지 않는 고정된 값에 사용해. 타입 명시가 필수야.
Shadowinglet을 다시 사용해 변수 이름을 재사용하는 거야. 타입 변환이 가능하고 편리해.

댓글