Programming

Rust기초 알기 - 4.1 소유자와 대여자 개념

IT오이시이 2023. 6. 27. 05:17
728x90

 

 

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

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

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

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

 

Rust기초 알기 - 4.1 소유자와 대여자 개념

 

Rust 프로그래밍 언어에서 소유자(Owner)와 대여자(Borrower)는 메모리 관리와 관련된 개념입니다. Rust는 안전하고 효율적인 메모리 관리를 위해 소유자와 대여자를 사용합니다.


1. 소유자(Owner):

소유자는 힙(Heap)에 할당된 자원을 소유하고 관리하는 개체입니다. 소유자는 메모리 자원을 생성하고 소멸시키는 책임을 갖습니다. 소유자는 특정 데이터의 유일한 소유자이며, 해당 데이터에 대한 수정 및 소멸 권한을 가지고 있습니다. 소유자의 개체는 데이터에 대한 접근 및 조작을 가능하게 합니다.


2. 대여자(Borrower):

대여자는 소유자가 소유하고 있는 데이터에 대한 참조(Reference)를 가질 수 있는 개체입니다. 대여자는 소유권을 갖지 않지만, 소유자로부터 데이터에 대한 임시 액세스 권한을 얻을 수 있습니다. 이를 통해 소유자와 대여자 간 데이터 공유 및 조작이 가능하며, 동시에 메모리 안전성을 유지할 수 있습니다.

Rust에서 소유자와 대여자의 개념

Rust에서는 소유자와 대여자 개념을 통해 메모리 안전성과 데이터 경합(Concurrency) 문제를 컴파일러 수준에서 체크할 수 있습니다. 소유자와 대여자 간의 라이프타임(Lifetime) 규칙을 통해, 메모리에 접근하는 시간과 범위를 정확하게 추적하여 데이터 무결성과 동시성 문제를 방지할 수 있습니다.

 

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

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

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

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

 

결과

Borrowed: Hello
Borrowed: Hello, World!

owner는 String 타입의 데이터를 생성하는 소유자입니다. borrower는 owner의 불변 대여자이며, & 연산자를 사용하여 소유자의 데이터에 대한 참조를 얻습니다.

코드 실행 시, borrower는 owner의 데이터를 출력합니다. 그 후, owner는 .push_str() 메서드를 사용하여 데이터를 수정하고, 수정된 데이터를 출력합니다. 이때 borrower는 수정된 데이터에 접근하여 출력 결과를 반영합니다.

 

소유자와 대여자 간의  값의 수정 영향도

소유자의 값을 변경하면 대여자가 참조하는 값이 영향을 받을 수 있지만, 대여자의 값을 변경하더라도 소유자의 값은 직접적으로 영향을 받지 않습니다.

소유자(Owner) 의 값을 바꾸면 대여자(Borrower)의 값이 바뀌며 ,
Borrower의 값을 바꾸면 Owner는 바뀌지 않습니다.

 

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

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

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

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

    let mut borrower = "Hi Hi ~~";  // 대여자를 변경할 수 있도록 가변 변수로 선언합니다.
    println!("Owner: {}", owner);
    println!("Borrowed: {}", borrower);
}

 

실행 결과

Borrowed: Hello
Borrowed: Hello, World!
Owner: Hello, World!
Borrowed: Hi Hi ~~

 

1. println!("Borrowed: {}", borrower);는 초기에 borrower 변수가 &owner로 설정되어 있으므로 "Hello"를 출력합니다.

2. owner.push_str(", World!");를 통해 owner 변수의 값이 "Hello, World!"로 수정되었습니다. 이로 인해 borrower가 참조하는 데이터도 변경되므로, println!("Borrowed: {}", borrower);는 "Hello, World!"를 출력합니다.

3. let mut borrower = "Hi Hi ~~";를 통해 borrower 변수가 새로운 값을 참조하도록 변경되었습니다. 이제 borrower는 "Hi Hi ~~"를 참조하므로 println!("Borrowed: {}", borrower);는 "Hi Hi ~~"를 출력합니다.

4. println!("Owner: {}", owner);는 owner 변수의 값을 출력합니다. 이때 owner 변수의 값은 이전에 "Hello, World!"로 수정되었으므로, "Hello, World!"를 출력합니다.

728x90
반응형