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 - 람다 표현식  (2) 2017.08.10
Java 8 - 동작 파라미터화  (0) 2017.08.10
Java 8  (0) 2017.08.10
2 Comments
  • 프로필사진 모찌는공부중 2017.09.13 19:16 람다에 대해 처음 공부중입니다~

    이 글을 읽으니 전보다 표현이 더 편해진다는건 알겠네요.

    근데 혹시 포문을 돌릴때나, list를 사용할때 기존과 크게 차이점이 있을까요?
  • 프로필사진 사용자 jess_m 2017.09.13 23:38 신고 안녕하세요.
    stream 과 for문에 대한 차이점이라고 한다면, 다른 블로그에 자세히 설명된 글이 있어서 이 걸 참고하시면 좋을듯 합니다^^
    http://homoefficio.github.io/2016/06/26/for-loop-를-Stream-forEach-로-바꾸지-말아야-할-3가지-이유/

    collection 에 대한 단순 반복 작업이라면 for문이 좋을것 같습니다
    위 블로그에서 링크걸려있는 아티클을 보면 요소를 접근할 때 for문은 인덱스 기반의 메모리 접근을 하기 때문에 빠르고, stream은 iterator를 통해 요소를 접근해야하기 때문에 오버헤드가 있다고 하네요.

    답변이 되었으면 좋겠습니다.
댓글쓰기 폼