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

별칭

데이터는 횟수에 제한 없이 불변으로 빌려질 수 있지만, 불변으로 빌려진 동안에는 원본 데이터를 가변으로 빌릴 수 없습니다. 반면에, 가변 빌림은 한 번에 _하나_만 허용됩니다. 원본 데이터는 가변 참조가 마지막으로 사용된 _후_에만 다시 빌려질 수 있습니다.

struct Point { x: i32, y: i32, z: i32 }

fn main() {
    let mut point = Point { x: 0, y: 0, z: 0 };

    let borrowed_point = &point;
    let another_borrow = &point;

    // 데이터는 참조와 원본 소유자를 통해 접근할 수 있습니다
    println!("점의 좌표: ({}, {}, {})",
                borrowed_point.x, another_borrow.y, point.z);

    // 에러! 현재 불변으로 빌려진 상태이기 때문에 `point`를 가변으로 빌릴 수 없습니다.
// let mutable_borrow = &mut point;
// TODO ^ 이 줄의 주석을 해제해 보세요

    // 빌려온 값들이 여기서 다시 사용됩니다
    println!("점의 좌표: ({}, {}, {})",
                borrowed_point.x, another_borrow.y, point.z);

    // 불변 참조들이 코드의 나머지 부분에서 더 이상 사용되지 않으므로
// 가변 참조로 다시 빌리는 것이 가능합니다.
    let mutable_borrow = &mut point;

    // 가변 참조를 통해 데이터를 변경합니다
    mutable_borrow.x = 5;
    mutable_borrow.y = 2;
    mutable_borrow.z = 1;

    // 에러! 현재 가변으로 빌려진 상태이기 때문에 `point`를 불변으로 빌릴 수 없습니다.
// let y = &point.y;
// TODO ^ 이 줄의 주석을 해제해 보세요

    // 에러! `println!`은 불변 참조를 받기 때문에 출력할 수 없습니다.
// println!("점의 Z 좌표는 {}입니다", point.z);
// TODO ^ 이 줄의 주석을 해제해 보세요

    // 좋습니다! 가변 참조는 불변 참조로 `println!`에 전달될 수 있습니다
    println!("점의 좌표: ({}, {}, {})",
                mutable_borrow.x, mutable_borrow.y, mutable_borrow.z);

    // 가변 참조가 코드의 나머지 부분에서 더 이상 사용되지 않으므로
// 다시 빌리는 것이 가능합니다
    let new_borrowed_point = &point;
    println!("점은 이제 다음 좌표를 가집니다: ({}, {}, {})",
             new_borrowed_point.x, new_borrowed_point.y, new_borrowed_point.z);
}