[Rust] 참조와 소유권 개념

러스트도 C처럼 포인터가 존재한다.
그냥 레퍼런스라고 불리기도 하는데,

let value = 10;
let ptr = &value;

이런식으로 참조가 가능하다. image

image 하지만 저 경우에는 그냥 상수 참조라서 value를 통해서든, ptr를 통해서든 변경이 불가능하다.


변경 가능한 포인터를 사용하고자 한다면
&mut로 참조를 해야한다.
이렇게 image

image rust는 C와 달리 여러모로 엄격해서 상수를 변경가능한 포인터로 참조해서 값을 바꾸는 등의 행위가 문법적으로 금지되어 있다.
그러므로 다음과 같은 참조관계만 존재할 수 있다.
변수 <- 상수참조 ㅇ
변수 <- 변수참조 ㅇ
상수 <- 상수참조 ㅇ
상수 <- 변수참조 (불가능)


다시 이어서 보자.
위의 코드에서, ptr이 &mut 참조를 받고 나서 value를 사용하려 들면 image

image 이렇게 에러가 발생한다.

ptr이 value에게서 소유권을 빌려갔기(borrow) 때문이다.

이런 경우에는 이렇게 스코프로 제약을 걸어주면 된다. image

image 우리가 바라던 출력이 이루어진다.

Rust에서 한 값에 대한 '변경 가능한 참조'(&mut)는 동시에 하나만 존재할 수가 있다.

변경 불가능한 참조는 상관없고.


이 소유권 시스템은 얼핏보면 불편하기만 한 구조 같지만 오히려 더 큰 편의성을 제공한다.
자원이 하나의 소유자에 의해서만 관리가 되는 대신, 그 소유자가 사라질 때(스코트를 벗어날 때) 자동으로 해제가 된다.

기본으로 가비지컬렉터의 효과를 누릴 수가 있다는 말이다. 게다가 성능의 손해도 거의 없다.

C++에서 unique_ptr과 move semantic을 이용해서 자원을 관리하는 것과 꽤 흡사하다 할 수도 있다.


그리고 기본적으로 Rust는 값들을 스택에 지역적으로 할당한다.
힙에 동적으로 할당하고자 한다면 Box를 쓰면 된다. image

image 저기서 mut가 없으면 변경이 불가한 상수가 되고,
Box로 생성된 값은 포인터와 같다.

위 코드에서는 동적 할당을 했지만 소유자인 ptr가 해당 스코프를 벗어나면 자동으로 소멸되므로, 명시적인 해제가 필요하지 않다.


이상