1. Rust의 소유권
러스트(Rust)에서의 소유권(Ownership)은 메모리 안정성을 보장하기 위한 개념으로 소유권 시스템은 다음과 같은 원친으로 구성됩니다.
- 소유권 규칙:
- 각 값은 하나의 소유자(변수)에만 속할 수 있음
- 소유자가 범위를 벗어나면 해당 값은 자동으로 메모리에서 해제
- 참조와 대여(References and Borrowing)
- 다른 변수에 소유권을 이동하지 않고 값을 사용할 수 있도록 참조를 사용할 수 있음
- 불변 참조(&T)는 여러 개가 가능하나, 가변 참조(&mut T)는 하나만 존재할 수 있음, 이는 데이터 경합을 방지
- 스코프(Scope)
- 변수의 스코프가 끝나면 해당 변수의 소유권이 종료
- 이와 동시에 메모리도 자동 해제되며 이를 통해 메모리 누수를 방지
- 이동(Smove)와 복사(Copy)
- 기본적으로 소유권이 이동하며, 한 변수에서 다른 변수로 값을 할당하면 원래 변수는 더이상 그 값에 접근X
- 그너나 일부 타입(ex. 정수, 부동 소수점)은 복사 가능하며, 소유권 이동 없이도 값을 복사 가능
2. 기본 소유권 규칙
- 기본 소유권 규칙
Rust의 값의 소유자는 각 값에 하나의 변수에만 속합니다. 이 변수에는 그 값을 소유하며, 변수가 스코프를 벗어나면 값이 자동으로 메모리에서 해제됩니다. 우선 아래 명령어로 rust 프로그램을 생성합니다.
cargo new owenship
// 기본 소유자 규칙
fn main() {
let jack = String::from("Hello Cargo!"); // jack은 "Hello Cargo"의 소유자!
}
- 소유권 이동(Move)
값을 다른 변수에 할당하면 소유권이 이동합니다. 이전 변수는 더 이상 해당 값을 참조할 수 없습니다.
fn main() {
let s1 = String::from("Hello");
let s2 = s1; // s1의 소유권이 s2로 이동
println!("{}", s2); // 성공
// println!("{}", s1) // 실패: s1은 더 이상 사용 X
}
- 복사(Copy)
일부 기본 데이터 타입(정수, 부동 소수점)은 Copy 트레잇을 구현해 소유권 이동 없이 복사할 수 있습니다.
fn main() {
let x = 5;
let y = x; // x의 값을 y에 복사
println!("{}", y) // 정상 작동
}
- 참조와 대여(Borrowing)
다른 변수에 소유권을 이동하지 않고 사용할 수 있습니다.이를 위해 참조를 사용할 수 있습니다.
fn main() {
let s1 = String::from("Hello");
let len = calculate_length(&s1); // 불변 참조
println!("Length: {}", len); // s1 여전히 유효
}
fn calculate_length(s: &String) -> usize {
s.len()
}
- 가변 참조 (Mutable Borrowing)
값에 대한 가변 참조를 생성할 수 있으나, 동시에 하나의 가변 참조만 가질 수 있습니다.
fn main() {
let mut s = String::from("Hello");
change(&mut s); // 가변 참조
println!("{}", s);
}
fn change(s: &mut String) {
s.push_str(", World");
}
- 스코프와 메모리 해체
fn main() {
let s = String::from("Hello");
// s는 이 블록 내에 유효
// s는 이 시점에서 메모리 해체
}
결론
- 러스트의 소유권 시스템은 메모리 안정성을 보장함
- 컴파일 타임에 오류를 방지하는 강력한 도구
- 소유권, 대여, 참조 개념을 활용해 안전하고 효율적인 코드 작성 가능
GitHub - Koras02/rust-tutorial: https://thinky.tistory.com/category/Back-End/Rust
https://thinky.tistory.com/category/Back-End/Rust. Contribute to Koras02/rust-tutorial development by creating an account on GitHub.
github.com
LIST
'Back-End > Rust' 카테고리의 다른 글
[Rust] 6장 에러 처리 (0) | 2025.03.08 |
---|---|
[Rust] 5장 패턴 매칭(Pattern Matching) (0) | 2025.03.06 |
[Rust] 4장 데이터 타입(Data Types) (0) | 2025.03.02 |
[Rust] 3장 빌림(Borrowing) (0) | 2025.02.27 |
[Rust] 1장 Rust란 무엇인가 (0) | 2025.02.23 |