Language/Java

Java - 람다식(Lamda Expression)이란 ? (+ 예제)

JaeHoney 2020. 9. 25. 16:54

 

람다식이란 ?

 

람다식익명함수를 표현하는 하나의 표현식입니다. 이는 식별자 없이 실행가능한 함수 즉, 함수를 따로 만들지 않고 코드 한줄에 함수를 써서 그것을 호출하는 방식입니다. Java 8 부터 함수적 프로그래밍(함수 지향)을 위해 람다식을 지원해서 사용하고 있습니다. 이를 이용하면 기존의 익명 객체를 구현하는 방식보다 더 간결하게 코드를 짤 수 있습니다.

 

람다식 사용법

(매개변수, ...) -> { 실행문 ... }

(매개변수, ...)는 오른쪽 중괄호 {} 블록을 실행하기 위해 필요한 값을 제공하는 역할을 합니다. 매개 변수의 이름은 개발자가 자유롭게 지정할 수 있으며 인자타입도 명시해줄 필요가 없습니다. "->" 기호는 매개 변수를 이용해서 중괄호 {}를 실행한다는 뜻으로 해석할 수 있다.

 

+유의사항

 

  • 매개변수의 타입이 추론가능하다면 생략 가능
  • 매개변수가 하나면 소괄호를 생략 가능
  • 실행문이 하나의 명령문인 경우에는 중광호 생략 가능 (세미콜론 x)
  • 실행문이 하나의 return 문이라면 중괄호 생략 불가능
  • return 문 대신 표현식을 사용할 수 있고, 반환값은 결과값이 됨 (세미콜론 x)

람다식 예제

new Thread(new Runnable() { 
        public void run() {
        	System.out.println("Annoymous Thread");
        }
	}).start();

위는 기존의 익명 객체 방식의 쓰레드 동작입니다.

new Thread(()->System.out.println("Lambda Thread")).start();

람다식을 사용하면 기존의 코드를 위처럼 한 줄짜리 코드로 표현할 수 있습니다.

@FunctionalInterface
public interface Test{
    public int plus(int a, int b);
}
 
// ImplementationClass.java
public class ImplementationClass implements Test{
    
    @Override
    public int plus(int a, int b){
        return a + b;
    }
}
 
// Main.java
public class Main{
    public static void main(String[] args){
        Test t1 = new ImplementationClass();
        System.out.println(t1.plus(3, 4));
    }
}

위의 예는 추상메서드를 갖는 인터페이스를 구현합니다. 클래스를 재사용할 수 있다는 장점이 있지만, 재사용할 필요가 없는 메서드의 경우에 위와 같이 코딩하는 것은 불필요한 클래스 파일이 하나 늘어나는 결과를 낳게 됩니다.

public class Main{
    public static void main(String[] args){
        TestInterface t2 = new TestInterface(){
            @Override
            public int plusAandB(int a, int b){
                return a + b;
            }
        }
	System.out.println(t2.plus(3, 4));
    }
}

위처럼 익명 구현객체를 사용하면 불필요한 클래스파일이 생기지 않고 프로그래밍 과정도 간결해집니다.

public class Main{
    public static void main(String[] args){
        TestInterface t3 = (a, b) -> {return a + b;};
        System.out.println(t3.plus(3, 4));
    }
}

이를 람다식으로 표현한다면 위 같이 깔끔하고 간결하게 표현할 수 있습니다.

 

 

마무리

 

람다식 장점

  • 코드를 간결하게 만들 수 있음

  • 개발자의 의도가 명확히 드러남 (가독성)

  • 개발 노력이 비교적 줄어듬

  • 병렬 프로그래밍이 용이함.

람다식 단점

  • 함수 재사용이 불가능

  • 디버깅이 비교적 까다로움

  • 재귀함수에는 부적합

+ 람다식을 사용하기 위한 인터페이스에는 조건이 있는데, 구현해야 하는 인터페이스의 추상 메서드가 단 1개 여야만 람다식을 사용할 수 있습니다(람다식과 인터페이스가 1:1로 연결되기 때문).

 

이외에도 람다식을 위해 지켜야할 규칙이 더 있는데, 이를 개발자들이 일일이 체크하려면 무척 번거로운데 이를 위한 방법이 @FunctionalInterface 애노테이션입니다. 이 애노테이션은 작성한 인터페이스가 구현해야 할 추상 메서드가 하나만 정의된 인터페이스인지를 확인해주는 역할을 합니다. 이를 작성하면 컴파일러가 알아서 에러를 잡아줍니다.