더북(TheBook)

3.7.1 람다 표현식의 유효 범위


람다 표현식 바디의 유효 범위는 중첩 블록의 유효 범위와 같기에 이름 충돌(name conflicts) 규칙과 이름 가리기(shadowing) 규칙이 똑같이 적용된다. 그러므로 람다 안에 지역 변수와 이름이 같은 매개변수나 다른 지역 변수를 선언하는 것은 규칙에 어긋난다.

int first = 0;

Comparator<String> comp = (first, second) -> first.length() - second.length();

    // 오류 - first 변수를 이미 정의했다.


메서드 안에 이름이 같은 두 지역 변수를 함께 둘 수 없다. 따라서 람다 표현식에도 이름이 같은 지역 변수를 두 개 둘 수 없다.

‘같은 유효 범위’ 규칙의 또 다른 결과로, 람다 표현식 안에 있는 this 키워드는 해당 람다 표현식을 생성하는 메서드의 this 매개변수를 의미한다. 다음 예를 살펴보자.

public class Application() {

    public void doWork() {

        Runnable runner = () -> { ...; System.out.println(this.toString()); ... };

        ...

    }

}


표현식 this.toString()Runnable 인스턴스가 아니라 Application 객체의 toString 메서드를 호출한다. 람다 표현식 안에서 this를 사용한다고 해서 특별한 것은 없다. 람다 표현식의 유효 범위는 doWork 메서드 안에 중첩되므로, this는 이 메서드 내부의 어디에서든 의미가 같다.

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