안녕하세요! 러스트(Rust)라는 멋진 언어의 세계에 오신 것을 환영합니다. 지금까지 잘 따라오고 계시네요!
오늘은 러스트에서 가장 독특하면서도 중요한 개념인 **'이동(Move)'**에 대해 함께 알아볼 거예요.
처음에는 조금 낯설 수 있지만, 저와 함께 비유를 통해 천천히 살펴보면 금방 이해하실 수 있을 거예요. 자, 시작해 볼까요?
---
보통 다른 프로그래밍 언어에서는 데이터를 다른 변수에 넣으면 똑같은 것이 하나 더 생기는 '복사'가 일어나곤 해요. 하지만 러스트는 조금 달라요.
여러분이 아주 귀하고 세상에 단 하나뿐인 **'마법의 책'**을 가지고 있다고 상상해 보세요.
* **복사(Copy):** 친구가 그 책이 탐나서 똑같은 책을 한 권 더 인쇄해서 가져가는 거예요. 이제 책은 두 권이 되죠.
* **이동(Move):** 여러분이 가진 **그 책 자체를 친구에게 건네주는 거예요.
** 이제 친구는 책을 가졌지만, **여러분은 더 이상 책을 가지고 있지 않게 되죠.**
러스트에서 데이터가 움직이는 방식은 바로 이 **'이동(Move)'** 방식이랍니다!
---
왜 번거롭게 복사를 안 하고 주인을 바꿀까요? 그 이유는 바로 **안전(Safety)** 때문이에요.
컴퓨터에는 데이터를 저장하는 **메모리(Memory, 정보를 기억하는 공간)**라는 곳이 있어요. 만약 주인(변수)이 여러 명이면, 서로 데이터를 마음대로 바꾸려다가 사고가 날 수 있거든요. 러스트는 **"데이터의 주인(소유권, Ownership)은 언제나 딱 한 명이어야 해!"**라는 규칙을 세워서 사고를 미리 방지한답니다.
---
아주 간단한 코드로 이 '이동' 현상을 확인해 볼게요.
fn main() {
// 1. 's1'이라는 이름의 바구니에 "안녕"이라는 글자를 담았어요.
let s1 = String::from("안녕");
// 2. s1이 가진 글자의 주인 권리(소유권)를 's2'에게 넘겨줬어요. (이동 발생!)
let s2 = s1;
// 3. 이제 s2는 글자를 잘 출력할 수 있어요.
println!("s2가 가진 값: {}", s2); // s2는 이제 당당한 주인이에요!
// 4. 하지만 아래 줄의 주석을 풀면 에러가 나요!
// println!("{}", s1); // 에러! s1은 이미 s2에게 권리를 넘겨줘서 빈털터리가 됐거든요.
}
**설명:**
- `let s2 = s1;`이 실행되는 순간, `s1`은 더 이상 데이터를 관리할 권리가 없어져요.
- 이것을 전문 용어로 **소유권 이전(Ownership Transfer)** 또는 **이동(Move)**이라고 불러요.
---
만약 여러분이 실수로 권리를 넘겨준 `s1`을 다시 사용하려고 하면, 러스트는 친절하게 알려줄 거예요. > "미안하지만 `s1`은 이미 `s2`로 **이동(move)**했어! 그래서 여기서는 쓸 수 없어."
러스트는 프로그램이 실행되기 전에 이런 실수를 미리 잡아주기 때문에, 나중에 큰 버그가 생기는 것을 막아준답니다. 정말 든든한 조력자죠?
---
처음에는 "내 마음대로 안 되네?"라고 느낄 수 있지만, 이 규칙에 익숙해지면 세상에서 가장 튼튼하고 안전한 프로그램을 만드실 수 있을 거예요. 여러분은 지금 아주 중요한 고개를 잘 넘으셨어요!
| 43. 소유권 넘겨주기와 돌려받기 (0) | 2026.09.14 |
|---|---|
| 42. 복사(Copy)와 클론(Clone) (0) | 2026.09.14 |
| 40. 변수 범위와 메모리 해제 (0) | 2026.09.08 |
| 39. Rust의 심장: 소유권이란? (0) | 2026.09.01 |
| 38. 스택과 힙: 메모리 이야기 (0) | 2026.09.01 |