본문 바로가기
개발/러스트 (Rust)

Rust 기본, 참조 (Borrow)

by 레조 2024. 7. 9.

https://rustacean.net/

 

Rust 기본 : 참조 (Borrow)

 

Borrow는, 참조를 생성하는 것입니다.
 - 참조는 규칙이나 제한이 있는 포인터입니다.
 - 참조는 소유권을 가지지 않습니다.

"borrow"는 참조를 생성하고 그 참조를 통해 데이터를 안전하게 사용할 수 있도록 하는 Rust의 규칙과 메커니즘을 포함하는 더 포괄적인 용어로 이해할 수 있습니다. 그래서 단순히 "reference"라고 하는 것과는 조금 다른 측면이 있습니다.

 

Borrow를 참조로 읽으면 혼동이 덜하다.

특히 C++ 사용자의 경우, Borrow는 참조(reference)에 약간의 규칙이 있다고 생각하면 쉽다.


참조(Borrow) 사용하는 이유?
 - 성능을 위해서.
 - 소유권이 필요하지 않거나 원하지 않을 때.

 

참조(Borrow) 규칙.

 1. 어느 시점에서든 하나의 가변 참조 또는 여러 개의 불변 참조를 가질 수 있습니다.
 2. 참조는 항상 유효해야 합니다.


이 규칙이 해결하는 문제.
 - 규칙1은 데이터 경쟁을(동시 접근) 방지.
 - 규칙2는 유효하지 않은 메모리 참조 방지.

 

불변 참조 (Immutable Reference)

// 불변 참조 (Immutable Reference)
fn main() {    
    let mut str1 = String::from("modifiable");
    let str2 = String::from("fixed string");
    let mut str_ptr: &String; // 불변 String 타입에 대한 가변 참조.
    
    str_ptr = &str1;
    println!("ptr currently points to {str_ptr}");
    
    str_ptr = &str2;
    println!("ptr currently points to {str_ptr}");
    
    str1.push_str(" string");
    str_ptr = &str1;
    println!("ptr currently points to {str_ptr}");
}

 

가변 참조 (Mutable Reference)

// 가변 참조 (Mutable Reference)
fn main() {
    let mut str1 = String::from("Rust");
    let mut str2 = String::from("Golang");
    
    let ref1 = &mut str1; // 가변 String 타입에 대한 불변 참조.
    let mut ref2 = &mut str2; // 가변 String 타입에 대한 가변 참조.
    println!("First string: {ref1}");
    println!("Second string: {ref2}");
    
    ref1.push('🦀');
    ref2.push('🦫');
    println!("Modified first string: {ref1}");
    println!("Modified second string: {ref2}");
    
    // 규칙1: 하나의 가변 참조만 가질 수 있다.
    // (only one mutable reference allowed at a time, ref1 is no longer valid.)
    ref2 = &mut str1;
    // println!("ref1 is no longer valid: {ref1}");
}