오늘은 러스트에서 가장 중요하면서도, 처음에는 조금 까다로울 수 있는 **'가변 참조의 규칙'**에 대해 알아볼 거예요.
걱정 마세요! 제가 아주 쉬운 비유로 차근차근 설명해 드릴게요. 여러분은 충분히 해낼 수 있습니다!
---
러스트에는 **'가변 참조(&mut, 값을 바꿀 수 있게 빌려오는 것)'**라는 개념이 있어요. 쉽게 말해, 친구의 공책을 빌려오는데 **"내가 내용을 고치거나 덧붙여도 돼?"**라고 허락을 받고 빌려오는 것과 같습니다.
하지만 공책의 내용이 엉망이 되지 않으려면 몇 가지 **'안전 규칙'**이 필요해요.
---
만약 여러 명이 동시에 하나의 공책에 서로 다른 내용을 쓰려고 하면 어떻게 될까요? 글씨가 겹치고 내용은 엉망이 되겠죠? 이런 현상을 **데이터 경합(Data Race, 여러 곳에서 동시에 데이터를 수정하려고 해서 생기는 문제)**이라고 해요.
러스트는 이를 방지하기 위해 아주 엄격한 규칙을 세웠습니다.
> **"특정 범위(Scope, 변수가 사용되는 구역) 안에서 가변 참조는 딱 하나만 존재해야 한다!"**
fn main() {
let mut notebook = String::from("옛날 옛적에"); // 수정 가능한 공책을 만듭니다.
let writer1 = &mut notebook; // 첫 번째 친구가 수정 권한을 빌려갔어요.
// let writer2 = &mut notebook; // (에러!) 두 번째 친구가 또 빌리려고 하면 러스트가 막아줍니다.
writer1.push_str(" 왕자가 살았습니다."); // 첫 번째 친구는 안전하게 글을 씁니다.
}
---
이번에는 누군가가 공책을 **읽고(불변 참조, &)** 있다고 생각해 보세요. 친구가 열심히 내용을 읽고 있는데, 갑자기 옆에서 누군가가 내용을 지우거나 고쳐버리면 읽고 있던 친구는 깜짝 놀라겠죠?
그래서 러스트는 이런 규칙도 가지고 있어요.
> **"누군가 데이터를 읽고 있다면, 그동안은 아무도 내용을 고칠 수 없다!"**
fn main() {
let mut notebook = String::from("사과"); // 수정 가능한 공책입니다.
let reader1 = ¬ebook; // 친구 1이 읽기 위해 빌렸습니다.
let reader2 = ¬ebook; // 친구 2도 같이 읽는 건 괜찮아요! (여러 명 읽기 가능)
// let writer = &mut notebook; // (에러!) 누군가 읽고 있는데 수정하려고 하면 러스트가 "안 돼!"라고 외칩니다.
println!("{}와 {}", reader1, reader2); // 읽기가 다 끝나야 안전합니다.
}
---
처음에는 이 규칙들이 조금 불편하게 느껴질 수 있어요. 하지만 이건 러스트라는 언어가 여러분의 프로그램이 **갑자기 멈추거나(Crash)**, **엉뚱한 값을 내놓는 것**을 미리 방지해 주는 **'든든한 안전 요원'** 역할을 하는 것이랍니다.
이 규칙 덕분에 러스트는 다른 언어들보다 훨씬 안전하고 튼튼한 프로그램을 만들 수 있어요.
---
1. **가변 참조(&mut)**는 데이터를 고치기 위해 빌리는 것입니다.
2. **한 번에 딱 한 명**만 고칠 권한을 가질 수 있습니다. (데이터 경합 방지)
3. **누군가 읽고 있다면 고칠 수 없습니다.** (데이터 일관성 유지)
처음에는 컴파일러(코드 검사기)가 내뱉는 빨간 에러 메시지에 당황할 수도 있어요. 하지만 그건 여러분의 코드를 더 완벽하게 만들어주려는 **친절한 조언**이라고 생각하세요!
| 47. 슬라이스 타입: 부분 참조하기 (0) | 2026.09.23 |
|---|---|
| 46. 데이터 경합 방지 원리 (0) | 2026.09.23 |
| 44. 참조와 대여: 빌려 쓰기 (0) | 2026.09.14 |
| 43. 소유권 넘겨주기와 돌려받기 (0) | 2026.09.14 |
| 42. 복사(Copy)와 클론(Clone) (0) | 2026.09.14 |