Rust는 다른 프로그래밍언어와다르게 소유권 이라는 시스템을 만들고,
컴파일러가 컴파일 중에 검사할 여러 규칙을 정해 메모리에 관리하는 방식입니다.
규칙중에 한가지라도 어길시 컴파일이 진행되지 않습니다.
Rust언어의 유일한 특징 중 하나로, 메모리 안전성을 보장하면서
가비지 콜렉터가 없는 시스템을 가능하게 합니다.
소유권 규칙
- Rust에서, 각각의 값은 소유자 가 정해져 있습니다.
- 한 값의 소유자는 동시에 여럿이 존재 할 수 없습니다.
- 소유자가 스코프 밖으로 벗어날 때, 값은 버려집니다.
Rust의 소유권 시스템 기반은 스택과 힙의 동작 방식 입니다.
스택 ( Stack )
스택은 컴퓨터 메모리의 영역으로, 함수 호출 시 생성되는 지역 변수나 함수 매개변수 등이 저장됩니다.
스택에 저장되는 데이터의 크기와 수명은 컴파일 시점에 결정되며, LIFO(Last In, First Out) 방식으로 관리됩니다.
즉, 가장 마지막에 들어간 데이터가 가장 먼저 나오게 됩니다.
힙 ( Heap )
힙은 동적으로 할당되는 데이터를 저장하는 메모리 영역입니다.
스택과 달리 컴파일 시점에 데이터의 크기나 수명이 결정되지 않고, 런타임 시점에 개발자에 의해 명시적으로 관리됩니다. 데이터가 힙에 저장될 때, Rust는 이에 대한 포인터를 반환하여 데이터에 접근할 수 있게 합니다.
Rust의 소유권 시스템 - 참조와 대여 ( Borrowing )
참조(Reference) : Rust에서는 변수의 소유권을 이전하지 않고도 변수의 값을 사용할 수 있게 해주는 방법으로
참조를 사용합니다. 참조를 만들려면 & 기호를 사용하며, 이렇게 만들어진 참조를 통해 데이터를 읽을 수 있습니다.
예를 들어,
let s1 = String::from("hello");
let s2 = &s1;
처럼 사용할 수 있습니다. 이 경우, s2는 s1을 참조합니다.
대여(Borrowing) : Rust에서는 참조를 '대여'라고도 합니다.
이는 변수의 소유권을 완전히 넘겨주지 않고 일시적으로 빌려주는 것을 의미합니다.
'빌려준' 변수는 원본이 유효한 동안만 사용할 수 있습니다.
또한, Rust에서는 불변 참조(Immutable reference)와 가변 참조(Mutable reference)를 구분합니다.
불변 참조는 데이터를 변경할 수 없으며, 가변 참조는 데이터를 변경할 수 있습니다.
하지만 한 스코프 내에서 동시에 가변 참조를 여럿 가지거나, 가변 참조와 불변 참조를 동시에 가질 수 없습니다.
이는 데이터 경쟁 조건을 방지하는데 도움이 됩니다.
슬라이스
Rust에서 슬라이스는 컬렉션의 일부분을 참조하는 데이터 타입 입니다.
슬라이스는 원본 데이터를 가지지않으며, 원본 데이터의 일부에 대한 "참조"를 합니다.
슬라이스 사용 예를 들면
let s = String::from("hello world");
let hello = &s[0..5];
let world = &s[6..11];
이런식으로 배열에도 슬라이스를 사용가능합니다.
'Rust-Language' 카테고리의 다른 글
| Rust-Language 열거형과 패턴 매칭 (3) | 2023.12.31 |
|---|---|
| Rust-Language 구조체 (2) | 2023.12.30 |
| Rust-language 프로그래밍 개념 (2) | 2023.12.27 |