RUST

[RUST] RUST 메모리 관리 규칙 - 임대(lease)

ssh9308 2023. 12. 27. 09:00
반응형

함수의 소유권 이전

 

아래는 함수의 소유권이 이전이 되는 예제이다.

 

String 변수를 선언하고 초기화 한 다음 해당 문자열의 길이를 리턴해주는 함수를 사용한다.

 

여기서 문제가 발생한다.

 

get_string_len() 함수에 String 파라미터를 입력하게 되어 있는데,

 

이때, String 데이터의 소유권이 변수 str에서 get_string_len() 함수로 넘어가게 되면서

 

다시 main 함수에서는 str 변수를 사용할 수 없게 된다.

 

 

 

이럴 경우에는 참조를 사용하면 된다.

 

C / C++를 배워봤던 사람들에게는 친숙한 "&" 표시로 참조변수를 만들 수 있다.

 

 

참조(Reference)

Rust에서 참조(reference)는 중요한 개념 중 하나로, 메모리 안전성을 보장하는 데 핵심적인 역할을 한다.

 

참조를 사용하면 데이터를 직접적으로 소유하지 않고도 그 데이터에 접근할 수 있다.

 

즉, 참조를 사용해서 소유권을 임대해 줄 수 있다.

 

 

즉 아래와 같이 코드를 바꿔보면 해당 변수의 소유권을 이전하지 않고, 임대해 준다.

 

즉 소유권임대를 도식화하면 아래의 그림과 같다.

 

 

Rust의 참조는  불변 참조(Immutable References)와 가변 참조(Mutable References) 두 가지 유형이 있다.

 

 

1) 불변 참조 (Immutable References)

정의: 불변 참조(&T)는 데이터를 읽을 수만 있게 허용한다. 데이터의 수정은 불가능.


특징: 여러 불변 참조가 동시에 존재할 수 있다. 즉, 여러 곳에서 데이터를 동시에 읽을 수 있지만,

 

이러한 동안에는 어떠한 곳에서도 데이터를 수정할 수 없다.

 

 

 

불변참조변수를 사용하여 소유권을 임대하였는데, 해당 변수를 수정하려고 하면

 

아래와 같은 에러가 발생하게 된다.

 

 

 

 

2) 가변 참조 (Mutable References)

정의: 가변 참조(&mut T)는 데이터를 수정할 수 있는 권한을 제공한다.


특징: 한 번에 하나의 가변 참조만이 특정 데이터에 대해 존재할 수 있다.

 

이는 데이터 경쟁(data race)과 같은 안전하지 않은 상황을 방지한다.

 

 

 

소유권을 임대한 상태 해서 해당 변수를 수정하고 싶으면,

 

아래와 같이 가변참조 변수를 파라미터로 넘기면 된다.

 

 

하지만, 가변참조 (Mutable Reference)를 사용할 때는 주의점이 존재한다.

 

가변참조에 대한 추가참조는 만들 수 없다는 것이다.

 

 

가변참조에 대한 추가참조가 있을 경우의 문제점은 아래와 같다.

 

1) 둘 이상의 포인터가 같은 데이터를 참조 : 일관성을 훼손시킬 수 있음.

2) 한 개 이상의 포인터가 데이터를 쓰려고 접근 : 동시성, 데이터손상, Dead Lock 가능성 존재.

3) 추가참조를 허용할 경우 해당 데이터 접근을 동기화할 방법이 존재하지 않음.

 

Rust는 이러한 데이터 경쟁을 방지하기 위해 엄격한 소유권 및 대여 규칙을 적용한다.

 

Rust의 규칙에 따르면, 한 번에 하나의 가변 참조만이 존재할 수 있으며,

 

 

가변 참조가 존재하는 동안에는 해당 데이터에 대한 다른 참조를 만들 수 없다.

 

이는 동시에 데이터에 쓰기 작업을 수행하는 여러 스레드의 존재를 방지한다.

 

또한, 불변 참조가 있는 동안에는 해당 데이터에 대한 가변 참조를 만들 수 없어,

 

읽기 작업 중 데이터가 변경되는 것을 방지한다.

 

 


이러한 규칙은 컴파일 시점에서 강제되므로, 

 

Rust 프로그램은 런타임에 데이터 경쟁으로 인한 문제를 겪지 않도록 보호된다.

 

 

물론 아래와 같이 불변참조에 대해서는 몇 번을 참조하던 상관은 없다.

 

 

또한, 가변참조의 참조는 범위가 겹치지 않으면 가능하다.

 

예를 들어, 아래와 같이 scope 레벨이 다르게 되면 참조를 여러 번 할 수 있다.

 

반응형