참고한 자료 - Rust Programming Language : 참조와 대여
참조
- 참조자 : 다른 어떤 변수가 소유한 데이터를 접근 가능, 데이터를 가리키는 포인터(pointer)와 같음
- Rust에서는 값의 소유권을 넘기는 대신 개체의 참조자를 전달할 수 있습니다.
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()
}
- 앰퍼센트(&) 기호는 참조자를 나타냅니다. 위코드에서
s
는 s1
의 포인터를 가리키는 포인터입니다. s1
의 포인터는 "hello" 문자열이 저장된 배열의 첫 번째 index를 가리킵니다.
- 참조자를 만드는 행위를 대여(borrow)라고 합니다. 참조자로 빌린 값은 수정할 수 없습니다. 빌릴 뿐이지 소유하지는 않기 때문입니다.
- 가변 참조자(mutable reference) : 가변 참조자를 사용하면 참조자로 빌린 값을 변경할 수 있습니다.
- 가변 참조사 사용 시 유의사항
- 하나의 값은 하나의 가변 참조자만을 허락합니다. 동시에 두 개 이상의 가변 참조자가 값을 빌릴 수 없습니다.
- 어떤 값에 불변 참조자가 이미 존재하는 경우에도 그 값에 대한 가변 참조자는 생성될 수 없습니다.
fn main() {
let mut s = String::from("hello");
change(&mut s);
}
fn change(some_string: &mut String) {
some_string.push_str(", world");
}
- 댕글링 포인터(dangling pointer) : 어떤메모리를 가리키는 포인터가 남아있는 상황에서 일부 메모리를 해제할 경우, 다른 개체가 할당받았을지도 모르는 데이터를 참조하게 된 포인터를의미합니다. Rust에서는 어떤 데이터가 참조자보다 먼저 스코프를 벗어나는 경우를 컴파일러가 확인하여 댕글링 참조가 발생하지 않도록 보장합니다.