소유권 규칙은 let 에서 멈추지 않아. 함수에 값을 넘기는 것도 할당이랑 똑같이 move 해 — 그리고 그건 borrowing 으로 고치기 전에 똑똑히 봐둘 가치가 있는 결과를 낳아.
넘기면 move (또는 복사)
String 으로 takes(s) 를 호출하면 소유권이 함수 안으로 move 해. 호출 후엔 호출자가 더는 s 를 소유 안 하고 못 써. 인자가 i32 같은 Copy 타입이면 대신 복사돼서 호출자가 값을 유지해 — 할당이랑 같은 규칙이야.
반환이 소유권을 돌려줘
함수는 반환값으로 소유권을 돌려줄 수 있어. 그래서 전형적인 (투박한) 패턴은: 값을 받고, 쓰고, 호출자가 다시 갖게 반환하는 거야. 되긴 하지만 함수마다 소유권을 손으로 넣고 빼는 건 지쳐 — 읽기만 하고 싶었던 값을 유지하려고 튜플을 반환하는 걸 상상해봐.
이 레슨은 borrowing 을 위한 빌드업이야. 값을 함수에 move 했다가 유지하려고 반환하는 게 너무 지겨워서 Rust 는 더 나은 도구를 줘: 참조. 다음 트랙이 보상이야 — 근데 수정을 음미하려면 먼저 고통을 느껴봐야 해.
drop 과의 연결
함수가 소유권을 가져가고 값을 반환 안 하면, 함수가 끝날 때 값이 drop 돼 — 힙 메모리가 거기서 바로 해제돼. 소유권과 lifetime 은 두 각도에서 들려주는 같은 이야기야: 누가 소유하느냐가 누가, 언제 해제하느냐를 정해.