[Java] 람다식 ②
[ 클래스 멤버와 로컬 변수 사용 ]
람다식의 실행 블록에는 클래스의 멤버(필드와 메소드) 및 로컬 변수를 사용할 수 있다.
클래스의 멤버는 제약 사항 없이 사용 가능하지만, 로컬 변수는 제약 사항이 따른다.
1. 클래스의 멤버 사용
람다식 실행 블록에는 클래스의 멤버인 필드와 메소드를 제약 사항 없이 사용할 수 있다. 하지만 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
2. 로컬 변수 사용
람다식은 메소드 내부에서 주로 작성되기 때문에 로컬 익명 구현 객체를 생성시킨다고 봐야 한다. 람다식에서 바깥 클래스의 필드나 메소드는 제한 없이 사용할 수 있으나, 메소드의 매개 변수 또는 로컬 변수를 사용하면 이 두 변수는 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
[ 참고자료 ]
이것이 자바다 책
Author And Source
이 문제에 관하여([Java] 람다식 ②), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mmy789/Java-람다식-2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)