Rust
[Rust] 7. 소유권과 대여
comnic
2023. 12. 5. 20:33
반응형
7. 소유권과 대여
Rust의 핵심 개념 중 하나는 소유권(Ownership) 시스템입니다. 이는 메모리 안전성과 경합 상태를 방지하는 기술적인 도구로 사용됩니다.
7. 1 소유권 시스템 소개
- Rust에서 모든 값은 변수에 소유권(ownership)을 가지고 있습니다. 한 번에 하나의 변수만이 해당 값의 소유권을 갖을 수 있습니다.
- 소유권은 변수가 스코프 밖으로 벗어날 때 해당 값이 메모리에서 해제되는 것을 의미합니다.
예제:
fn main() {
let s1 = String::from("Hello"); // s1이 String의 소유권을 가짐
let s2 = s1; // s2가 소유권을 가져감, s1은 더 이상 유효하지 않음
// println!("{}", s1); // 컴파일 에러! s1은 더 이상 사용할 수 없음
println!("{}", s2); // s2는 여전히 유효
}
7. 2 빌림과 참조
- 소유권을 넘기지 않고도 데이터에 접근할 수 있도록 빌림(borrowing)과 참조(reference)를 사용할 수 있습니다.
- 빌림은 다른 코드에게 데이터의 일부분에 임시로 접근할 수 있는 권한을 부여합니다.
예제:
fn calculate_length(s: &String) -> usize {
s.len()
}
fn main() {
let s1 = String::from("Hello");
let len = calculate_length(&s1); // s1에 대한 참조를 전달
println!("길이: {}", len);
}
7. 3 라이프타임
- 라이프타임(lifetime)은 참조자의 유효 범위를 나타냅니다. Rust는 참조자의 유효성을 검증하기 위해 라이프타임을 사용합니다.
- 'a와 같이 작성되며, 함수 시그니처에서 표현됩니다.
예제:
// 라이프타임 'a를 갖는 함수
fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str {
if s1.len() > s2.len() {
s1
} else {
s2
}
}
fn main() {
let s1 = String::from("Hello");
let result;
{
let s2 = String::from("Rust");
result = longest(&s1, &s2); // s1, s2 중 더 긴 문자열의 참조를 result에 저장
}
println!("가장 긴 문자열: {}", result); // s2의 라이프타임이 끝났으므로 사용 불가능
}
이러한 예제를 통해 Rust의 소유권 시스템, 빌림, 참조, 그리고 라이프타임이 어떻게 동작하는지를 이해할 수 있습니다.
반응형