수명은 값들이 얼마나 살아있는지를 알기위해 컴파일러가 스코프에 붙이는 태그다




여기서 foo와 bar는 main 함수의 스코프안에 들어있고 이 함수 스코프의 수명을 갖는다 이 수명을 편의상 'main이라고 부르겠다


그럼 이제 스코프를 하나 더 만들어보자





이제 foo와 bar는 다른 스코프안에 들어있고 서로 다른 lifetime을 갖는다 bar가 속한 내부 스코프의 수명을 편의상 'inner라고 부르겠다


그럼 이번엔 한번 'inner가 끝나고 나서 bar를 접근해보자






컴파일 에러가 발생했다


먼저 9번째 줄을 보면 bar를 &(borrow) 하는데 이떄 &bar의 타입은 &'inner i32가 된다 'inner만큼 사는 i32의 공유참조라는 뜻이다


그런데 우리는 'inner 스코프가 끝나서도 이 참조를 쓸려고 했으니 컴파일 에러가 터진것이다


여기까진 어느정도 이해하기 쉬울것이라 생각한다 그럼 이제 응용을 해보자





&str를 갖는 Person 타입을 만들고 'static 수명을 갖는 foo를 초기화 했다 'static이란 프로그램 실행내내 살아있는 특수한 수명이다


참조가 'static을 다는건 비교적 쉽지 않지만 이 name은 리터럴이라 손쉽게 'static을 달수있다

이번엔 아까처럼 inner scope를 만들어보자





이번엔 컴파일이 된다 bar는 'inner만큼 살지만 리턴은 이동이기 때문에 변수의 수명과는 관계없이 외부 스코프에서 받아볼수있다


그렇다면 만약 bar에 'inner의 참조가 들어있다면 어떻게 될까?





이번엔 저번과 똑같은 에러로 컴파일에 실패했다


왜 참조를 반환하지 않고 이동을 시켰음에도 실패한걸까?



bar의 타입이 어떻게 변했는지 비교해보면 앞의 bar는 Person<'static>이였지만 이번엔 Person<'inner>다


애초에 Person에 수명이 왜 붙어있었는가? 그것은 어딘가에는 그 수명을 사용하는 값이 있다는 것이고


결국 Person이 사용되려면 그 수명을 필요로 한다는 것이다 이걸 타입수명이라고 하는데 구할려면 붙어있는 모든 수명을 더하면 된다


만약 붙어있는 수명이 하나도 없다면? 축하한다 'static의 수명을 가지는 쓰기편한 타입이다



이제 이 타입수명의 관점으로 아까 참조를 반환했을때를 다시 살펴보자




이때 &bar의 타입이 &'inner i32라고 했었는데 똑같이 이것도 &'inner T의 타입수명이 'inner라서 'inner 외부에서는 사용할수 없을 뿐인것이다




이런식으로 Rust에서는 모든 타입들이 자신들이 가진 수명동안만 사용될수 있도록 제약을 가하고 그에따라 이미 죽어버린 스코프에 접근하는걸 막아준다


그뿐만 아니라 소유권 시스템에서 borrow에 관한 중요한 역할도 있지만 지면상 나중에 다시 다뤄보도록 하겠다