지금까지 러스트의 가장 큰 특징인 **'소유권(Ownership)'**에 대해 배우느라 고생 많으셨어요. 소유권은 처음 접하면 조금 낯설 수 있지만, 한 번 이해하면 메모리 사고가 없는 튼튼한 프로그램을 만들 수 있게 해주는 마법 같은 도구랍니다.
오늘은 그동안 배운 내용을 가볍게 복습하고, 퀴즈를 통해 여러분의 실력을 확인해 보는 시간을 가질게요. 준비되셨나요?
---
러스트의 소유권은 **'세상에 딱 하나뿐인 황금 열쇠'**와 같아요.
1. **주인은 오직 한 명:** 열쇠(데이터)를 가진 사람(변수)은 한 번에 딱 한 명뿐이에요.
2. **열쇠 넘겨주기(Move):** 제가 여러분에게 이 열쇠를 주면, 이제 저에게는 열쇠가 없어요. 여러분이 새 주인이 되는 거죠. (이것을 **이동**이라고 해요!)
3. **방을 나가면 파기(Drop):** 열쇠 주인이 방(코드 범위)을 나가면, 열쇠는 자동으로 사라져요. 아무도 열쇠를 잃어버릴 걱정을 안 해도 되죠!
4. **빌려주기(Borrowing):** 열쇠를 완전히 주는 게 아니라, 잠깐 구경만 시켜주거나(`&`), 잠깐 사용만 하게(`&mut`) 할 수도 있어요.
---
다음 코드들을 보고, 프로그램이 잘 작동할지 아니면 에러가 날지 맞춰보세요!
이 코드는 정상적으로 실행될까요?
fn main() {
let s1 = String::from("Hello"); // s1이 "Hello"의 주인이 됩니다.
let s2 = s1; // s1이 가진 소유권을 s2에게 넘겨줍니다(Move).
println!("{}", s1); // s1을 출력하려고 시도합니다.
}
**정답:** ❌ **에러 발생!**
**이유:** `s1`이 가지고 있던 소유권을 `s2`에게 줘버렸기 때문에, 이제 `s1`은 빈손이에요. 빈손인 `s1`을 사용하려고 하면 러스트 컴파일러가 "주인이 아니에요!"라고 친절하게 알려준답니다.
---
이 코드는 정상적으로 실행될까요?
fn main() {
let s1 = String::from("Rust"); // s1이 주인입니다.
show_message(&s1); // &를 붙여서 s1을 잠깐 빌려줍니다(참조).
println!("다시 확인: {}", s1); // s1을 다시 출력합니다.
}
fn show_message(msg: &String) { // &String은 빌려온 데이터라는 뜻입니다.
println!("메시지: {}", msg); // 빌려온 내용을 출력합니다.
}
**정답:** ✅ **정상 작동!**
**이유:** `&` 기호를 사용해서 **빌려주기(Borrowing)**를 했기 때문이에요. 소유권은 여전히 `s1`에게 있어서, 함수가 끝나도 `s1`은 사라지지 않고 그대로 사용할 수 있어요.
---
이 코드는 정상적으로 실행될까요?
fn main() {
let x = 5; // x에 5를 저장합니다.
let y = x; // x의 값을 y에 복사합니다.
println!("x: {}, y: {}", x, y); // x와 y를 모두 출력합니다.
}
**정답:** ✅ **정상 작동!**
**이유:** 정수(Integer)처럼 크기가 아주 작고 단순한 데이터는 소유권이 이동하지 않고 똑같은 내용이 **복사(Copy)**돼요. 그래서 `x`와 `y` 둘 다 각자의 값을 가지고 행복하게 살 수 있답니다!
---
| 51. 구조체란 무엇인가? (0) | 2026.10.01 |
|---|---|
| 50. 따라하며 배우기: 단어 개수 세기 (0) | 2026.09.28 |
| 48. 문자열 슬라이스 활용 (0) | 2026.09.28 |
| 47. 슬라이스 타입: 부분 참조하기 (0) | 2026.09.23 |
| 46. 데이터 경합 방지 원리 (0) | 2026.09.23 |