본문 바로가기

Programming/JAVA

람다식(3) - 클래스 멤버, 로컬 변수의 사용 2

java logo image

 

 

 

자, 이번 시간에는 새롭게 배우는 내용이 아니라 - 지금까지 학습해 왔지만 분명 50% 이상의 확률로 잊어버렸을 내용을 상기하는 대목입니다. 이번 아티클이 짧다면, 다 이유가 있습니다. 최소한 두~세 개 아티클을 복습하셔야 하기 때문입니다. 저는 머리가 나쁘기 때문에 계속 반복해서 살펴보도록 하겠습니다. 

 

일단, 람다식을 배우고 실제로 써먹게 되면 (지금은 이해가 안갈수도 있겠지만) 람다식은 대부분 '메서드 내부에서' 사용하게 되는 경우가 많습니다. 그럼 한가지 되짚어 보겠습니다. 우리가 '메서드 내부에서 선언하는 클래스'를 뭐라고 했죠? "로컬 클래스"라고 칭했습니다.

 

그럼 '메서드 내부에서 람다식을 선언한다면?' 이 역시 익명의 클래스 레벨의 객체를 만들어 내는 상황이기 때문에, 익명인 로컬 클래스를 만드는 것과 똑같다고 생각하시면 됩니다. 

 

 

까먹었을게 뻔한, 로컬 클래스의 기본 개념 다시 훑고 가겠습니다.

 

 

중첩 클래스&인터페이스(2) - 중첩 클래스의 종류 2 : 정적 멤버 / 로컬 클래스

앞서서 우리는 살펴본 중첩 클래스의 분류 중, 멤버 클래스의 한 종류인 인스턴스 멤버 클래스를 살펴보았습니다. 중첩 클래스&인터페이스(2) - 중첩 클래스의 종류 1 : 인스턴스 멤버 클래스 중

nozeroslope.tistory.com

 

 

그럼 여기서 하나 중요한 점을 다시 짚고 넘어가겠습니다. 로컬 클래스(여기서는 람다식) 내부에서 바깥 클래스에 있는 필드나 메서드를 사용할 때 문제가 생긴다고 했습니다. 해당 로컬 클래스가 인스턴스를 생성해서 제 기능을 발휘할 때, 바깥 메서드의 데이터를 가져와 사용하게 되면 문제가 되고 - JAVA에서는 이를 해결하기 위해 final 속성을 부여한다고 했습니다. 

 

까먹었을게 뻔하니 final 관련 사항을 다시 훑고 가시겠습니다. 

 

 

 

중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 3 : 로컬 클래스

○ 로컬 클래스에서의 사용 제한 로컬 클래스에서의 여러 멤버들의 사용 제한 규칙에 대해서 살펴보겠습니다. 우선 로컬 클래스에서의 규칙과 관련해서는 인스턴스 멤버 클래스에 비해서 복잡

nozeroslope.tistory.com

 

 

 

중첩 클래스&인터페이스(3) - 중첩 클래스의 접근 제한자 4 : 로컬 클래스

우선 앞의 아티클과 바로 이어지는 내용이니, 가능한 앞의 내용과 연속해서 확인해 보겠습니다. 우리는 특정 메서드 내부의 로컬 클래스가 선언되었을 때, 이 로컬 클래스가 바깥 메서드의 필드

nozeroslope.tistory.com

 

 

이 원칙이 익명 객체에 적용되는 부분까지 살펴보겠습니다. 

 

 

 

중첩 클래스&인터페이스(5) - 익명 객체 7

우리는 앞서 로컬 클래스에서의 사용 제한과 관련해, 로컬 클래스에서 메서드의 파라미터나 로컬 변수를 사용하는 경우의 제약 사항에 대해서 학습했습니다. 잘 기억이 나지 않는다면, 'final' 키

nozeroslope.tistory.com

 

 

 


 

 

사실 람다식이라고해서, 위의 원칙들이 바뀔 것은 특별히 없습니다. 람다식도 로컬 클래스, 로컬 익명 클래스와 마찬가지로 람다식을 포함하고 있는 바깥 메서드의 파라미터나 로컬 변수를 사용하게 되면, 이것들은 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
*/