JAVA 람다식 개념 및 정리

Noahddd·2024년 10월 29일

JAVA

목록 보기
11/12

공부의 정리 및 복습을 위한 기록입니다.

이번에는 자바의 컬렉션 프레임 워크와 스트림 클래스를 잘 사용하기 위한 조건인 람다식에 대해서 정리를 해보려고한다.
컬렉션 프레림 워크와 스크림 클래스를 사용하는데 있어서 람다식이 필수는 아니다 하지만 잘 사용하기 위해서는 필수적인 것 같다.
일반 적인 for 문이나 if 문에서에 비해는 데이터 처리 속도나 성능이 느릴 수도 있다. 하지만 적절한 람다식 사용은 성능과 간결한 코드를 모두 잡을 수 있다.

람다식이란 메서드를 하나의 식으로 표현한 것이며 익명함수 라고도 한다.
익명함수라고도 불리는 이유는 람다식을 적용하면 메서드는 이름과 반환값이 없어진다.

기본적인 구조를 보도록 하자

(매개변수) -> {로직} 

람다식의 기본 구조는 위와같다.

이렇게만 보면 이해하기 어려우니 예제 코드를 보며 비교를 해보려한다.

    public int add(int a, int b) {
        return a + b;
    }
    
    (int a, int b) -> {return a + b};

위는 우리가 평소 보던 메서드의 형식이다.
위 메서드를 람다식으로 바꾸면 아래와 같이 쓸 수 있다.
자바는 매개변수 타입과 리턴타입의 타입이 추론이 가능하다면 타입을 생략해도 된다.

(a, b) -> {return a + b};

와 같은 형태가 되며, 중괄호와 리턴 또한 생략을해도 가능하다. 그렇다면 최종적으로 아래와 같은 형태로 쓸 수 있다.

(a, b) -> a + b;

이제 간단한 구조와 코드를 알아봤으니 바로 코드를 치며 연습을 하려한다.


뭔가 앞에서 정리한대로 람다식을 잘 쓰고 실험을 해보려 했지만 바로 컴파일 에러가 생긴다.
이는 람다식은 익명 구현 객체를 생선하는 방식이다. 메서드를 대체하는 것이 아닌 함수적 인터페이스(Functional Interface)를 구현하는 익명객체인 것이다.

함수적 인터페이스란 추상메서드 1개만 정의된 인터페이스이다.
람다식은 함수적 인터페이스에 정의된 추상메서드를 구현하는 구현 객체이다.
그렇기 때문에 먼저 람다식을 사용하려면 함수적 인터페이스가 필요하다. 이 내용에 대하여는 밑에서 정리 하도록 하겠다.

    public static void main(String[] args) {
        Myadd r = (x, y) -> x + y;
        int i = (r.r(3, 2));
        System.out.println(i);
    }

    @FunctionalInterface
    interface Myadd {
        int r(int x, int y);
    }
}

위와 같이 Myadd라는 인터페이스를 정의하여 실행하면 정상적으로 5가 출력되는 것을 볼 수 있다.

이제 다시 함수적 인터페이스에 대하여 정리를 해보록 하려고 한다.

먼저 자바에서 제공하는 함수적 인터페이스는

  • Predicate
  • Function<T, R>
  • Consumer
  • Supplier
  • UnaryOperator
    등 이외에도 여러 함수적 인터페이스가 존재한다.

또한 위 코드와 같이 @FunctionalInterface 어노테이션을 사용하여 명시적으로 함수적 인터페이스라고 정의할 수 있다.

그렇다면 자바 람다식은 어떤 장,단점이 있으며 언제 사용하는 것이 좋을까?

장점

  • 람다식은 복잡한 코드블록을 간단하게 줄일 수 있어 코드의 간결함이 높아진다.
  • 코드가 짧아지고 변수명과 메서드명을 잘 이용한다면 명확하게 무엇을 처리하는 로직인지 눈에 잘 보여 가독성이 높아진다.
  • 람다식을 사용하면 병렬 처리가 가능하다.

단점

  • for문이나 Iterator와 다르게 어디서 예외가 발생했는지 추적이 어려워 디버깅하기가 힘들다.
  • 타 반복문이나 조건문에 비하여 성능적으로 떨어질 수 있다.
  • 람다식의 무분별한 사용은 코드의 가독성이 오히려 떨어지기 때문에 보기가 힘들 수 있다.

위와 같은 장점과 단점이 있으며, 람다식은
스트림 클래스와 같이 사용하거나 특정 로직을 함수적 인터페이스로 정의하고, 람다식으로 구현한다면 명확하게 코드를 알 수있다.

이번에는 람다식의 아주 기본적인 내용을 정리해보았다. 다음에는 람다식과 아주 잘 어울리는 스트림 클래스에 대하여 정리하고, 스트림 클래스와 컬렉션 프레임워크를 아주 "잘" 이용할 수 있는 응용을 더 공부하고 정리 해보도록 하려고한다.

공부하며 정리와 복습을 위해 저장한 기록입니다. 틀린 부분 및 개선할 부분이 있다면 알려주시면 감사하겠습니다 !

profile
꿈이 많은 개발자 호소인

0개의 댓글