공유 참조
참조는 값에 대한 책임을 지지 않고 다른 값에 액세스하는 방법을 제공하며 '빌림'이라고도 합니다. 공유 참조는 읽기 전용이며 참조된 데이터는 변경할 수 없습니다.
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; }
-
참조는 참조되는 값을 '빌린다'고 하며, 이는 포인터에 익숙하지 않은 학생들에게 좋은 모델입니다. 코드에서는 참조를 사용하여 값에 액세스할 수 있지만 여전히 원래 변수가 값을 '소유'합니다. 소유권에 관한 자세한 내용은 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_axis
는point
에 대한 참조를 반환하지만point
는 함수가 반환되면 할당이 해제되므로 컴파일되지 않습니다. -
소유권에 대한 주제를 다룰 때 이 빌림에 대해 더 자세히 이야기 하겠습니다.