람다식

  • 람다식이란?
    • 함수를 하나의 식으로 표현한 것
    • 메소드의 이름이 필요없기 때문에 익명 함수의 한 종류
    • 함수처럼 작성하지만 익명 구현 객체를 생성하는 방식으로 구동
    • 병렬처리, 이벤트 처리와 같은 함수적 프로그래밍에서 쓰임
    • 함수형 인터페이스의 인스턴스를 생성해 함수를 변수처럼 선언
    • 람다식으로 선언된 함수는 일급 객체로 Stream API의 매개변수로 전달 가능
  • 람다식은 함수형 인터페이스에 사용 가능
  • 람다식 실행시 인터페이스 구현 객체(익명 구현 객체) 생성
// Lambda ex)
(매개변수1, 매개변수2 ...) -> {실행문 ...}

() -> { 
    System.out.println("Hello"); 
};
  • 람다식 장점
    • 불필요한 반복문 삭제, 복잡한 식 단순화를 통해 코드가 간결, 가독성이 높아짐
    • 지연연산을 수행함으로 불필요한 연산을 최소화
    • 멀티 쓰레드를 활용한 병렬처리 용이
  • 람다식 단점
    • 람다식의 호출이 까다로움
    • 람다 stream 사용시 단순 반복문을 사용하면 성능이 떨어짐
    • 불필요하게 남발하면 오히려 가독성이 떨어짐
    • 람다를 사용해 만든 함수는 재사용이 불가
    • 재귀 형태로 만들 경우 부적합

함수형 인터페이스(functional interface)

  • 함수형 인터페이스 정의
    • 구현해야할 추상 메서드가 하나인 인터페이스
  • 함수를 변수처럼 선언 가능
  • 간결한 코드 작성 가능
  • 람다식으로 생성된 순수 함수는 함수형 인터페이스로만 선언이 가능
// 함수형 인터페이스 어노테이션
@FunctionalInterface
public interface Calculation {
    int cal(int a, int b);
}

public class Main {
    public static void main(String [] args) {
        //람다식을 함수형 인터페이스 타입 변수에 대입
        Calculation calc = (a, b) -> a * b;
        System.out.println(calc.cal(10,11)); // 110 출력
    }
}

  • "@FunctionalInterface" 어노테이션
    • 함수를 일급 객체처럼 다룰수 있게 해주는 어노테이션
    • 인터페이스에 선언해 단 하나의 추상 메서드만 갖도록 제한하는 역할
    • 2개 이상의 메서드가 선언되면 컴파일러를 통해 오류 발생

표준 API 함수형 인터페이스

java.util.function 표준 API 패키지 함수형 인터페이스
이름매개 변수 리턴값메서드 형태
ConsumerOX void accept(T t)
SupplierXO T get()
FunctionOO R apply(T t)
OperatorOO T apply(T t)
PredicateOO boolean test(T t)
  • Consumer 함수형 인터페이스
    • 역할 - 소비자
  • Supplier 함수형 인터페이스
    • 역할 - 생산자
  • Function 함수형 인터페이스
    • 역할 - 매핑(타입 변환)
  • Operator 함수형 인터페이스
    • 역할 - 매개 변수 계산해서 동일 타입으로 반환
  • Predicate 함수형 인터페이스
    • 역할 - 매개 변수 확인해서 boolean 값 반환

메서드 참조(Method Reference)

  • 메서드 참조란?
    • 함수형 인터페이스를 람다식이 아닌 일반 메서드를 참조시켜 선언하는 방법
    • 람다식이 단 하나의 메서드만 호출하는 경우, 해당 람다식에서
      불필요한 매개변수를 제거하고 사용
    • 함수형 인터페이스 매개변수 타입, 개수, 반환형과
      일반 메서드의 매개변수 타입, 개수, 반환형이 모두 일치해야함
    • 일반 메서드, static 메서드, 생성자 모두 참조 가능
    • 클래스 명::메서드 명 or 참조변수명::메서드 명으로 참조
    • 메서드를 호출하는 것이 아닌 참조
// Method Reference ex)
@FunctionalInterface
public interface MathInterface { // 함수형 인터페이스
    // 정수형 반환, 정수형 매개 변수 2개인 추상 메서드
    int get(int a, int b);
}

public class Main {
    public static void main(String [] args) {
        // 람다식 표현 방식
        MathInterface i = (a,b) -> Math.max(a,b);

        //메서드 참조 방식
        /* Math 클래스의 max()과 MathInterface get()의 
        반환 타입, 매개 변수 타입, 개수가 동일하기에 참조 가능 */
        MathInterface i = Math::max;

        System.out.println(i.get(5,6));
    }
}

Leave a comment