rust lifetime

agnusdei·2025년 2월 6일
0

📌 러스트 라이프타임 & 함수 시그니처 개념 정리

1️⃣ 라이프타임(Lifetime)이란?

러스트에서 라이프타임(Lifetime)참조자의 유효 기간을 컴파일러가 추론하도록 돕는 개념입니다.

  • 목적: 메모리 안전성을 유지하면서 댕글링 포인터(dangling pointer) 문제를 방지하기 위해 존재함.
  • 왜 필요한가? 러스트에서는 빌림(Borrowing) 개념을 사용하기 때문에, 참조가 유효한 범위를 명확히 해야 함.
  • 기본 라이프타임 규칙: 러스트는 보통 라이프타임 추론을 통해 자동으로 처리하지만, 컴파일러가 모호하다고 판단하면 명시적으로 지정해야 함.

2️⃣ 라이프타임 기본 문법

라이프타임을 정의할 때 'a 같은 형태로 사용합니다.

fn example<'a>(param: &'a str) -> &'a str {
    param
}
  • 'a: 라이프타임 매개변수(변수처럼 생겼지만, 생명 주기를 나타냄)
  • param: &'a str: param'a라는 라이프타임을 따르는 참조자임을 의미.
  • -> &'a str: 반환값 역시 'a 라이프타임을 가짐.

📌 라이프타임과 함수 시그니처

함수에서 라이프타임을 지정해야 하는 경우가 있습니다.

1️⃣ 라이프타임 없이 참조자를 반환하는 함수

fn longest(s1: &str, s2: &str) -> &str {  // ❌ 에러 발생!
    if s1.len() > s2.len() {
        s1
    } else {
        s2
    }
}

왜 에러가 발생하는가?
컴파일러가 s1s2라이프타임이 다를 수 있기 때문에 어떤 라이프타임을 반환해야 하는지 결정할 수 없음.


2️⃣ 라이프타임을 명시한 함수 시그니처

fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str {
    if s1.len() > s2.len() {
        s1
    } else {
        s2
    }
}

설명:

  • 'as1s2가 같은 라이프타임을 가짐을 의미.
  • 반환값 &'a strs1s2 중 하나의 참조자를 반환하지만, 두 값 중 긴 라이프타임을 따라가게 됨.

이제 컴파일 가능!


📌 라이프타임과 구조체

구조체 내부의 참조자에도 라이프타임을 명시해야 합니다.

1️⃣ 라이프타임 없는 구조체 (에러 발생)

struct ImportantExcerpt {
    part: &str,  // ❌ 에러 발생!
}

라이프타임을 추가하여 해결

struct ImportantExcerpt<'a> {
    part: &'a str, // 'a 라이프타임을 가짐
}

fn main() {
    let text = String::from("Hello, Rust!");
    let excerpt = ImportantExcerpt { part: &text };

    println!("{}", excerpt.part);
}

이렇게 하면 excerpt.parttext의 라이프타임을 따르게 됨.


📌 라이프타임 엘리시온 (생략 규칙)

러스트는 일반적인 패턴을 따라 라이프타임을 자동으로 추론할 수 있음.

1️⃣ 단일 참조자 → 라이프타임 생략 가능

fn first_word(s: &str) -> &str {  // 라이프타임 명시 안 해도 됨
    let bytes = s.as_bytes();
    let index = bytes.iter().position(|&c| c == b' ').unwrap_or(s.len());
    &s[..index]
}

컴파일러가 자동으로 s와 반환값이 동일한 라이프타임을 가짐을 추론

2️⃣ 여러 개의 참조자 → 라이프타임 명시 필요

fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str { ... }
  • s1s2서로 다른 라이프타임을 가질 가능성이 있으므로 명시해야 함.

🎯 결론

  • 라이프타임은 참조자가 유효한 범위를 지정하는 개념으로, 러스트가 댕글링 포인터를 방지하도록 돕는다.
  • 함수 시그니처에서 라이프타임이 필요한 경우: 여러 참조자를 받을 때, 컴파일러가 추론할 수 없는 경우.
  • 라이프타임 엘리시온(생략 규칙)이 적용되는 경우: 단일 참조자 매개변수의 경우 컴파일러가 자동 추론.
  • 구조체 내부의 참조자에도 라이프타임을 명시해야 한다.

📌 러스트의 라이프타임은 복잡해 보일 수 있지만, 기본 개념을 이해하면 함수나 구조체에서 참조자를 안전하게 사용할 수 있도록 도와준다.

profile
DevSecOps ⚙️ + CTF🚩

0개의 댓글