더북(TheBook)

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번 출력한다.


 

이제 람다 표현식 내부에 있는 counttext 변수를 보자. 이 변수들은 람다 표현식 안에 정의되어 있지 않다는 점을 주목하기 바란다. 두 변수는 repeatMessage 메서드의 파라미터 변수다.

이 부분을 생각해보면 여기서 뭔가 불분명한 일이 일어나고 있다. 람다 표현식의 코드는 repeatMessage 메서드 호출이 리턴하여 파라미터 변수들이 사라지고도 한참 후에 실행될 수도 있다. 그런데 textcount가 어떻게 남아 있을까?

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.