IT's 우

[Spring] 람다식(Lambda Expression) 본문

CS/Spring & JPA

[Spring] 람다식(Lambda Expression)

디우 2023. 7. 19. 01:50
728x90

 


람다식(Lambda Expression)

자바 8에서 등장

 

람다식(Lambda Expression)이란 함수를 하나의 식(expression)으로 표현한 것이다.

함수를 람다식으로 표현하면 메서드의 이름이 필요 없기 때문에, 람다식은 익명 함수(Anonymous Function)의 한 종류라고 볼 수 있다.

익명함수(Anonymous Function)란 함수의 이름이 없는 함수로, 일급 객체인 함수는 변수처럼 사용가능하며 매개 변수로 전달이 가능하는 등의 특징을 가지고 있다.

일급 객체

  1. 모든 일급 객체는 변수나 데이터에 담을 수 있어야 한다.
  2. 모든 일급 객체는 함수의 파라미터로 전달할 수 있어야 한다.
  3. 모든 일급 객체는 함수의 리턴값으로 사용 할수 있어야 한다.
    https://inpa.tistory.com/entry/CS-%F0%9F%91%A8%E2%80%8D%F0%9F%92%BB-%EC%9D%BC%EA%B8%89-%EA%B0%9D%EC%B2%B4first-class-object

 

 

 

기존의 방식에서 함수를 선언할 때

public String hello() {
    return "Hello World!";
}

 

람다 방식으로는 위와 같이 메소드 명이 불필요하며, 다음과 같이 괄호 ()와 화살표 → 를 이용해 함수 선언

괄호 () 안에는 매개변수 (매개변수, ….)

() -> "Hello World!";

 

 

람다식이 등장한 이유


불필요한 코드를 줄이고, 가독성을 높이기 위해

  • 함수형 인터페이스의 인스턴스를 생성하여 함수를 변수처럼 선언하는 람다식에서는 메소드의 이름이 불필요하다고 여겨져서 이를 사용하지 않는다. 대신 컴파일러가 문맥을 살펴 타입을 추론한다. 또한 람다식으로 선언된 함수는 1급 객체이기 때문에 Stream API의 매개변수로 전달이 가능해진다.
더보기

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

람다식으로 순수 함수를 선언할 수 있게 되었다.

하지만 Java는 기본적으로 객체지향 언어이기 때문에 순수 함수와 일반 함수를 다르게 취급하고 있으며, Java에서는 이를 구분하기 위해 함수형 인터페이스가 등장하게 되었다.

함수형 인터페이스란 함수를 1급 객체처럼 다룰 수 있게 해주는 어노테이션으로, 인터페이스에 선언하여 단 하나의 추상 메서드만을 갖도록 제한하는 역할을 한다. 함수형 인터페이스를 사용하는 이유는 Java의 람다식이 함수형 인터페이스를 반환하기 때문이다

 

함수형 인터페이스 등장 전

public class Lambda {

    public static void main(String[] args) {
    
        // 기존의 익명함수
        System.out.println(new MyLambdaFunction() {
            public int max(int a, int b) {
                return a > b ? a : b;
            }
        }.max(3, 5));

    }

}

 

함수형 인터페이스 등장으로 함수를 변수처럼 선언할 수 있게 되었고, 코드 역시 간결하게 작성할 수 있게 되었다.

함수형 인터페이스를 구현하기 위해서는 인터페이스를 개발하여 그 내부에는 1개뿐인 abstract 함수를 선언하고, 위에는 @FunctionalInterface 어노테이션을 붙여주면 된다. 위의 코드를 람다식으로 변경하면 다음과 같다.

@FunctionalInterface
interface MyLambdaFunction {
    int max(int a, int b);
}

public class Lambda {

    public static void main(String[] args) {

        // 람다식을 이용한 익명함수
        MyLambdaFunction lambdaFunction = (int a, int b) -> a > b ? a : b;
        System.out.println(lambdaFunction.max(3, 5));
    }

}

이제 우리는 Java8 이전에 사용했던 익명함수들을 람다식으로 변경해 코드를 줄일 수 있게 되었고,

여기서 놓치지 말아야 하는 것은 람다식으로 생성된 순수 함수는 함수형 인터페이스로만 선언이 가능하다는 점이다. 또한 @FunctionalInterface는 해당 인터페이스가 1개의 함수만을 갖도록 제한하기 때문에, 여러 개의 함수를 선언하면 컴파일 에러가 발생할 것이라는 점이다.

 

 

람다식의 특징


  • 람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주된다.
  • 람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없다.

 

람다식 장점


  • 기존에 익명 함수로 작성하던 코드를 줄일 수 있음
  • 가독성 증가
  • 함수를 만드는 과정없이 한 번에 처리할 수 있어 생산성이 높아진다.
  • 병렬 프로그래밍이 용이하다.

람다식 단점


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

참고

https://mangkyu.tistory.com/113

728x90
반응형

'CS > Spring & JPA' 카테고리의 다른 글

[Spring] Annotation  (0) 2023.07.24
[Spring] IoC, DI  (0) 2023.07.18
[Spring] 스프링 컨테이너(Spring Container)  (0) 2023.07.18
[Spring] Spring 이란?  (0) 2023.07.08
[Spring] MVC 패턴  (0) 2023.06.27