[Rust] 라이프타임(lifetime)

라이프타임은 어떤 참조에 대한 수명을 표시하고 제약을 걸어서 안전성을 확보할 수 있는 문법요소중 하나다.

가령 어떤 자원 A가 있고 이를 가리키는 참조 P가 있다. 그러다가 프로그램에서 A가 삭제되었는데, P는 여전히 존재한다면!
이러한 상황은 심각한 오류를 발생시킬 수 있다.
라이프타임은 이를 해결하기 위한 방법론이다.


i32의 참조자를 가지는 Foo 구조체를 정의해서 생성해보자. image

image 그럼 라이프타임 지정자를 빼먹었다고 뭐라고 한다.

이걸 해결하려면 구조체 이름 옆에 <'라이프타임이름'> 정의해주고 참조에도 그걸 달아주면 된다.
이름은 뭘로해도 상관없는데 보통 관례적으로 a, b... 순서대로 쓰는거같다. image

image 이렇게하면 멤버변수 x는 구조체 Foo와 같은 생명주기를 갖게 된다.
메서드를 정의할때는 impl<'a> Foo<'a>...로 하면 된다.


함수에도 비슷하게 적용할 수 있다. 다만 함수에서는 라이프타임을 지정하지 않아도 에러는 잘 안낸다.
그냥 암시적으로 라이프타임을 적용해주기 때문이다. 왜 구조체만 차별하는지는 모르겠다. image

image

라이프타임을 지정하면 이렇게 된다.
에디터가 좀 멍청해서 문자 리터럴로 파싱해버렸다. image

image

근데 뭔가 귀찮고 짜증나는 예외가 좀 있다.
함수 인자에 참조가 2개 이상 있고, 반환타입도 참조라면 라이프타임을 명시해줘야한다.
반환타입의 라이프타임이 둘중 뭘 따르는지 모르기 때문이다..

예시를 보자.
아래의 forward 함수는 참조 2개를 받아서 첫번째 인자를 그대로 반환하기만 한다. image

image 그럼 반환타입의 라이프타임을 알수없다고 에러를 던진다.

이걸 해결하려면 2개의 인자를 하나의 라이프타임으로 묶어도 되고,
따로 구별한다음에 반환타입의 라이프타임은 그 2개중에 하나로 골라도 된다. image

image 이렇게 하거나


image

image 이렇게 하거나


static 라이프타임
'static은 유일하게 특별한 의미를 가지는 라이프타임이다.
말 그대로 정적이라는 뜻이다. 'static으로 지정된 변수 등은 절대로 죽지 않는다... image

image


사실 아직 쓰면서도 긴가민가하다. 제대로 이해하게 되면 다시 정리해서 수정토록 하겠다...


참조
https://doc.rust-lang.org/1.9.0/book/lifetimes.html
https://rinthel.github.io/rust-lang-book-ko/ch10-03-lifetime-syntax.html (보기 좋다.)