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!"를 출력합니다.
'Programming' 카테고리의 다른 글
Rust기초 알기 - 4.4 소유권과 메모리 관리 (12) | 2023.06.30 |
---|---|
Rust기초 알기 - 4.3 소유권 이전과 복사 (6) | 2023.06.29 |
Rust기초 알기 - 4.2 소유권 규칙 (7) | 2023.06.28 |
Rust기초 알기 - 3.5 주석 - comment - decorator (79) | 2023.06.21 |
Rust기초 알기 - 3.4 모듈과 패키지 (36) | 2023.06.19 |
Rust기초 알기 - 3.3 함수 정의와 호출 (7) | 2023.06.18 |
Rust기초 알기 - 3.2 제어문 (조건문, 반복문) (21) | 2023.06.14 |