참조자 (reference):
해당 주소에 저장된 데이터에 접근할 수 있도록 해주는 주솟값에 해당하는, 포인터와 같은 것.
그 데이터는 다른 어떤 변수가 소유하고 있죠. 포인터와는 달리, 참조자는 살아있는 동안 특정 타입에 대한 유효한 값을 가리킴을 보장.
Ex) 참조자를 매개변수로 받도록 구현
fn main() {
let s1 = String::from("hello");
let len = calculate_length(&s1);
println!("The length of '{}' is {}.", s1, len);
}
fn calculate_length(s: &String) -> usize {
s.len()
}
calculate_length 함수에 s1 대신 &s1을 전달하고, 함수 정의에 String 대신 &String을 사용. 이 앰퍼센드 (&) 기호가 참조자를 나타내고, 어떤 값의 소유권을 가져오지 않고 해당 값을 참조할 수 있도록 함.
(&를 이용한 참조의 반대는 역참조 (dereferencing). 역참조 기호는 *)
참조로 받은 값을 수정하려고 하면 에러가 뜬다. 이럴 경우 가변 참조자를 사용하면 가능하다.
단, 어떤 값에 대한 가변 참조자가 있다면, 그 값에 대한 참조자는 더 이상 만들 수 없다. 아래의 코드는 s에 대한 두 개의 가변 참조자 생성을 시도하는 코드로, 작동하지 않는다:
let mut s = String::from("hello");
let r1 = &mut s;
let r2 = &mut s;
println!("{}, {}", r1, r2);
(=> 단 하나의 가변 참조자만 갖거나, 여러 개의 불변 참조자를 가질 수 있다.)