공유 참조

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

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는 함수가 반환되면 할당이 해제되므로 컴파일되지 않습니다.

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