[Rust/러스트] 참조자(References)와 빌림(Borrowing)

2022. 2. 17. 15:20Programming Language/Rust

반응형

■ 참조자와 빌림

참조자와 빌림은 해당 스코프에서 다른 로직으로 소유권을 넘기지 않고 참조자를 넘김으로써 소유권을 유지하고자 할 때 사용합니다.

 

여기에서 소유권이 생소하게 느껴질 수 있습니다. 러스트는 다른 프로그래밍 언어들과 비교하면 소유권이라는 특징으로 보다 효율적으로 메모리 관리가 가능합니다. 이러한 특징은 프로그래머의 메모리 관리를 통해 프로그램을 보다 효율적으로 관리 가능하게 합니다.

 

* 소유권에 대한 자세한 내용은 링크를 참고해 주세요. 


◆ 소유권의 이동 경로 확인

변수 s 의 소유권 이동경로는 아래와 같습니다.

  • main 함수
  • take_ownership 함수
  • take_ownership 함수 로직이 종료되면서 s의 메모리도 해제

s의 소유권 이동 경로에서 알 수 있듯이 println!("main fn : {}", s) 에서는 s의 소유권이 main 함수 스코프에 없기 때문에 borrow of moved value: `s` 에러가 발생합니다.

fn take_ownership(s : String){
    println!("take_ownership fn : {}", s);
}// 스코프 밖으로 벗어나면서 s의 메모리는 해제된다.

fn main(){
    let s = String::from("Owner Check");

    // s 에 소유권를 take_ownership 함수 스코프로 이동시킴
    take_ownership(s);

    // 에러 발생
    println!("main fn : {}", s);
}

◆ 참조자와 빌림으로 소유권 유지

s 변수의 소유권을 main 스코프에서 유지하면서 println!("main fn : {}", s) 를 정상적으로 실행 시킬 수 있는 방법은 참조자(&)를 활용하여 기존 스코프에서 소유권을 유지하는 것입니다.

fn take_ownership(s : &String){
    println!("take_ownership fn : {}", s);
}

fn main(){
    let s = String::from("Owner Check");

    // s 의 참조자를 take_ownership에 매개변수로 넘김
    take_ownership(&s);

    // s 의 소유권 유지
    println!("main fn : {}", s);
}

▶ 출력 결과

take_ownership fn : Owner Check
main fn : Owner Check
반응형