모든 새내기의 멘탈 모델을 깨는 줄이 여기 있어 — 그리고 이게 click 하는 순간, Rust 가 click 해.
할당이 move 할 수 있어
대부분 언어에서 let s2 = s1; 은 값을 복사하거나 두 이름이 같은 객체를 가리키게 해. Rust 는 힙 타입에 대해 둘 다 안 해. move 해: 힙 버퍼의 소유권이 s1 에서 s2 로 이전되고 s1 은 무효가 돼. 그 뒤에 s1 을 건드리면 그 유명한 error[E0382]: borrow of moved value 가 떠.
왜 복사 말고 move?
s1 과 s2 가 같은 힙 버퍼를 가리키고 둘 다 스코프 끝에 해제하려 들면 double free 가 나 — 전형적인 C 크래시. Rust 는 구조적으로 막아: move 후엔 s2 만 버퍼를 소유하니까 s2 만 해제해. 두 owner 가 한 할당을 두고 싸우는 시나리오 자체가 없어.
스택 타입은 move 안 해 — 복사해
x 가 i32 일 때 let y = x; 는 값을 복사해, 스택 스칼라 복사는 사소하고 안전하니까 — 그래서 x 는 유효하게 남아. 차이는 임의가 아니야: 복제가 싸고 안전한 타입은 복사하고; 힙 자원을 소유하는 타입은 move 해. 다음 레슨이 그 분리를 명시해.
E0382 'use of moved value' 는 통과의례야. 다들 부딪혀. 컴파일러가 까다로운 게 아니라 — 네가 더는 소유하지 않은 걸 쓰려 한 정확한 순간을 잡는 거야. '두 줄 위에서 이거 넘겨줬잖아' 로 읽어.
진짜 복사본 두 개가 필요하면
.clone() 으로 opt-in 해 — 힙 데이터의 명시적이고 눈에 보이는 깊은 복사. Rust 는 비싼 짓을 절대 조용히 안 해; 깊은 복사가 일어났다면 네가 clone 이라는 단어를 쓴 거야.