람다식이란?

niireymik·2024년 8월 12일

📌 람다식(Lambda Expression)

람다식이란?

람다식은 간단히 말해서 메서드를 하나의 식(expression)으로 표현한 것이다.

자바 8부터 등장한 개념으로 객체지향언어인 자바에 함수형 활용을 더해주었다. 람다식은 메서드의 매개변수로 전달되어지는 것이 가능하고, 메서드의 결과로 반환될 수도 있다. 람다식으로 인해 메서드를 변수처럼 다루는 것이 가능해진 것이다.

메서드를 람다식으로 표현하면 메서드의 이름과 반환값이 없어지므로 람다식을 익명함수라고도 한다.

람다식으로 선언된 함수는 1급 객체이다.
일급 객체(First-class object)는 함수형 프로그래밍에 자주 사용되는 용어로서, 일반적으로 다른 객체들에 적용 가능한 연산을 모두 지원하는 객체를 말한다. 다음과 같은 것들이 가능하면 1급 객체라고 본다.

  • 변수나 데이터 구조 안에 담을 수 있다.
  • 파라미터로 전달할 수 있다.
  • 반환값으로 사용할 수 있다.
  • 할당에 사용된 이름과 무관하게 고유한 구별이 가능하다.

람다식의 장단점

  • 장점
    - 불필요한 코드를 줄여 코드를 간결하게 만들 수 있다.
    - 식에 개발자의 의도가 명확히 드러나 가독성이 높아진다.
    - 함수를 만드는 과정 없이 한 번에 처리할 수 있어 생산성이 높아진다.

  • 단점
    - 람다를 사용하면서 만든 무명함수는 재사용이 불가능하다.
    - 디버깅이 어렵다.
    - 람다를 무분별하게 사용하면 비슷한 함수가 중복 생성되어 코드가 지저분해질 수 있다.
    - 재귀로 만들 경우에 부적합하다.




📌 람다식 작성법

람다식의 기본 형태는 메서드에서 이름과 반환타입을 제거하고 매개변수 선언부와 몸통{} 사이에 ->를 추가한 것이다.

// 일반형
int sum(int a, int b){
	return a+b;
}

// 람다식
(a, b) -> { a+b }
  1. 기본 구조 : (매개변수 목록) -> {실행문;}

    • 매개변수 목록 : 람다식이 받아들이는 매개변수들을 괄호 안에 정의한다. 매개변수의 타입은 생략 가능하며, 컴파일러가 문맥을 통해 유추한다.
    • 화살표 : 매개변수와 람다식의 몸체를 구분한다.
    • 실행문 : 실제 람다식이 수행할 코드 블록이다.
  2. 매개변수

    • a -> a*a 매개변수가 하나인 경우, 매개변수를 감싸는 괄호를 생략할 수 있다.
    • (int a) -> a*a 단, 타입을 명시하는 경우는 괄호를 생략할 수 없다.
    • () -> System.out.println("Hello") 매개변수가 없는 경우, 빈 괄호를 사용한다.
  3. 실행문

    • (a, b) -> a+b실행문이 단일 문장인 경우 중괄호 {}를 생략할 수 있다. 그 문장이 값을 반환하는 경우 return 키워드도 생략할 수 있다.
    • 실행문이 여러 문장이 경우는 중활호 {}의 생략이 불가하며, 반환값이 있는 경우 return 키워드를 명시해야 한다.
  4. 반환값

    • 람다식에서 값을 반환해야 하는 경우, return 문을 사용한다. 단일 실행문만 있는 경우 return과 중괄호 {}를 생략할 수 있다.
  5. 타입 추론

    • 람다식의 매개변수 타입은 생략 가능하다. 컴파일러가 매개변수의 타입을 문맥상 유추할 수 있기 때문이다.
  6. 함수형 인터페이스

    • 람다식은 함수형 인터페이스의 구현체로 사용된다. 함수형 인터페이스는 오직 하나의 추상 메소드를 가진 인터페이스를 말한다. @FunctionalInterface 어노테이션을 사용하여 함수형 인터페이스임을 명시할 수 있다.



📌 함수형 인터페이스(Functional Interface)

함수형 인터페이스(Functional Interface)는 오직 하나의 추상 메서드를 가진 인터페이스를 말한다. 자바 8부터 함수형 프로그래밍을 지원하기 위해 도입되었으며, 람다 표현식(Lambda Expression)을 사용하여 이러한 인터페이스의 구현체를 간단하고 명료하게 제공할 수 있다.

함수형 인터페이스는 그대로 사용할 수 있으나, @FuntionalInterface 어노테이션을 선언하는 것이 좋다. 이는 해당 인터페이스가 1개의 함수만을 갖도록 제한함으로써 여러 개의 함수를 선언하면 컴파일 에러가 발생하도록 한다.
(+) 정적 메서드와 디폴트 메서드의 개수는 무관하다.

Java에서 제공하는 함수형 인터페이스

람다식을 사용하기 위해 사용할 인터페이스는 파라미터나 리턴값으로 그 형태가 매우 다양해질 것이다. 따라서 Java에서는 java.util.function 패키지로 아주 다양한 형태의 함수형 인터페이스를 제공한다.

대표적으로 다음의 4가지가 있다.

  • Supplier
  • Consumer
  • Function<T, R>
  • Predicate

이외에도 아주 다양한 함수형 인터페이스가 제공되므로 필요에 따라 사용하면 되겠다.

0개의 댓글