자, 이번 시간에는 새롭게 배우는 내용이 아니라 - 지금까지 학습해 왔지만 분명 50% 이상의 확률로 잊어버렸을 내용을 상기하는 대목입니다. 이번 아티클이 짧다면, 다 이유가 있습니다. 최소한 두~세 개 아티클을 복습하셔야 하기 때문입니다. 저는 머리가 나쁘기 때문에 계속 반복해서 살펴보도록 하겠습니다.
일단, 람다식을 배우고 실제로 써먹게 되면 (지금은 이해가 안갈수도 있겠지만) 람다식은 대부분 '메서드 내부에서' 사용하게 되는 경우가 많습니다. 그럼 한가지 되짚어 보겠습니다. 우리가 '메서드 내부에서 선언하는 클래스'를 뭐라고 했죠? "로컬 클래스"라고 칭했습니다.
그럼 '메서드 내부에서 람다식을 선언한다면?' 이 역시 익명의 클래스 레벨의 객체를 만들어 내는 상황이기 때문에, 익명인 로컬 클래스를 만드는 것과 똑같다고 생각하시면 됩니다.
까먹었을게 뻔한, 로컬 클래스의 기본 개념 다시 훑고 가겠습니다.
그럼 여기서 하나 중요한 점을 다시 짚고 넘어가겠습니다. 로컬 클래스(여기서는 람다식) 내부에서 바깥 클래스에 있는 필드나 메서드를 사용할 때 문제가 생긴다고 했습니다. 해당 로컬 클래스가 인스턴스를 생성해서 제 기능을 발휘할 때, 바깥 메서드의 데이터를 가져와 사용하게 되면 문제가 되고 - JAVA에서는 이를 해결하기 위해 final 속성을 부여한다고 했습니다.
까먹었을게 뻔하니 final 관련 사항을 다시 훑고 가시겠습니다.
이 원칙이 익명 객체에 적용되는 부분까지 살펴보겠습니다.
사실 람다식이라고해서, 위의 원칙들이 바뀔 것은 특별히 없습니다. 람다식도 로컬 클래스, 로컬 익명 클래스와 마찬가지로 람다식을 포함하고 있는 바깥 메서드의 파라미터나 로컬 변수를 사용하게 되면, 이것들은 final 특성을 갖는다는 점이 동일하게 적용됩니다. 이 역시 예시를 통해 살펴보겠습니다.
@FunctionalInterface
public interface MyFunctionalInterface {
public void method();
}
public class UsingLocalVariable {
void method(int arg) {
int localVar = 50;
// arg = 31;
// localVar = 59;
// 람다식
MyFunctionalInterface fi = () -> {
System.out.println("arg: " + arg);
System.out.println("localVar: " + localVar);
};
fi.method();
}
}
public class ExampleMain {
public static void main(String[] args) {
UsingLocalVariable ulv = new UsingLocalVariable();
ulv.method(30);
}
}
/* 출력
arg: 30
localVar: 50
*/
'Programming > JAVA' 카테고리의 다른 글
람다식(4) - 표준 API의 함수적 인터페이스 2 : Consumer Functional Interface (0) | 2023.06.04 |
---|---|
람다식(4) - 표준 API의 함수적 인터페이스 1 (0) | 2023.05.28 |
람다식(3) - 클래스 멤버, 로컬 변수의 사용 1 (0) | 2023.05.18 |
람다식(2) - 람다식의 타겟 타입, 함수적 인터페이스 3 (0) | 2023.05.16 |
람다식(2) - 람다식의 타겟 타입, 함수적 인터페이스 2 (0) | 2023.05.15 |