람다식의 실행 블록에는 클래스의 멤버(필드와 메소드) 및 로컬 변수를 사용할 수 있다.
클래스의 멤버는 제약 사항 없이 사용 가능하지만, 로컬 변수는 제약 사항이 따른다.
람다식 실행 블록에는 클래스의 멤버인 필드와 메소드를 제약 사항 없이 사용할 수 있다. 하지만 this
키워드를 사용할 때에는 주의가 필요하다.
this
는 익명 객체의 참조이지만, this
는 내부적으로 생성되는 익명 객체의 참조가 아니라 람다식을 실행하는 객체의 참조이다.다음 예제는 람다식에서 바깥 객체와 중첩 객체의 참조를 얻어 필드값을 출력하는 방법을 보여주고 있다.
중첩 객체 Inner
에서 람다식을 실행했기 때문에 람다식 내부에서의 this
는 중첩 객체 Inner
이다.
MyFunctionalInterface
(함수적 인터페이스)@FunctionalInterface
public interface MyFunctionalInterface {
public void method();
}
UsingThis.java
(this
사용)public class UsingThis {
public int outterField = 10;
class Inner {
int innerField = 20;
void method() {
//람다식
MyFunctionalInterface fi = () -> {
System.out.println("outterField: " + outterField);
System.out.println("outterField: " + UsingThis.this.outterField + "\n");
System.out.println("innerField: " + innerField);
System.out.println("innerField: " + this.innerField + "\n");
};
fi.method();
}
}
}
UsingThisExample
(실행 클래스)public class UsingThisExample {
public static void main(String[] args) {
UsingThis usingThis = new UsingThis();
UsingThis.Inner inner = usingThis.new Inner();
inner.method();
}
}
outterField: 10
outterField: 10
innerField: 20
innerField: 20
람다식은 메소드 내부에서 주로 작성되기 때문에 로컬 익명 구현 객체를 생성시킨다고 봐야 한다. 람다식에서 바깥 클래스의 필드나 메소드는 제한 없이 사용할 수 있으나, 메소드의 매개 변수 또는 로컬 변수를 사용하면 이 두 변수는 final
특성을 가져야 한다. 따라서 매개 변수 또는 로컬 변수를 람다식에서 읽는 것은 허용되지만, 람다식 내부 또는 외부에서 변경할 수 없다.
MyFunctionalInterface
(함수적 인터페이스)@FunctionalInterface
public interface MyFunctionalInterface {
public void method();
}
UsingLocalVariable
(Final
특성을 가지는 로컬 변수)public class UsingLocalVariable {
void method(int arg) { //arg는 final 특성을 가짐
int localVar = 40; //localVar는 final 특성을 가짐
//arg = 31; //final 특성 때문에 수정 불가
//localVar = 41; //final 특성 때문에 수정 불가
//람다식
MyFunctionalInterface fi = () -> {
//로컬 변수 읽기
System.out.println("arg: " + arg);
System.out.println("localVar: " + localVar + "\n");
};
fi.method();
}
}
UsingLocalVariableExample
(실행 클래스)public class UsingLocalVariableExample {
public static void main(String[] args) {
UsingLocalVariable ulv = new UsingLocalVariable();
ulv.method(20);
}
}
arg: 20
localVar: 40
이것이 자바다 책