Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

빌림

대부분의 경우, 우리는 데이터의 소유권을 가져오지 않고 데이터에 접근하고 싶어 합니다. 이를 달성하기 위해 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);
}