🎯 Lifetime
라이프타임은 참조가 유효한 기간 동안 해당 값이 메모리에서 해제되지 않도록 보장하는 개념입니다.
이를 통해 Rust에서 참조를 안전하게 사용할 수 있습니다.
여기선 함수 시그니처와 구조체에서 수명을 어떻게 표시하는지 보여줍니다.
수명은 주로 빌림 검사기가 메모리 안전성을 보장하기 위한 도구로 사용되며, 컴파일러에 의해 자주 자동으로 추론된다는 것을 강조합니다.
('hey: lifetime hey로 읽음)
수명이란 무엇인가:
수명은 참조와 빌려진 값 사이의 관계를 표현하는데 사용됩니다.
수명은 참조가 유효한 기간 동안 해당 값이 메모리에서 해제되지 않도록 보장합니다.
함수 시그니처와 구조체에서의 수명 표시:
예제 1: 함수 시그니처에서 수명 표시
// 여기에서 사용된 'a는 수명을 나타내는 표시입니다.
// 이를 통해 입력과 출력의 참조들이 동일한 수명을 가지도록 합니다.
fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str {
if s1.len() > s2.len() {
s1
} else {
s2
}
}
예제 2: 구조체에서 수명 표시
// Person 구조체는 이름을 문자열 슬라이스로 저장합니다.
// 여기에서 사용된 'a는 구조체의 이름 필드가 참조하는 문자열 슬라이스의 수명을 나타냅니다.
struct Person<'a> {
name: &'a str,
}
수명과 빌림 검사기:
수명은 빌림 검사기가 참조가 유효한 기간 동안 값이 메모리에서 해제되지 않도록 보장하는 데 사용됩니다.
대부분의 경우, 컴파일러는 수명을 자동으로 추론할 수 있습니다.
그러나 복잡한 상황에서는 개발자가 수명을 명시해야 할 수도 있습니다.
수명을 이해하고 올바르게 사용함으로써 Rust의 빌림 검사기가 메모리 관리를 안전하게 수행할 수 있도록 지원할 수 있습니다.
이는 Rust 프로그램의 성능과 안정성에 크게 기여합니다.
struct Wrapper<'a, T: 'a> {
value: &'a T,
}
impl<'a, T> Wrapper<'a, T> {
fn new(value: &'a T) -> Self {
Wrapper { value }
}
}
fn main() {
let x = 42;
let y = Box::new(7);
{
let wrapper = Wrapper::new(&x);
println!("Wrapper contains: {}", wrapper.value);
let wrapper2 = Wrapper::new(&y);
println!("Wrapper2 contains: {}", wrapper2.value);
} // y가 메모리에서 해제됩니다.
} // x가 메모리에서 해제됩니다.