Python 이나 JavaScript 에서 오면 Rust 의 첫 진짜 충격이 이거야: 변수는 기본이 불변. let x = 5; 는 못 바꾸는 값을 묶어. 바꾸고 싶어? mut 으로 opt-in 해야 해.
let 과 mut
let x = 5; 는 고정이야. let mut x = 5; 는 재할당 가능하고. 이거 관료주의가 아니야 — 대부분의 값은 바뀌면 안 되니까 불변이 기본이고, 컴파일러는 안정적이라고 아는 것에 대해 훨씬 공격적으로 추론할 수 있어. 변형이 일어나는 자리에 정확히 표시하니까 읽는 사람도 한눈에 봐.
const — 컴파일 타임 상수
const MAX: u32 = 100_000; 은 진짜 상수야: 항상 불변, 타입 표기 필수, 컴파일 타임에 계산돼. 개념상 영원히 고정인 값 (한계치, 변환 계수) 엔 const, 지역적인 건 전부 let.
섀도잉 — 같은 이름, 새 값
옛 변수랑 같은 이름으로 새 변수를 선언할 수 있어. 이건 변형이 아니야 — 이전 걸 가리는 완전히 새 바인딩이고, 타입까지 바꿀 수 있어. 좋은 이름 하나를 유지하면서 값을 단계별로 변형하는 관용적 방법이야.
기본 불변은 제약이 아니라 기능이야. 정확히 뭐가 바뀌는지 표시하게 밀어붙이는데, 그게 미래의 독자랑 컴파일러의 옵티마이저가 제일 필요로 하는 정보거든.
타입 추론
Rust 는 정적 타입인데 굳이 말하라고 안 해. let x = 5; 는 i32 로 추론돼. 컴파일러가 못 알아낼 때 (문자열을 숫자로 파싱한다든가) 나 명확함을 위해 명시하고 싶을 때만 annotation 달아.