레알윙 2020. 7. 7. 22:38
반응형

람다

  • (인자 리스트) -> {바디}

 

인자 리스트

  • 인자가 없을 때: ()
  • 인자가 한개일 때: (one) 또는 one
  • 인자가 여러개 일 때: (one, two)
  • 인자의 타입은 생략 가능, 컴파일러가 추론(infer)하지만 명시할 수도 있다. (Integer one, Integer two)

 

바디

  • 화상표 오른쪽에 함수 본문을 정의한다.
  • 여러 줄인 경우에 { }를 사용해서 묶는다.
  • 한 줄인 경우에 생략 가능, return도 생략 가능.

 

변수 캡처 (Variable Capture)

로컬 변수 캡처

  • final이거나 effective final 인 경우에만 참조할 수 있다.
  • 그렇지 않을 경우 concurrency 문제가 생길 수 있어서 컴파일가 방지한다.

 

effective final

  • 이것도 역시 자바 8부터 지원하는 기능으로 “사실상" final인 변수. 
  • final 키워드 사용하지 않은 변수를 익명 클래스 구현체 또는 람다에서 참조할 수 있다.

 

익명 클래스 구현체와 달리 ‘쉐도윙’하지 않는다.

  • 익명 클래스는 새로 스콥을 만들지만, 람다는 람다를 감싸고 있는 스콥과 같다.

 

참고

 

 

예제

public class RunMain {

	public static void main(String[] args) {
		RunMain runmain = new RunMain();

		runmain.run();
	}

	private void run() {
		int baseNumber = 10; // baseNumber가 변경이 더이상 하지 못하면 사실상 final
		

		// 로컬 클래스
		class LocalClass {
			void printBaseNumber() {
				int baseNumber = 12;
				System.out.println("로컬클래스 : " + baseNumber);
			}
		}

		// 익명 클래스
		Consumer<Integer> integerConsumer = new Consumer<Integer>() {
			@Override
			public void accept(Integer baseNumber) {
				System.out.println("익명클래스 : " + baseNumber);
			}
		};

		// 람다
		// run 메소드와 같은 소콥이기 때문에 baseNumber의 변수를 같이 사용한다.
		// i대신에 baseNumber 넣으면 오류

		IntConsumer printInt = (i) -> {
			System.out.println(i + baseNumber);
		};

		
		LocalClass localClass = new LocalClass();
		
		printInt.accept(40);
		integerConsumer.accept(10);
		localClass.printBaseNumber();
	}
}
반응형