본문 바로가기
Language/Java

람다식(Lambda Expression) 아주아주 기초 문법

by 돈코츠라멘 2019. 8. 30.

Lambda Expression

람다 표현식은 함수를 간결하게 표현할 수 있다. 프로그래밍 언어의 개념으로는 단순한 익명 함수 생성 문법이라 이해할 수 있다. 기존의 불필요한 코드를 줄이고 가독성을 향상시키는 것이 목적이다.

-> 기호

( parameters ) -> expression body // 하나의 명령문만으로 이루어진 경우에 {} 생략 가능
( parameters ) -> { expression body }

가장 대표적인 예시로 Thread 실행이 있다. 람다식을 사용하지 않는 경우에는 아래와 같이 Runnable 인터페이스를 작성해서 매개변수로 입력해야 한다.

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Run!");
    }
}).start();

하지만 람다식을 사용하면 아래와 같이 간략히 작성할 수 있다.

new Thread(()->{
    System.out.println("Run!");
}).start();

@FunctionalInterface

람다식을 하나의 변수에 대입할 때 사용되는 참조 변수의 타입을 함수형 인터페이스라고 부른다.
예를들어, 아래와 같은 구문을 실행시키고자 할 때,

IMathAbs abs = (int n) -> Math.abs(n);
System.out.println(abs.calc_abs(-4)); // result: 4

IMathAbs라는 인터페이스가 작성되어 있어야 한다.

interface IMathAbs {
    public int calc_abs(int a);
}

이 인터페이스는 calc_abs라는 하나의 추상 메소드를 가지고 있다. 람다식을 위한 인터페이스는 단 하나의 추상 메소드를 가지고 있어야 하기 때문에 여기에 다른 메소드를 추가할 경우 에러가 발생한다. 하지만 구현단계에서는 이 인터페이스가 람다식만을 위해 사용되는 것인지 구별하기 힘들고 오류도 발생하지 않는다. 그래서 해당 인터페이스가 람다식을 위해 사용된다는 것을 표시하기 위해 @FunctionalInterface 어노테이션을 사용한다.

@FunctionalInterface
interface IMathAbs {
    public int calc_abs(int a);
}

그러므로 IMathAbs 인터페이스는 위와같이 작성한다.

:: 기호

ClassName::MethodName
or
VariableName::MethodName

메소드 참조(Method reference)를 위해 사용한다. 메소드 참조는 람다식이 단 하나의 메소드를 호출할 때 불필요한 매개변수를 제거하고 사용할 수 있게 한다.

IMathAbs abs = (int n) -> Math.abs(n); // -> 사용
System.out.println(abs.calc_abs(-4)); // result: 4

IMathAbs abs = Math::abs; // :: 사용
System.out.println(abs.calc_abs(-4)); // result: 4

댓글