오늘은 프로그래밍을 할 때 우리를 가장 힘들게 하는 문제 중 하나인 **'데이터 경합(Data Race)'**을 Rust가 어떻게 똑똑하게 방지하는지 알아보겠습니다.
어려워 보이지만, 저와 함께 차근차근 살펴보면 금방 이해하실 수 있을 거예요!
---
공용 게시판이 하나 있다고 상상해 보세요. 이 게시판에는 딱 한 문장만 적을 수 있습니다.
* **철수**는 게시판에 "오늘 날씨 맑음"이라고 적으려고 합니다.
* **영희**는 동시에 "내일 비 소식 있음"이라고 적으려고 합니다.
두 사람이 **동시에** 달려들어 글자를 적기 시작하면 어떻게 될까요? 게시판에는 "오내일 날씨 비 맑음 있음"처럼 앞뒤가 맞지 않는 이상한 낙서가 남게 될 거예요.
이렇게 여러 명(스레드)이 동시에 하나의 데이터에 접근해서 값을 바꾸려다가 데이터가 엉망이 되는 현상을 **데이터 경합(Data Race - 여러 작업이 데이터를 차지하려고 다투는 상황)**이라고 합니다.
---
Rust는 아주 엄격하고 친절한 **'도서관 사서'** 같은 역할을 합니다. Rust에는 데이터 경합을 막기 위한 아주 중요한 **'빌려주기 규칙'**이 있어요.
1. **공유 빌리기(Immutable Borrow):** 여러 명이 동시에 책을 **읽는 것**은 괜찮아요. (내용이 변하지 않으니까요!)
2. **독점 빌리기(Mutable Borrow):** 하지만 누군가 책에 내용을 **쓰려고(수정하려고)** 한다면, 그동안은 아무도 그 책을 읽거나 쓸 수 없어요. 오직 그 한 사람만 책을 가질 수 있죠.
이 규칙 덕분에 Rust에서는 "누군가 데이터를 고치는 도중에 다른 사람이 읽거나 고치는 일" 자체가 아예 불가능합니다.
---
Rust가 어떻게 실수를 미리 잡아내는지 아주 간단한 예시로 확인해 봐요.
fn main() {
let mut data = String::from("안녕"); // 수정 가능한 데이터를 만듭니다.
let ref1 = &data; // 첫 번째 사람이 데이터를 빌립니다 (읽기 전용).
let ref2 = &data; // 두 번째 사람도 동시에 빌려서 읽을 수 있습니다.
println!("{} {}", ref1, ref2); // 둘 다 읽는 건 아무 문제 없어요!
// 만약 여기서 누군가 데이터를 고치려고 하면?
// let ref3 = &mut data; // <- 이 줄의 주석을 풀면 Rust가 "안 돼!"라고 에러를 냅니다.
}
* `let mut data`: 'data'라는 이름의 고칠 수 있는 변수(데이터 저장소)를 만듭니다.
* `&data`: 데이터를 읽기 위해 잠시 빌려오는 것입니다. (공유 가능)
* `&mut data`: 데이터를 고치기 위해 빌려오는 것입니다. (독점 필요)
* **Rust의 원칙:** 누군가 읽고 있을 때는 아무도 고칠 수 없고, 누군가 고치고 있을 때는 아무도 읽을 수 없습니다!
---
* **스레드(Thread):** 컴퓨터가 일을 처리하는 최소 단위입니다. 여러 스레드를 쓴다는 건 여러 명이 동시에 일을 한다는 뜻이에요.
* **데이터 경합(Data Race):** 두 개 이상의 스레드가 동시에 같은 메모리(데이터)에 접근하고, 그중 하나라도 데이터를 수정하려고 할 때 발생하는 충돌입니다.
* **소유권(Ownership):** Rust만의 독특한 규칙으로, 데이터의 주인을 명확히 정해서 관리하는 원리입니다.
* **빌림 검사기(Borrow Checker):** 우리가 코드를 짤 때 규칙을 잘 지켰는지 실시간으로 감시하며 데이터 경합을 막아주는 고마운 감시관입니다.
---
처음에는 Rust의 이런 규칙들이 조금 까다롭게 느껴질 수 있어요. "왜 내 마음대로 못 하게 하지?"라는 생각이 들 수도 있죠. 하지만 이건 마치 **"사고가 나기 전에 미리 안전벨트를 매주는 것"**과 같답니다.
| 48. 문자열 슬라이스 활용 (0) | 2026.09.23 |
|---|---|
| 47. 슬라이스 타입: 부분 참조하기 (0) | 2026.09.23 |
| 45. 가변 참조의 규칙 (0) | 2026.09.23 |
| 44. 참조와 대여: 빌려 쓰기 (0) | 2026.09.14 |
| 43. 소유권 넘겨주기와 돌려받기 (0) | 2026.09.14 |