프로그래밍 언어/Java

[Java] 람다 식

happy_life 2022. 7. 5. 12:00

람다 식

 

 

람다식이란?

메서드를 하나의 식(expression)으로 표현한 것이다. 람다식은 함수를 간략하게 표현할 수 있게 해준다. 이름과 반환값이 없어지므로, "익명 함수"라고도 한다.

 

 

람다식 장점

 간략하게 표현해준다는 것 외에도 많은 장점이 있다. 자바에서 모든 메서드는 클래스에 포함되어야 하므로, 메서드를 사용하려면 클래스를 만들고, 객체를 생성해 메서드를 호출한다. 하지만 람다식을 활용하면 그러한 과정을 생략하고, 람다식으로 메서드의 역할을 할 수 있다.

 

또한 람다식은 메서드의 매개변수로 전달될 수 있고, 메서드의 결과로 반환될 수도 있다. 람다식으로 인해 메서드를 변수처럼 다루는 것이 가능해진 것이다.

 

 

람다식 작성하는 방법

 

1. 메서드의 이름을 지우고 방향표를 넣는다.

람다식 1단계

 

 

 

2. {} 안의 문장이 하나라면 {}을 생략할 수 있다. 또한 형을 추론할 수 있는 경우 생략가능하다.(형 추론은 대부분 가능하므로 생략을 많이 함)

람다식 2단계

 

 

람다식 활용 예제

람다식 사용 전 코드 예제

public class LambdaEx1 {
    public static void main(String[] args) {
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hello!");
            }
        });
    }
}

 

 

 

람다식 사용 후 코드 예제

public class LambdaEx1 {
    public static void main(String[] args) {

        Thread thread = new Thread(() -> {
            System.out.println("hello!");
        });
    }
}

 

코드 설명

람다는 익명이므로 이름(run)을 지워 ()가 되었다.

출력 코드인 hello을 작성해주었다.

 

 

Q) 메서드만 이렇게 구현이 가능한가?

모든 메서드는 클래스에 포함되어야 하므로 클래스도 새로 만들어,객체도 생성해야 한다. 하지만 람다식은 이 모든 과정 없이 오직 람다식 자체만으로도 메서드의 역할을 대신할 수 있다.

 

하지만 자바에서 모든 메서드는 클래스에 포함되어야 한다.  사실 람다식 또한 클래스(정확히는 인터페이스) 안에 포함되어 있다. 도대체 어떻게 된 일일까? 아래의 함수형 인터페이스 설명과 함께 이해해보자. 결론부터 말하면, 람다식은 함수형 인터페이스의 익명 객체이다.

 

 

함수형 인터페이스

 

함수형 인터페이스의 정의

함수형 인터페이스는 추상 메서드가 하나인 인터페이스를 뜻한다.

함수형 인터페이스

 

위와 같은 함수형 인터페이스가 있다고 하자. 이를 구현한 익명 클래스 객체는 아래와 같이 생성할 수 있다.

익명 클래스로 구현

 

이를 람다식을 활용하여 아래와 같이 바꿀 수 있다.

람다식 활용해 구현

 

new 연산자를 활용한 익명 클래스를 만드는 부분을 생략하고, 함수 부분만 구현해준 것이다.  이처럼 가능한 이유는 람다식도 실제로 익명 객체이고, MyFunction을 구현한 익명 객체의 메서드 min()과 람다식의 매개변수 타입과 개수 반환값이 일치하기 때문이다.  실제로 앞서 봤던 Thread 예제에서도 FunctinalInterface인 것을 알 수 있다.

Thread 예제 복기

 

앞선 예시에서도 Runnable 함수형 인터페이스 객체를 람다식으로 직접 구현한 것이다. 앞서 Q) 메서드만 이렇게 구현이 가능한가? 에 대한 대답을 이제는 말할 수 있다.

답: 메서드처럼 보이는 함수형 인터페이스의 익명 객체를 인자로 넣어주었기 때문이다.

 

함수형 인터페이스의 형변환

함수형 인터페이스로 람다식을 참조할 수 있다. 하지만 그렇다고 람다식의 타입이 함수형 인터페이스의 타입과 정확히 일치하는 것은 아니다. 람다식은 익명 객체라 타입이 없기 때문이다. 그래서 대입 연산자의 양변 타입을 일치시키기 위해 아래와 같이 형변환이 필요하다.

 

형변환

하지만 이러한 형변환은 생략이 가능하다. 

 

한편, 람다식은 객체임에도 불구하고 Object 형으로 직접 형변환할 수 없다. 오직 함수형 인터페이스로만 형변환이 가능하다.