본문 바로가기
Java

[Spring] Java의 람다식(Lambda)이란?

by taetae99 2023. 8. 10.
반응형

 

Spring학습 중에 람다식을 활용하는 부분이 나왔는데 이해하고 넘어가고자 글을 작성하게 되었다. 

 

 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

스프링 핵심 원리 - 기본편 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., 스프링 핵심 원리를 이해하고, 성장하는 백엔드 개발자가 되어보세요! 📢

www.inflearn.com

 


 

 

람다 함수란?

 

 

 

람다식, 람다 함수라고 불리며 익명함수(Anonymous functions)를 지칭하는 용어이다. 

자바 8부터 도입되어 자바 8 버전부터 사용가능하다. 

람다식의 등장배경에는 불필요한 코드를 줄이기 위함이 있다. 

 

 


 

Spring 학습 중에 람다식이 포함되어 있던 상황을 아래 코드로 가져와 보았다.

스프링 컨테이너에서 스프링 빈을 찾는 상황이었고 빈 이름을 사용하지 않고 조회하려고 하는 코드이다.  

assertThrows()를 사용하여 검증하는 과정에서 람다식을 사용하였다. 

class ApplicationContextBasicFindTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("빈 이름으로 조회X")
    void findBeanByNameX(){
        //MemberService xxxxx = ac.getBean("xxxxx", MemberService.class);
        assertThrows(NoSuchBeanDefinitionException.class,
                ()->ac.getBean("xxxx",MemberService.class));
    }
}

assertThrows()를 설명하면 현재 스프링 컨테이너에 "xxxxx"라는 이름의 스프링 빈이 등록되어 있지 않기 때문에 

ac.getBean("xxxxx", MemberService.class);를 실행하면  NoSuchBeanDefinitionException이 발생한다. 

이와 같은 이유로 assertThrows()를 사용하여 검증하는 과정을 거친다.

 

assertThrows()의 첫 번째 매개변수로는 예상되는 예외 클래스, 두 번째 매개변수는 테스트할 코드블록이 필요하다.

여기서 두 번째 매개변수 부분에 람다식을 사용하여 코드가 간결하게 사용되었다.

코드는 assertThrows()에서 람다식 부분이 실행되면 스프링 컨테이너에서 "xxxxx"라는 이름의 스프링 빈을 찾지만 등록되어 있지 않기 때문에 예외가 발생하는 과정으로 이루어진다. 

 

 

 

 

 

 

 


 

이러한 람다식의 실행과정은 아래와 같은 형태를 가진다.

(매개변수) -> 구현코드

 

이렇게만 보면 잘 이해가 되지 않는다. 아래 예제를 보며 이해해 보자.

 

 

 

예제 1.

간단한 더하기 람다식 예제이다.

 

 

람다식을 사용하지 않고 Adder인터페이스의 add() 메서드를 오버라이딩하여 사용하려고 하는 코드이다. 

interface Adder {
    int add(int x, int y);
}

public class LambdaExample {
    public static void main(String[] args) {
        Adder adder = new Adder() {
            @Override
            public int add(int x, int y) {
                return x + y;
            }
        };

        int result = adder.add(3, 5);
        System.out.println("result = " + result);
    }
}

 

 

 

 

Adder를 구현하고 add()를 오버라이딩하는 과정을 람다식을 이용하면 아래와 같이 간결해진다.

이 코드의 결과로는 동일하게 "result = 8"이 보인다. 

interface Adder {
    int add(int x, int y);
}

public class LambdaExample {
    public static void main(String[] args) {
        
        Adder adder = (x, y) -> x + y;
        
        int result = adder.add(3, 5);
        System.out.println("result = " + result);
    }
}

 

이와 같이 람다식을 이용하여 코드가 한결 간단해지고 눈에 확 들어온다.

 

 

 


 

 

예제 2.

 

람다식 없이 Runnable인터페이스의 run() 메서드를 구현하여 "Hello World!"를 출력하도록 하는 코드이다. 

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello, World!");
    }
};

Runnable의 내부정보를 확인해 보면 이는 인터페이스이며 run()을 추상메서드로 포함하고 있다. 

 

 

람다식을 사용하면 인터페이스를 구현하고 메서드 오버라이딩하는 코드를 축약시켜 아래와 같이 한 줄로 표현할 수 있다. 

Runnable lambdaRunnable = () -> System.out.println("Hello, World!");

 

 

 

 

 

-요약-

 

람다식은 Java의 함수형 프로그래밍을 지원하는 기능으로 사용되며, 코드의 간결성과 가독성을 향상해 주는 중요한 개념이다. 

람다식은 이와 같은 장점을 갖고 있지만 단점 또한 존재한다. 

예를 들어 복잡한 람다식은 가독성을 떨어뜨리고 다중 매개변수를 다루는 경우 코드를 이해하기 어렵다. 

또한 디버깅 시에 람다식 자체를 디버깅하기 어렵다. 

 

 

 

 

반응형