[Rust] 참조와 소유권 개념
러스트도 C처럼 포인터가 존재한다.
그냥 레퍼런스라고 불리기도 하는데,
let value = 10;
let ptr = &value;
이런식으로 참조가 가능하다.

하지만 저 경우에는 그냥 상수 참조라서 value를 통해서든, ptr를 통해서든 변경이 불가능하다.
변경 가능한 포인터를 사용하고자 한다면
&mut로 참조를 해야한다.
이렇게

rust는 C와 달리 여러모로 엄격해서 상수를 변경가능한 포인터로 참조해서 값을 바꾸는 등의 행위가 문법적으로 금지되어 있다.
그러므로 다음과 같은 참조관계만 존재할 수 있다.
변수 <- 상수참조 ㅇ
변수 <- 변수참조 ㅇ
상수 <- 상수참조 ㅇ
상수 <- 변수참조 (불가능)
다시 이어서 보자.
위의 코드에서, ptr이 &mut 참조를 받고 나서 value를 사용하려 들면

이렇게 에러가 발생한다.
ptr이 value에게서 소유권을 빌려갔기(borrow) 때문이다.
이런 경우에는 이렇게 스코프로 제약을 걸어주면 된다.

우리가 바라던 출력이 이루어진다.
Rust에서 한 값에 대한 '변경 가능한 참조'(&mut)는 동시에 하나만 존재할 수가 있다.
변경 불가능한 참조는 상관없고.
이 소유권 시스템은 얼핏보면 불편하기만 한 구조 같지만 오히려 더 큰 편의성을 제공한다.
자원이 하나의 소유자에 의해서만 관리가 되는 대신, 그 소유자가 사라질 때(스코트를 벗어날 때) 자동으로 해제가 된다.
기본으로 가비지컬렉터의 효과를 누릴 수가 있다는 말이다. 게다가 성능의 손해도 거의 없다.
C++에서 unique_ptr과 move semantic을 이용해서 자원을 관리하는 것과 꽤 흡사하다 할 수도 있다.
그리고 기본적으로 Rust는 값들을 스택에 지역적으로 할당한다.
힙에 동적으로 할당하고자 한다면 Box를 쓰면 된다.

저기서 mut가 없으면 변경이 불가한 상수가 되고,
Box로 생성된 값은 포인터와 같다.
위 코드에서는 동적 할당을 했지만 소유자인 ptr가 해당 스코프를 벗어나면 자동으로 소멸되므로, 명시적인 해제가 필요하지 않다.
이상