[Java] 람다식 이해하기

람다란 익명 함수(이름이 없는 함수)를 말하는데, 자바에서의 람다식 표현법과 활용되는 예를 정리했다.

 

 

람다식

 

 람다식은 이름이 없는 함수를 의미하는데, 즉 함수를 하나의 식으로 표현하는 방법이다. 가장 간단한 람다식은 다음과 같이 표현할 수 있다.

여러개의 파라미터를 갖는 익명함수 표현

 

이때 expression은 바로 return값이 나와야 한다. 예를 들면

public String getName() {
  return "name";
}
() -> "name"

과 같이 바로 리턴값이 나와야 한다.

 

만약 다양한 변수나 선언문, 배정문등을 쓰기 위해서는 중괄호를 사용해주면 된다.

 

이러한 람다식은 불필요한 코드를 줄이고, 가독성을 높이기 위해서 사용될 수 있다.

 

 

 

 

함수형 인터페이스

 

 배열을 정렬하는 Arrays.sort() 함수에서 사용되는 예를 보자.

Integer[] arr = {1,2,3,4};

//without Lambda
Arrays.sort(arr, new Comparator<Integer>() {
    @Override
    public int compare(Integer i1, Integer i2) {
        return i2 - i1;
    }
});

//람다를 사용해서 표현하기
Arrays.sort(arr, (i1, i2) -> i2-i1);

배열을 내림차순으로 정렬하는 코드이다. Arrays.sort함수의 두 번째 인자로는 Comparator<? super T> 타입 변수가 들어가는데, 여기서 어떻게 Comparator<>타입 객체 대신 익명함수가 왔을까?

 

이 java.util.Comparator는 내부의 compare함수가 아직 구현되지 않은 함수형 인터페이스이다. 함수형 인터페이스란 내부에 1개의 추상메소드가 선언되고, @FunctionalInterface 어노테이션이 붙은 인터페이스를 말한다.

 

 

이러한 함수형 인터페이스는 람다를 이용하여 표현할 수 있는데, 함수형 인터페이스 내의 구현되지 않은 1개의 추상 메소드를 람다로 표현해서 넘겨주면 된다.

 

자바에는 이러한 Comparator 외에도 여러가지 함수형 인터페이스들이 있는데(직접 정의해서 사용하는 경우는 거의 없다고 한다), 다른것들은 사용하게 되면 추가해놔야겠다.