mm Home

Java 8 - 람다 표현식 본문

개발/Java

Java 8 - 람다 표현식

jess_m 2017. 8. 10. 19:14

앞에서 변화하는 요구사항에 효과적으로 대응하는 코드 구현 방법을 살펴보았다.

람다 표현식을 어떻게 만드는지, 어떻게 사용하는지, 어떻게 간결하게 만들 수 있는지 살펴본다.



람다란 무엇인가?

익명함수를 단순화한 것이라고 할 수 있다. 

람다는 세 부분으로 이루어져 있다. 파라미터 리스트, 화살표, 바디.

 

아래의 람다 표현식을 살펴보자.

(Apple a1, Apple a2)  : 파라미터 부분
->  : 화살표 (파라미터와 람다 바디의 구분)
 log.debug("a1 : {}, a2 : {}", a1.getWeight(), a2.getWeight())   : 바디



람다식은 parameters를 받고, statement를 실행하는 간단한 구조이다.

(parameters) -> { statements; } 


위의 구문을 보면 이런 특징이 있다.

  • 접근 제어자가 없다. (public, private)
    → 클래스 외부에서 실행될 일이 없으니 무조건 private !
  • Return Type이 없다.
    → Type 추론에 의해 Return Type을 컴파일러가 추론해버린다. Generic Type Inference 참고
  • Return 이 없다.
    → 마지막 실행되는 줄이 return.
  • Method명이 없다.
    → 익명 함수이기 때문에 당연히 이름이 없다.

함수에 저런 특징을 적용시키면 람다로 변환할 수 있다. 계속 사용해보아야 감이 오는 것 같다 :)






Functional Interface

설명하자면 메소드가 1개만 있는 인터페이스이다.

람다의 Translation 전략을 보면, InvokeDynamic을 통해 함수형 인터페이스(functional Interface)로 컨버팅된다.

함수형 인터페이스로 컨버팅 되기 때문에 동작파라미터화가 가능한 것이다. 구현한 람다와 method signature를 가지는 Functional Interface를 사용하면 된다.

자바에 Function, Predicate, Consumer, Runnable, Supplier 등 기본 지원해주는 함수형 인터페이스가 있다. (굳이 나열할 필요가 없으니 적지 않겠다.) 기본 지원해주는 함수형 인터페이스가 없다면 직접만들면 된다.


위와 같이 사용이 가능하다. 

@FunctionalInterface 어노테이션은 자바에서 지원해주는 어노테이션으로, 해당 인터페이스에 메소드가 2개 이상일 경우에는 컴파일 단계에서 에러가 발생해도록 해준다. 람다 사용시 명시적으로 써주는게 좋겠다.




'개발 > Java' 카테고리의 다른 글

Java - static  (0) 2017.09.06
Java 8 - Stream  (0) 2017.08.11
Java 8 - Lambda Translation  (0) 2017.08.10
Java 8 - 동작 파라미터화  (0) 2017.08.10
Java 8  (0) 2017.08.10
Comments