빌림
대부분의 경우, 우리는 데이터의 소유권을 가져오지 않고 데이터에 접근하고 싶어 합니다. 이를 달성하기 위해 Rust는 빌림(borrowing) 메커니즘을 사용합니다. 객체를 값(T)으로 전달하는 대신, 참조(&T)로 전달할 수 있습니다.
컴파일러는 (빌림 검사기를 통해) 참조가 항상 유효한 객체를 가리킨다는 것을 정적으로 보장합니다. 즉, 객체에 대한 참조가 존재하는 동안에는 해당 객체를 파괴할 수 없습니다.
// 이 함수는 상자의 소유권을 가져와 파괴합니다
fn eat_box_i32(boxed_i32: Box<i32>) {
println!("{}를 포함하는 상자를 파괴 중", boxed_i32);
}
// 이 함수는 i32를 빌립니다
fn borrow_i32(borrowed_i32: &i32) {
println!("이 정수는: {}", borrowed_i32);
}
fn main() {
// 힙에 boxed i32를 생성하고, 스택에 i32를 생성합니다
// 기억하세요: 숫자는 가독성을 위해 임의의 밑줄을 추가할 수 있습니다
// 5_i32는 5i32와 동일합니다
let boxed_i32 = Box::new(5_i32);
let stacked_i32 = 6_i32;
// 상자의 내용물을 빌립니다. 소유권을 가져가지 않으므로,
// 내용물을 다시 빌릴 수 있습니다.
borrow_i32(&boxed_i32);
borrow_i32(&stacked_i32);
{
// 상자 안에 포함된 데이터에 대한 참조를 가져옵니다
let _ref_to_i32: &i32 = &boxed_i32;
// 에러!
// 내부 값이 스코프의 나중 부분에서 빌려지고 있는 동안에는 `boxed_i32`를 파괴할 수 없습니다.
eat_box_i32(boxed_i32);
// FIXME ^ 이 줄을 주석 처리하세요
// 내부 값이 파괴된 후에 `_ref_to_i32`를 빌리려고 시도합니다
borrow_i32(_ref_to_i32);
// `_ref_to_i32`가 스코프를 벗어나며 더 이상 빌려지지 않습니다.
}
// `boxed_i32`는 이제 `eat_box_i32`에게 소유권을 넘기고 파괴될 수 있습니다
eat_box_i32(boxed_i32);
}