함수 호출에서의 이동(Move)

값을 함수에 전달할때, 그 값은 매개변수에 할당됩니다. 이때 소유권의 이동이 일어납니다:

fn say_hello(name: String) {
    println!("Hello {name}")
}

fn main() {
    let name = String::from("Alice");
    say_hello(name);
    // say_hello(name);
}
  • say_hello함수의 첫번째 호출시 main함수는 자신이 가진 name에 대한 소유권을 포기하므로, 이후 main함수에서는 name을 사용할 수 없습니다.
  • name에 할당되있는 힙 메모리는 say_hello함수의 끝에서 해제됩니다.
  • main함수에서 name을 참조로 전달(빌림)하고(&name), say_hello에서 매개변수를 참조형으로 수정한다면 main함수는 name의 소유권을 유지할 수 있습니다.
  • 또는 첫번째 호출 시 main함수에서 name을 복제하여 전달할 수도 있습니다.(name.clone())
  • 러스트는 이동을 기본으로 하고 복제를 명시적으로 선언하도록 만듬으로, 의도치 않게 복사본을 만드는 것이 C++에서보다 어렵습니다.