Rust ownership

참조와 대여 판별 지도

값을 넘길지, 읽기만 빌릴지, 잠깐 바꿀지만 나누면 소유권 이동과 대여 규칙을 같은 기준으로 판단할 수 있다.

01

값이 있다

String은 힙 데이터를 소유한다. 그냥 넘기면 기본적으로 소유권 이동을 생각해야 한다.

02

주소를 빌린다

&String은 읽기용 손잡이다. 함수는 값을 떨어뜨릴 권한 없이 내용만 본다.

03

함수가 읽는다

len()처럼 관찰만 하는 작업은 공유 참조로 충분하다. 복사나 이동이 필요 없다.

04

소유자가 남는다

호출이 끝나도 s1은 유효하다. 대여가 끝났으므로 다시 읽거나 출력할 수 있다.

상황
선택
검사 기준
읽기만 한다
&T를 넘긴다.
여러 공유 참조가 동시에 있어도 값은 바뀌지 않는다.
값을 바꾼다
&mut T를 하나만 둔다.
원래 바인딩은 mut이어야 하고 같은 시점에 다른 대여와 섞지 않는다.
소유가 필요하다
값 자체를 이동하거나 새 값을 만든다.
함수 뒤에도 호출자가 써야 하면 이동 대신 대여가 맞다.
지역 참조를 돌려준다
참조 대신 소유한 값을 반환한다.
스코프가 끝난 값의 주소는 댕글링 참조가 되므로 컴파일러가 막는다.
허용

공유 참조 여러 개

읽기만 하는 관찰자는 서로 충돌하지 않는다. 데이터 레이스의 원인이 되지 않는다.

주의

가변 참조 하나

수정 권한은 한 시점에 한 곳으로 제한된다. 이 제한이 안전한 변경을 만든다.

차단

빌린 값이 먼저 사라짐

참조가 가리키는 값보다 오래 살면 안 된다. 수명 검사가 이 경계를 확인한다.