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

공유 참조

참조는 값에 대한 책임을 지지 않고 다른 값에 액세스하는 방법을 제공하며 ’빌림’이라고도 합니다. 공유 참조는 읽기 전용이며 참조된 데이터는 변경할 수 없습니다.

fn main() {
    let a = 'A';
    let b = 'B';
    let mut r: &char = &a;
    println!("r: {}", *r);
    r = &b;
    println!("r: {}", *r);
}

T 타입에 대한 공유 참조는 &T 타입을 갖습니다. 참조 값은 & 연산자로 작성됩니다. * 연산자는 참조를 ’역참조’하여 값을 산출합니다.

러스트는 허상(dangling) 참조를 컴파일러 단계에서 찾아내고 금지합니다:

fn x_axis(x: i32) -> &(i32, i32) {
    let point = (x, 0);
    return &point;
}
This slide should take about 10 minutes.
  • 참조는 참조되는 값을 ’빌린다’고 하며, 이는 포인터에 익숙하지 않은 학생들에게 좋은 모델입니다. 코드에서는 참조를 사용하여 값에 액세스할 수 있지만 여전히 원래 변수가 값을 ’소유’합니다. 소유권에 관한 자세한 내용은 3일 차에 다룹니다.

  • 참조는 포인터로 구현되며 주요 이점은 가리키는 대상보다 훨씬 작을 수 있다는 것입니다. C 또는 C++에 익숙한 학생은 참조를 포인터로 인식합니다. 과정의 후반부에서는 Rust가 원시 포인터 사용에서 비롯되는 메모리 안전 버그를 방지하는 방법을 다룹니다.

  • Rust는 참조를 자동으로 생성하지 않습니다. &가 항상 필요합니다.

  • Rust will auto-dereference in some cases, in particular when invoking methods (try r.is_ascii()). There is no need for an -> operator like in C++.

  • 이 예에서 r은 변경 가능하므로 다시 할당할 수 있습니다(r = &b). 이렇게 하면 r이 다시 바인딩되어 다른 것을 참조합니다. 이는 참조에 할당하면 참조된 값이 변경되는 C++와는 다릅니다.

  • 공유 참조에서는 참조 값이 변경 가능하더라도 이를 수정할 수 없습니다. *r = 'X'를 입력해 보세요.

  • Rust는 모든 참조의 전체 기간을 추적하여 충분히 오래 지속되는지 확인합니다. 안전한 Rust에서는 댕글링 참조가 발생할 수 없습니다. x_axispoint에 대한 참조를 반환하지만 point는 함수가 반환되면 할당이 해제되므로 컴파일되지 않습니다.

  • 소유권에 대한 주제를 다룰 때 이 빌림에 대해 더 자세히 이야기 하겠습니다.