Language/Java

[Java8] 람다란 무엇인가?

devidea 2017. 8. 9. 15:38
Java8의 추가된 큰 기능 중 하나로 람다를 첫번째로 든다. 그러면 람다란 무엇일까? 정리해보자.
람다를 한마디로 표현하면 메서드로 전달할 수 있는 익명 클래스를 단순화한 표현식이다.

익명클래스(anonymous class)는 무엇인가?
익명클래스는 이름이 없는 로컬 클래스 입니다. 익명 클래스는 new 연산자를 사용하여 하나의 간결한 표현식으로 정의되고 인스턴스화된다.
로컬 클래스는 Java 코드 블럭이지만 익명클래스는 표현식이므로 메서드 호출과 같은 표현식의 일부로 포함될 수 있다.
아래 코드를 살펴보면 Thread를 생성할 때, 파마미터로 익명클래스를 생성해서 전달함을 볼 수 있다.

public class ThreadTest {
    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world");
            }
        }).start();
    }
}


람다식을 설명하기 전에 익명클래스를 람다식으로 바꾼 코드를 먼저 살펴보자.


public class ThreadTest {
    public static void main(String[] args) {
        new Thread(() -> {
            System.out.println("hello lambda");
        }).start();
    }
}

람다식 문법은 다음과 같이 세 부분으로 이루어진다.

  • 파라미터 리스트
  • 화살표 : 파라미터 리스트와 바디의 구분
  • 람다의 바디 : 람다의 반환값에 해당하는 표현식


그러면 어떻게 람다식으로 표현을 줄일 수 있었을까? 다음 2가지 추론 방법으로 이루어진다.
  • 대상 타입 추론
    • 대상 타입은 함수형 인터페이스(추상 메서드가 1개인 인터페이스)를 통해 추론이 가능해진다.
  • 매개변수 타입 추론

매개변수 타입 추론에 의해 생략 유/무를 할 수 있으며, 람다 바디의 구문의 한 줄 일경우 중괄호의 생략 및 return의 생략도 가능하다.
그래서 아래와 같은 다양한 표현식으로 람다를 쓸 수 있다.

(int n, String str) -> { return str + n; }
(int n, String str) -> str + n
(n, str) -> str + n
str -> str + 1
() -> “Hello, World!”
()  -> {}


[참고]
자바 8 람다의 이해와 의미 : https://www.slideshare.net/gyumee/java-8-lambda-35352385

자바 8 인 액션 


반응형