수명은 값들이 얼마나 살아있는지를 알기위해 컴파일러가 스코프에 붙이는 태그다
여기서 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이란 프로그램 실행내내 살아있는 특수한 수명이다
이번엔 컴파일이 된다 bar는 'inner만큼 살지만 리턴은 이동이기 때문에 변수의 수명과는 관계없이 외부 스코프에서 받아볼수있다
그렇다면 만약 bar에 'inner의 참조가 들어있다면 어떻게 될까?
이번엔 저번과 똑같은 에러로 컴파일에 실패했다
왜 참조를 반환하지 않고 이동을 시켰음에도 실패한걸까?
bar의 타입이 어떻게 변했는지 비교해보면 앞의 bar는 Person<'static>이였지만 이번엔 Person<'inner>다
애초에 Person에 수명이 왜 붙어있었는가? 그것은 어딘가에는 그 수명을 사용하는 값이 있다는 것이고
결국 Person이 사용되려면 그 수명을 필요로 한다는 것이다 이걸 타입수명이라고 하는데 구할려면 붙어있는 모든 수명을 더하면 된다
만약 붙어있는 수명이 하나도 없다면? 축하한다 'static의 수명을 가지는 쓰기편한 타입이다
이제 이 타입수명의 관점으로 아까 참조를 반환했을때를 다시 살펴보자
이때 &bar의 타입이 &'inner i32라고 했었는데 똑같이 이것도 &'inner T의 타입수명이 'inner라서 'inner 외부에서는 사용할수 없을 뿐인것이다
이런식으로 Rust에서는 모든 타입들이 자신들이 가진 수명동안만 사용될수 있도록 제약을 가하고 그에따라 이미 죽어버린 스코프에 접근하는걸 막아준다
그뿐만 아니라 소유권 시스템에서 borrow에 관한 중요한 역할도 있지만 지면상 나중에 다시 다뤄보도록 하겠다
라이프사이클 왤케 복잡함
러스트 변수 말하는거야 나 말하는거야
복잡한 러스트변수를 다루는 주딱이 복잡하네요
근데 러스트 수명이 왜 어려운 개념으로 느껴지는거야? 그냥 다른 언어들에서 스택의 스코프랑 다를 바 없지 않나 다만 참조도 그 스코프를 지키게 해주는게 러스트 수명이고
포인터가 그냥 주소값이라고 줫밥이 아니듯이 수명 개념은 간단해도 수동 메모리 관리 자체가 어려워서 써먹기는 쉽지않음
이렇게 보면 쉬운데 직접 써보면 어려움
러스트의 미래는 어떤가인줄알고 드립칠려고햇는데 아니였군요
5짤에서 bar가 가리키는 메모리의 소유권이 이동하면서 수명도 바낀거야?
아니면 그냥 'static이라서 상관없는건가