Lifecycle 강의에서 두 문자열 슬라이스를 비교해 긴 문자열 슬라이스를 리턴하는 것 관련 질문
강의 내용에서는 어떤 값이 길지 컴파일러가 예측하지 못하기 때문에 라이프사이클을 명시해야한다고 했는데 이 부분이 이해가 되지 않습니다로컬변수를 리턴하려고 하는 게 문제가 되는게 아닌가요?
Answer 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 기준으로 검사를 진행할 수 있게 해주는 상황입니다.
다시 글로 적어도 어려운 내용인 것 같습니다. 추가 설명드리면 좋을 부분 있으시면 편히 말씀 부탁드립니다.
수강해주시고, 질문 남겨주셔서 감사합니다.
1
상세한 답변 감사드립니다. 강사님이 말씀해주신 사항으로 잘 이해가 됐습니다.
강의 중반부까지만 듣고 질문을 드렸었는데, 후반부에 더 자세히 설명해 주시더라고요 ㅎㅎ;
라이프사이클 관련 강의를 수강한 뒤에 같은 코드를 c++로 작성했을 때 차이를 비교해보면서 이해해 보려고 했는데, c++과 러스트로 작성한 코드를 비교해 생각해 봤을 때도 잘이해가 되지 않았습니다. 자세히 답변을 달아주신 덕분에 외부 참조에 대한 소유권 임대 및 그 값을 리턴하는 경우에 대한 처리가 잘 이해됐습니다.
강의중에 말씀해주신 것 처럼 소유권 임대와 라이프사이클은 여러번 반복해서 학습해야 될 것 같습니다.
다시 한번 상세한 답변 감사드립니다.
다음강의 플랜이 어떻게 되실까요?
0
35
1
소스코드
0
32
1
강의 자료 ppt나 pdf 파일은 없을까요?
0
69
1
선생님 ppt자료를 받아서 공부하고 싶습니다.
0
52
2
Rust는 어떻게 컴파일 타임에 dangling reference를 막나요?
0
70
2
강의 추가 계획 질문
0
76
2
소유권 이전과 관련된 질문입니다
0
148
2
&r1 을 써야하는지 r1을 써야하는지?
1
120
1
임대값 수명에 대한 질문
1
122
1
변수 가리기 shadowing 을 듣고 궁금한점이 생겼습니다.
1
154
1
튜플 구조체에서 println! 사용시 에러가 발생합니다.
0
166
1
메모리 관리규칙에서 질문드립니다.
1
210
1
튜플과 구조체 차이 설명에 관한 질문
0
377
1
튜플과 배열 강의 4:50에서 벡터 나중에 설명해주신다고 하셨는데
0
193
1
trait를 인자로 받을 때 &impl과 &dyn차이
1
365
2
구조체는 언제나 Heap에 저장되나요??
2
418
2
혹시 어떤 폰트일까요?
0
457
2
build 오류
0
403
1
웹 어플리케이션 개발에도 잘 사용되나요?
1
458
1
임대값의 수명 강의가 재생이 안되고 있습니다~
0
413
3
임대값의 수명에 대한 강의는 언제쯤 볼 수 있을까요?
0
350
2
문자열 리터럴이 너무 어려워요ㅠㅠ
1
556
1
Integer는 자동으로 copy되서(copy type)(integer 는 stack에 할당되서)
0
367
2
명령어를 입력 한 후 source "$HOME/.cargo/env" 이 명령어를 입력해야 합니다.
0
337
2

