inflearn logo
강의

講義

知識共有

エレガントな高性能プログラミング言語Rustの入門と活用

変数と不変性、定数、変数を隠す

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

解決済みの質問

154

cykei

投稿した質問数 2

1

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

webassembly

回答 1

0

hatemogi

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

 

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

 

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

 

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

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

 

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

 

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

 

0

cykei

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

강의 자료 ppt나 pdf 파일은 없을까요?

0

69

1

Rust는 어떻게 컴파일 타임에 dangling reference를 막나요?

0

70

2

강의 추가 계획 질문

0

76

2

혹시 강의 연장 가능할까요? ㅠㅠ

1

73

2

테스트 배포시 에러가 발생합니다.

0

121

2

소유권 이전과 관련된 질문입니다

0

146

2

&r1 을 써야하는지 r1을 써야하는지?

1

120

1

임대값 수명에 대한 질문

1

122

1

튜플 구조체에서 println! 사용시 에러가 발생합니다.

0

166

1

UTF8ToString 인코딩 질문있습니다.

1

185

1

메모리 관리규칙에서 질문드립니다.

1

209

1

튜플과 구조체 차이 설명에 관한 질문

0

377

1

튜플과 배열 강의 4:50에서 벡터 나중에 설명해주신다고 하셨는데

0

192

1

구조체는 언제나 Heap에 저장되나요??

2

418

2

Lifecycle 강의에서 두 문자열 슬라이스를 비교해 긴 문자열 슬라이스를 리턴하는 것 관련 질문

0

268

1

혹시 어떤 폰트일까요?

0

455

2

build system 선택창

1

309

1

build 오류

0

402

1

웹 어플리케이션 개발에도 잘 사용되나요?

1

458

1

임대값의 수명 강의가 재생이 안되고 있습니다~

0

412

3

임대값의 수명에 대한 강의는 언제쯤 볼 수 있을까요?

0

350

2

문자열 리터럴이 너무 어려워요ㅠㅠ

1

555

1

Integer는 자동으로 copy되서(copy type)(integer 는 stack에 할당되서)

0

366

2

명령어를 입력 한 후 source "$HOME/.cargo/env" 이 명령어를 입력해야 합니다.

0

336

2