안녕하세요! 지난 시간에 배웠던 '소유권' 개념, 조금 어렵지는 않으셨나요? "물건을 한 사람만 가질 수 있다"는 규칙은 안전하지만, 매번 물건을 완전히 넘겨줘야 한다면 코딩하기가 참 번거로울 거예요.
그래서 러스트에는 아주 유용한 **'대여(Borrowing)'**라는 기능이 있습니다. 이번 시간에는 물건을 아주 잠깐 빌려 쓰는 법에 대해 쉽고 친절하게 알아볼게요!
---
우리가 친구에게 책을 빌려준다고 생각해보세요. 친구가 책을 다 읽고 나면 다시 나에게 돌려주죠? 이때 책의 주인은 여전히 **나**입니다.
러스트에서도 마찬가지예요. 어떤 값의 **소유권(물건을 가질 권리)**은 그대로 둔 채, **참조(Reference, 그 물건이 어디 있는지 가리키는 것)**만 전달해서 잠시 빌려줄 수 있습니다.
이것을 러스트에서는 **대여(Borrowing)**라고 부릅니다.
---
빌려줄 때는 아주 간단한 기호 하나만 기억하면 됩니다. 바로 **`&` (앰퍼샌드)** 기호예요. 이 기호를 붙이면 "이건 내 건데, 잠시 빌려줄게!"라는 뜻이 됩니다.
fn main() {
let s1 = String::from("안녕"); // s1이 "안녕"의 주인이 됩니다.
// &s1이라고 적어서 소유권이 아닌 '빌려주는 권한'만 넘깁니다.
let len = calculate_length(&s1);
// 빌려준 것이기 때문에 s1은 여전히 여기서 사용할 수 있어요!
println!("'{}'의 길이는 {}입니다.", s1, len);
}
// &String은 "실제 데이터는 안 가져오고 빌려만 올게"라는 뜻입니다.
fn calculate_length(s: &String) -> usize {
s.len() // 빌려온 책의 페이지 수를 확인하듯 길이를 잽니다.
}
---
책을 빌려줄 때도 두 가지 상황이 있죠? "읽기만 해!"라고 빌려줄 때와 "필요하면 내용도 수정해!"라고 빌려줄 때입니다.
기본적으로 빌려준 물건은 마음대로 고칠 수 없습니다. 여러 명에게 동시에 빌려줘도 괜찮아요. 다들 읽기만 할 테니까요! * **용어:** **불변 참조(Immutable Reference, 내용을 바꿀 수 없게 빌려주는 것)**
만약 빌려 간 사람이 내용을 수정해야 한다면 `&mut` (앰퍼샌드 뮤트)라고 써야 합니다. * **용어:** **가변 참조(Mutable Reference, 내용을 바꿀 수 있게 빌려주는 것)**
fn main() {
let mut s = String::from("안녕"); // 수정을 위해 mut를 붙여 선언합니다.
change(&mut s); // &mut를 써서 '수정 권한'까지 함께 빌려줍니다.
println!("{}", s); // "안녕하세요"가 출력됩니다!
}
fn change(some_string: &mut String) { // 수정 가능한 상태로 빌려왔습니다.
some_string.push_str(", 하세요"); // 빌려온 글자 뒤에 내용을 추가합니다.
}
---
러스트는 아주 꼼꼼한 사서 선생님 같아요. 안전을 위해 딱 한 가지 규칙을 지키라고 합니다.
> **"누군가 책에 글을 쓰고 있다면(가변 참조), 다른 사람은 그 책을 읽거나 쓸 수 없다!"**
* **이유:** 여러 사람이 동시에 한 책에 글을 쓰거나, 누군가 글을 지우고 있는데 다른 사람이 읽으려고 하면 사고가 날 수 있기 때문이에요. (이를 **데이터 경합**이라고 부릅니다.)
그래서 러스트에서는 **수정할 수 있게 빌려주는 것(`&mut`)은 한 번에 딱 한 명에게만** 허용합니다.
---
오늘 우리는 소유권을 넘기지 않고도 값을 사용할 수 있는 **'참조와 대여'**를 배웠습니다.
1. `&`를 붙이면 **대여(빌려주기)**가 된다.
2. 그냥 빌려주면 **읽기**만 가능하고, `&mut`로 빌려주면 **수정**도 가능하다.
3. 수정할 수 있게 빌려주는 건 **한 번에 한 명**만 가능하다!
처음에는 이 규칙이 조금 까다롭게 느껴질 수 있지만, 이 규칙 덕분에 여러분의 프로그램은 절대 멈추거나 꼬이지 않는 아주 튼튼한 프로그램이 될 거예요.
| 46. 데이터 경합 방지 원리 (0) | 2026.09.23 |
|---|---|
| 45. 가변 참조의 규칙 (0) | 2026.09.23 |
| 43. 소유권 넘겨주기와 돌려받기 (0) | 2026.09.14 |
| 42. 복사(Copy)와 클론(Clone) (0) | 2026.09.14 |
| 41. 이동(Move) 현상 이해하기 (0) | 2026.09.08 |