해결된 질문
작성
·
155
0
답변 1
1
예리한 질문 감사드립니다. 네, 아무래도 소유권과 임대, 그리고 생명주기(라이프사이클)등이 좀 생소하기 때문에 설명과 이해가 어려운 것 같습니다. 아마 아래 예제에 대한 질문이신 것 같습니다.
fn str_lifetime() {
let s1 = String::from("가나다");
let s2 = "하나둘셋";
let res = longest(s1.as_str(), s2);
println!("더 긴 문자열은 {}", res);
}
/* 수명 표기를 잘 한 경우 */
fn longest<'a>(s1: &'a str, s2: &'a str) -> &'a str {
if s1.len() > s2.len() {
s1
} else {
s2
}
}
러스트의 함수에서 로컬 변수값을 리턴하는 것은 문제가 되지 않습니다. 로컬 변수에 대한 소유권이 함수 안에 있다했을 때, 반환값으로 넘어가면 해당 소유권이 함수 호출자에게로 이전되고, 호출한 입장에서는 해당 반환값을 문제없이 잘 활용할 수 있습니다.
게다가 소유권 "임대"의 경우에는 애초에 나한테 있던 소유권이 아니라 빌려왔던 것이기 때문에, 외부의 참조값을 빌려온 함수 입장에서는 애초에 내 소유가 아닙니다. 반환을 하든 안하든 애초에 내 소유가 아니었기 때문에 소유권 고민 문제에서 자유롭게 됩니다.
해당 라이프사이클에 대한 설명은, 소유권 임대의 상황에서, 그 임대값 참조의 수명을 명시해야 할 필요가 있는 경우에 대한 것인데요, 강의 중에 설명을 한 내용입니다만, 여기 글로 다시 정리해보겠습니다.
longest
함수에서 s1
과 s2
라는 문자열슬라이스, 그러니까 참조값을 임대해 와서 무언가를 하고 있습니다. 코드 안에서는 s1
과 s2
의 len()
함수를 써서 길이를 판단해보고, 더 긴 참조값을 반환했습니다. 러스트 컴파일러 입장에서는 런타임에서 달라질 수 있는 (사실 이 코드에서는 s1과 s2의 구체적인 값이 하드코딩되어있기 때문에 어쩌면 알 수도 있겠습니다만, 일반적으로 문자열 값은 런타임에 다른 값이 발생하겠죠) 문자열들의 길이를 미리 알 수가 없습니다. 그러니 s1
참조값과 s2
참조값 중 어느 것이 반환될지 모르는 상황입니다.
이럴 때, 러스트 프로그래머가 둘 중 어느것이든 반환 될 수 있고, 그 라이프사이클이 반환값의 라이프사이클 조건과 맞을 수 있도록 명시해주는 작업인 거죠.
그렇게 컴파일러의 임대 검사기 (borrow checker)가 'a라는 동일 lifecycle 기준으로 검사를 진행할 수 있게 해주는 상황입니다.
다시 글로 적어도 어려운 내용인 것 같습니다. 추가 설명드리면 좋을 부분 있으시면 편히 말씀 부탁드립니다.
수강해주시고, 질문 남겨주셔서 감사합니다.
상세한 답변 감사드립니다. 강사님이 말씀해주신 사항으로 잘 이해가 됐습니다.
강의 중반부까지만 듣고 질문을 드렸었는데, 후반부에 더 자세히 설명해 주시더라고요 ㅎㅎ;
라이프사이클 관련 강의를 수강한 뒤에 같은 코드를 c++로 작성했을 때 차이를 비교해보면서 이해해 보려고 했는데, c++과 러스트로 작성한 코드를 비교해 생각해 봤을 때도 잘이해가 되지 않았습니다. 자세히 답변을 달아주신 덕분에 외부 참조에 대한 소유권 임대 및 그 값을 리턴하는 경우에 대한 처리가 잘 이해됐습니다.
강의중에 말씀해주신 것 처럼 소유권 임대와 라이프사이클은 여러번 반복해서 학습해야 될 것 같습니다.
다시 한번 상세한 답변 감사드립니다.