본문 바로가기

Programming/JAVA

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

java logo image

 

 

 

○ 람다식에서 클래스의 멤버 사용하기

 

람다식의 실행 블록 내부에서 실행문을 작성할 때, 어떤 클래스의 멤버인 필드와 메서드를 사용하는 데는 크게 제약이 없습니다. 단, 주의해야 하는 개념은 [this]의 사용 방식입니다.

 

- 만약 일반적인 익명 객체에서 this를 사용하게 되면, 이것이 의미하는 것은 익명 객체 그 자체를 참조한다는 의미입니다.

- 하지만 람다식에서 this를 사용하면, 익명 객체를 참조하는 것이 아니라 그 람다식을 실행하는 객체를 참조한다는 의미가 됩니다.

 

아래에서 예제를 통해서 살펴보겠습니다. 

 

 

 


 

우선 인터페이스를 선언합니다. 당연히 함수형 인터페이스입니다. 

 

@FunctionalInterface
public interface MyFunctionalInterface {
	public int method();
}

 

그 다음 람다식을 사용하는 클래스 하나를 선언합니다. 실행 클래스에서 사용하게 되며, 이름은 UsingThis입니다. 

 

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);
			};
			fi.method();
		}
	}
}

 

실행 클래스를 다음과 같이 작성합니다. 

 

public class ExampleMain {	
	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
*/

 

중첩 클래스 중 인스턴스 멤버 클래스의 선언 방식은 다음 아티클을 복습하며 상기하도록 합시다(UsingThis의 Inner 클래스 인스턴스 생성 방식)

 

 

중첩 클래스&인터페이스(2) - 중첩 클래스의 종류 1 : 인스턴스 멤버 클래스

중첩 클래스는 '클래스 내부에' 선언되는 클래스입니다. 이때, 이 중첩 클래스는 내부에 선언되는 위치에 따라서 종류가 분류됩니다. 종류는 크게 다음 두 가지가 있습니다. · 멤버 클래스 · 로

nozeroslope.tistory.com

 

 

 

UsingThis 클래스에서 사용한 람다식을 보겠습니다. 람다식에서 필드 값들을 제약 없이 사용한다고 했습니다. 여기서 this를 사용할 때 주의할 점이 나타나죠. innerField라는 필드는 UsingThis 클래스의 중첩 클래스 Inner의 필드입니다. 람다식에서 this.innerField를 사용하게 되면, 이는 익명객체가 아닌 Inner를 참조하게 됩니다. 

 

outterField를 가리키고 싶을 때는 어떻게 할까요? 그냥 this.outterField를 사용한다면, Inner 클래스에 있는 outterField를 가리키는 의미가 되므로 컴파일 에러가 발생합니다. 여기서 UsingThis.this.outterField를 사용해 줌으로써, 바깥 객체의 참조를 얻을 수 있습니다.