Open dpwns523 opened 1 year ago
우선 답변에 앞서 여러 변수의 저장 위치와 스레드 간 변수 접근에 대해 설명드리겠습니다. 선언 위치에 따른 변수는 아래 표처럼 클래스 변수, 인스턴스 변수, 로컬 변수가 있습니다.
클래스 변수 | 인스턴스 변수 | 로컬 변수 |
---|---|---|
메서드 영역에 생성 | 힙 영역에 생성 | 스택 영역에 생성 |
이 중 메서드 영역과 힙 영역은 스레드 간 공유되는 영역이지만, 스택 영역의 경우에는 스레드 간 공유되지 않는 영역입니다. 하지만 람다식의 경우에는 한 스레드에서 만들어진 람다식을 다른 스레드에서도 사용할 수 있습니다. 이러한 다른 스레드의 람다식에서 로컬 변수에 접근하기 위해서는 람다 캡쳐링이라는 방법이 필요합니다. 람다 캡쳐링이란 다른 스레드의 사용하려는 로컬 변수를 복사하여 복제본을 만들어 사용하는 방법입니다. 그런데 만약 원본의 값이 바뀐 상태에서 복제본을 사용하는 상황이 발생할 수도 있습니다. 이러한 상황을 동시성 문제라 부르며, 해당 상황을 막기 위해 원본 변수인 로컬 변수를 바뀌지 않는 final로 선언하여 스레드를 동기화 시켜주는 것 입니다. 또한 final 뿐만 아니라 선언과 초기화 후 한번도 참조되지 않은 변수인 effectively final 변수도 람다식에서 사용이 가능합니다.
문제
contents - 세부 내용
람다를 사용하다보면 가끔 겪는 일로 변수를 전달하는데 람다 표현식에 사용되는 변수는 final이어야 한다는 에러를 만날 때가 있습니다. 왜 그런지 내부 동작을 이해해보면서 이야기해보면 좋을 것 같아요!
참고
Chapter3 p113, 114