인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

haskell님의 프로필 이미지

작성한 질문수

김영한의 실전 자바 - 중급 1편

지역 클래스 - 지역 변수 캡처3

지역변수와 캡처 변수의 값이 달라지는게 문제인 이유?

해결된 질문

작성

·

106

1

지역클래스가 접근하는 지역 변수는 사실상 final이어야 하고,

그 이유는 '지역 변수의 값과 캡처된 변수의 값이 서로 달라지는 문제가 발생하기 때문' 이라는 것은 이해했습니다!

 

그런데 지역 변수의 값과 캡처된 변수의 값이 서로 달라지는게 왜 문제인가에 대해서 의문이 남아서 질문 드립니다 ㅠㅠ

 

제가 의문을 가지는 부분을 말씀드리면

캡처된 지역변수를 가지고 있는 지역클래스의 인스턴스를 생성 후 사용하는 시점에서는 어차피 원래 지역변수가 있던 스택은 제거된 상태이고,

그래서 값이 서로 같고 다름을 떠나서 아예 없는건데 애초에 동기화 문제 자체를 신경쓸 필요가 없는것 아닌가요??

답변 2

3

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. haskell님

원래 지역 변수의 라이프사이클(스택에 있었다가 사라짐)과 지역 클래스가 사용하는 복사된 값의 라이프사이클이 다르므로, 둘을 동시에 ‘변경 가능한 상태’로 두면 코드 이해가 어려워지고 버그 위험이 커집니다.

따라서, 자바는 해당 변수의 값이 불변하다는 것을 강제(사실상 final) 함으로써

“복사본”과 “원래 값”이 서로 달라지는 문제가 없도록 하고,

사용자가 로컬 클래스가 사용하는 변수가 ‘고정된 한 값’이라는 확신을 가질 수 있게 만듭니다.

결국 이 제약은, “이게 꼭 안 되면 안 되는가?”보다는 “분산된 두 값이 계속 달라지는 혼동과 버그를 언어 차원에서 예방”하는 쪽을 택한 설계상의 결정이라고 볼 수 있습니다.

감사합니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.
haskell님, 질문 주셔서 감사합니다.

지역 클래스가 접근하는 지역 변수가 사실상 final이어야 한다는 규칙은 특정한 이유 때문입니다. 지역 변수와 캡처된 변수의 값이 서로 달라지는 것은 다음과 같은 문제를 일으킬 수 있습니다.

  1. 값의 불일치: 지역 클래스의 인스턴스가 생성된 이후에 지역 변수의 값이 변경되면, 지역 클래스의 인스턴스는 변경 이전의 값을 사용하게 됩니다. 이는 프로그래머가 의도한 값과 실제로 동작하는 값에 차이가 생길 가능성을 만듭니다.

  2. 변경 불가능: 자바에서는 람다 및 익명 클래스가 후자에서 변수를 캡처하기 때문에, 이들이 참조하는 지역 변수는 변경할 수 없습니다. 이는 기본적으로 일관성을 유지하기 위해서입니다.

  3. 메모리 유지: 지역 클래스가 사용되는 시점에 해당 지역 변수가 스택에서 제거된 상태라고 말씀하신 것은 맞습니다. 하지만, 지역 클래스 내부에서 참조하고 있는 캡처 변수는 스택이 아닌 별도의 새로운 메모리 공간에 복사되며, 언제든지 접근이 가능하기 때문에, 동기화 문제 및 값의 갱신 문제가 발생하지 않아야만 합니다.

따라서 캡처된 지역 변수는 변경될 수 없도록 설계되어 있어, 지역 클래스의 동작을 더욱 예측 가능하게 만듭니다.

이해를 돕기 위해 다음의 공식 문서를 참고하시길 바랍니다:
Spring Data JDBC - Reference Documentation

도움이 되셨길 바랍니다! 추가로 궁금한 점이 있으면 언제든지 질문 주세요.

haskell님의 프로필 이미지

작성한 질문수

질문하기