Programming

Rust기초 알기 - 4.2 소유권 규칙

IT오이시이 2023. 6. 28. 05:49
728x90

 

Rust기초알기 (4) - 소유권 시스템

4.1 소유자와 대여자 개념
4.2 소유권 규칙
4.3 소유권 이전과 복사
4.4 소유권과 메모리 관리

[목차] Rust Programming - Rust 기초 알기 목차.Zip

#Rust프로그래밍  #Rust언어기초 #Rust기초문법 #Rust기초알기

 

 

 

Rust기초 알기 - 4.2 소유권 규칙

 

Rust는 소유권 시스템을 통해 메모리 안전성과 동시성을 보장하기 위한 언어적 기능을 제공합니다.

소유권 규칙은 컴파일러가 런타임 에러를 사전에 검출하여 안정적인 프로그램을 생성하는 데 도움을 줍니다. Rust는 소유권 규칙을 엄격하게 적용하므로, 데이터 무결성과 안전성을 보장하면서도 생산적이고 효율적인 코드를 작성할 수 있게 됩니다.

 

소유권 규칙은 다음과 같은 세 가지 핵심 개념을 포함합니다: 소유자, 대여자, 반환자.

1. 소유자(Owner):

데이터의 소유자는 해당 데이터를 생성하고, 수정하고, 메모리에서 해제하는 권한을 가지는 변수입니다. Rust에서는 단 하나의 소유자만이 특정 데이터에 대한 소유권을 가질 수 있습니다.

 

2. 대여자(Borrower):

대여자는 소유자의 데이터를 참조하기 위해 소유자에게 대여를 요청하는 변수입니다. 대여자는 불변 또는 가변 참조로 데이터에 접근할 수 있습니다. 불변 대여자는 데이터를 읽을 수만 있고 수정할 수 없습니다. 가변 대여자는 데이터를 읽고 수정할 수 있습니다.

3. 반환자(Returner):

소유자가 스코프를 벗어나거나 데이터를 다른 변수에 할당하면 해당 데이터의 소유권은 반환됩니다. 반환자는 데이터의 소유권을 받게 됩니다.

 

 

Rust의 소유권 규칙


Rust의 소유권 규칙은 다음과 같습니다:

1. 각 값은 오직 하나의 소유자만을 가질 수 있습니다.

이는 "단일 소유권" 개념으로, 한 시점에서 데이터에 대한 소유자는 단 하나뿐입니다.

2. 소유자는 값의 스코프 내에서만 유효합니다.

스코프를 벗어나면 소유자는 자동으로 값이 해제되고 메모리는 반환됩니다. 이는 "드랍(Drop)" 개념으로, Rust의 Drop 트레이트를 구현하여 자원을 정리하는 코드를 작성할 수 있습니다.

3. 소유자는 데이터를 대여하거나 대여자에게 대여할 수 있습니다.

대여자는 소유자에게서 불변 혹은 가변 참조를 통해 데이터에 접근할 수 있습니다. 단, 데이터를 대여하는 동안에는 소유자는 해당 데이터에 접근할 수 없습니다. 이를 통해 런타임에서 데이터 경합 조건과 메모리 충돌을 방지합니다.

4. 소유자가 스코프를 벗어나거나 데이터를 다른 변수에 할당하면 소유권은 반환됩니다.


5. 소유권이 반환되면 해당 데이터에 대한 모든 대여자의 참조는 무효화됩니다.

 

 

소유자는 데이터를 생성하고 수정할 수 있으며, 대여자는 데이터를 참조하여 읽을 수 있지만 수정할 수는 없습니다. 이를 통해 Rust는 데이터의 안전한 사용을 보장하고 메모리 안정성을 유지합니다.

fn main() {
    let mut owner = String::from("Hello");  // String 타입의 데이터를 생성하여 소유자가 됩니다.

    let borrower = &owner;  // 소유자의 데이터에 대한 불변 대여자를 생성합니다.
    println!("Borrowed: {}", borrower);

    owner.push_str(", World!");  // 소유자는 데이터를 수정할 수 있습니다.

    // 대여자는 소유자가 수정된 데이터에 접근할 수 있습니다.
    println!("Borrowed: {}", borrower);

    // 소유자가 스코프를 벗어나면 소유권이 반환됩니다.
}  // owner, borrower는 여기서 소유권이 반환됩니다.

 

1. owner 변수는 String 타입의 데이터를 생성하여 소유자가 됩니다. 

2. borrower 변수는 owner의 불변 대여자로 생성됩니다. borrower를 통해 owner의 데이터를 읽을 수 있지만 수정할 수는 없습니다.

3. owner.push_str(", World!");를 통해 소유자는 데이터를 수정할 수 있습니다. 이는 대여자인 borrower가 참조하는 값에도 영향을 줍니다. 

4. 소유자인 owner와 대여자인 borrower는 `main` 함수의 스코프를 벗어나면 소유권이 반환됩니다. 

이는 Rust의 소유권 규칙에 따라 소유자와 대여자가 소유권을 유지할 수 있는 스코프 내에서만 데이터에 접근할 수 있음을 보여줍니다.

728x90
반응형