Inflearn brand logo image

인프런 커뮤니티 질문&답변

조예인님의 프로필 이미지
조예인

작성한 질문수

우아한 고성능 프로그래밍 언어 Rust 입문 및 활용

변수와 불변성, 상수, 변수 가리기

변수 가리기 shadowing 을 듣고 궁금한점이 생겼습니다.

해결된 질문

작성

·

93

1

shadowning 에서 변수가 가려진다는 것은 기존 변수가 계속 메모리에 남아있다는 이야기인것 같습니다. (스코프를 벗어나면 이전 변수값을 사용할 수 있으니까요) 같은 이름으로 변수를 계속 선언해서 사용하면 사용할 수 없는 변수가 메모리에 계속 자리잡게 될텐데 가비지컬렉터가 없는 rust 에서 이런 변수들은 어떻게 참조 해제를 할 수 있나요?

답변 1

0

김대현님의 프로필 이미지
김대현
지식공유자

안녕하세요 예인님, 수강 및 좋은 질문 감사합니다.

 

해당 내용은, 소유권 이동과 빌림을 듣고 나시면 더 상세히 이해하실 수 있는 내용이라, 해당 주제까지 학습하신 다음에 말씀주시면 그 때 더 상세히 설명드릴게요.

 

미리 설명을 힌트를 조금 드리자면, 변수에 자리잡은 메모리는 러스트가 소유권이라는 개념으로 딱 하나의 변수만 그 메모리를 소유하여 관리를 하고, 그 소유한 변수가 스코프를 벗어나면 해당 메모리가 해제되는 시스템입니다. 이 경우 '변수 가리기'로 어떤 메모리의 값이 다른 새로운 변수로 가려지게 되면, 가림 당한 변수는 이미 소유권을 빼앗긴 꼴이라 더 소유하지 못하고 사용도 못하게 될 터입니다.

 

{
  // 바깥 블록
  let x = 1;
  {
     // 안쪽 블록
     let x = x + 1;
  }
  // 안쪽 블록을 나온 다음에 x 접근 가능한가?
  println!("x = {}", x);
}

학습하신 예제에서 소유권 개념이 아직 나오지 않았는데요, i32같은 타입들은 소유권 이동이 일어나지 않고 Copy가 일어나기 때문에, 가려진 변수나 새로운 변수나 모두 각자 메모리 값을 소유한 상태와 마찬가지이고, 각각 스코프를 벗어날 때 해제되는 상태예요.

 

Copy트레이트로 소유권 복사가 일어나지 않는 변수의 경우에는, 이미 안쪽블록으로 소유권이 넘어갔을 테고, 바깥에서 원래 변수를 쓰려고 하면 이미 소유권이 없기 때문에 더 쓰지 못하는 상황이 될 거예요. 둘 다 쓰고 싶다면, shadowing할 때 clone()을 해서 가져가면 되겠습니다.

 

소유권 강의도 듣고 나서 다시 말씀 부탁드려요.

 

조예인님의 프로필 이미지
조예인
질문자

설명 감사합니다! 변수가 Scalar 타입이면 가려진 변수나 새로운 변수나 모두 스코프를 벗어날때 소멸한다는 말씀이시군요. 이해했습니다!

조예인님의 프로필 이미지
조예인

작성한 질문수

질문하기