06
변수 유효 범위
종종 람다 표현식에서 해당 표현식을 감싸고 있는 메서드나 클래스에 있는 변수에 접근하고 싶을 때가 있다. 다음 예제를 고려해보자.
public static void repeatMessage(String text, int count) {
Runnable r = () -> {
for (int i = 0; i < count; i++) {
System.out.println(text);
Thread.yield();
}
};
new Thread(r).start();
}
그리고 다음 호출이 있다고 하자.
repeatMessage("Hello", 1000); // 별도의 스레드에서 Hello를 1,000번 출력한다.
이제 람다 표현식 내부에 있는 count와 text 변수를 보자. 이 변수들은 람다 표현식 안에 정의되어 있지 않다는 점을 주목하기 바란다. 두 변수는 repeatMessage 메서드의 파라미터 변수다.
이 부분을 생각해보면 여기서 뭔가 불분명한 일이 일어나고 있다. 람다 표현식의 코드는 repeatMessage 메서드 호출이 리턴하여 파라미터 변수들이 사라지고도 한참 후에 실행될 수도 있다. 그런데 text와 count가 어떻게 남아 있을까?