IT

[Java] 람다식(Lambda Expressions)

data-cloud 2025. 1. 22. 22:08
반응형


☕️ 람다식(Lambda Expressions) 이란?

람다식이란 프로그래밍 언어에서 사용되는 개념으로 익명 함수를 지칭하는 용어이다. 함수를 람다식으로 표현하면 메서드의 이름 없이 사용할 수 있게 되는데, 이 때문에 익명 함수라고도 불린다.
람다식은 자바 8부터 사용 가능하며 이로 인하여 자바에서도 함수형 프로그래밍이 가능하게 되었다.
 
 
 

☕️ 람다식(Lambda Expressions)의 장단점

  • 람다식(Lambda Expressions)의 장점
    - 코드를 간결하게 만들 수 있다.
    - 식에 개발자의 의도가 명확히 드러나 가독성이 높아진다.
    - 함수를 만드는 과정없이 한번에 처리할 수 있어 생산성이 높아진다.
    - 병렬프로그래밍이 용이하다.

  • 람다식(Lambda Expressions)의 단점
    - 람다를 사용하면서 만든 무명함수는 재사용이 불가능하다.
    - 디버깅이 어렵다.
    - 람다를 무분별하게 사용할 경우, 비슷한 함수가 중복 생성될 수 있다.

 
 
 

☕️ 람다식(Lambda Expressions)의 기본문법

람다식의 기본 문법을 알아보기 전에 인터페이스를 사용함에 있어 기존방식과 람다식을 사용할 때의 차이점을 알아보자.
매개변수(num)를 받아 제곱을 계산하는 메서드(square)를 가진 인터페이스가 있다고 가정해 보자.

interface SquareIF {
    int square(int num);
}

 
해당 메서드를 사용하기 위해서는 구현 클래스를 만들어야 하며, 구현 클래스에서 오버라이딩한 메서드를 호출해야 최종적으로 원하는 값을 얻을 수 있다.

class SquareImpl implements SquareIF {
    @Override
    public int square(int num) {
        return num * num;
    }
}

public class Test {
    public static void main(String[] args) {
        SquareIF squareIF = new SquareImpl();
        System.out.println(squareIF.square(2)); // 4
    }
}

 
또 다른 방법으로는 익명 클래스를 활용하는 방법도 있을 것이다.

public class Test {
    public static void main(String[] args) {
        SquareIF squareIF = new SquareIF() {
            @Override
            public int square(int num) {
                return num * num;
            }
        };
        System.out.println(squareIF.square(2)); // 4
    }
}

 
 
두 방법 모두 실행까지 꽤나 많은 타이핑이 있었다. 이제 람다식을 사용한 예제를 확인해 보자.

public class Test {
    public static void main(String[] args) {
        SquareIF sif1 = (int a) -> {
            return a * a;
        };
        System.out.println(sif1.square(2)); // 4
    }
}

람다식을 사용한 코드를 보면 기존 코드와 다르게 SquareImpl 클래스 없이 square() 메서드를 사용한 것을 볼 수 있을 것이다.
이와 같이 람다식을 사용하게 되면 불필요한 코드를 줄여준다는 장점을 가지고 있다.
또한 익명클래스와 비교해 보았을 때도 조금 더 간결한 코드를 통해 가독성을 높일 수 있다는 장점도 있을 것이다. 당장은 큰 차이를 못 느낄 수 있겠지만 특징에 따른 생략이 가능하여 더 간결한 코드가 될 수도 있다.

반응형


 
이제 람다식의 기본 문법에 대해서 알아보자. 람다식의 기본 구문은 다음과 같다.

(매개변수) -> {함수 몸체}

위 코드에 대입해 보면, 매개변수는 (int a)가 되는 것이고 함수몸체는 {return a * a}가 되는 것이다.
람다식은 상황에 따라 기본문법을 더욱 간결하게 작성할 수도 있다. 자세한 설명은 아래의 코드를 통해 알아보도록 하자.

interface SquareIF {
    int square(int num);
}

public class LambdaSample {

    public static void main(String[] args) {

        /*
         *  추상 메서드를 하나만 갖는 인터페이스를 자바 8부터는 함수형 인터페이스라고 하며,
         *  이런 함수형 인터페이스만을 람다식으로 표현 가능하다.
         */
        SquareIF sif1 = (int a) -> {
            return a * a;
        };
        System.out.println(sif1.square(1)); // 1


        /*
         *  1. 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있다.
         *     - Square(int num)를 통해 a가 int일 수 밖에 없으므로 int를 생략할 수 있다.
         *     - (int a)가 (a)로 변경되었다.
         */
        SquareIF sif2 = (a) -> {
            return a * a;
        };
        System.out.println(sif2.square(2)); // 4


        /*
         *  2. 매개변수가 하나인 경우는 소괄호를 생략할 수 있다.
         *     - 1번 규칙에 의해 (a)로 변경되었으며, 매개변수가 1개이기 때문에 소괄호도 생략 가능하여 a가 되었다.
         */
        SquareIF sif3 = a -> {
            return a * a;
        };
        System.out.println(sif3.square(3)); // 9


        /*
         *  3. 함수의 몸체가 하나의 명령문만 있을 경우, 중괄호도 생략가능하다. 단, return구문은 생략해야한다.
         */
        SquareIF sif4 = a -> a * a;
        System.out.println(sif4.square(4)); // 16

    }
}

 
예제를 통해 람다식의 문법에 대해서 알아보았다. 최종적으로 사용한 코드를 보면 확실히 간결해진 것을 느낄 수 있을 것이다.
이후 포스팅에서는 람다식과 밀접한 관련이 있는 '함수형 인터페이스' '메서드 참조'에 대해서 다뤄볼 예정이다. 

 

 

 

 

 

 

 

 

References.

1. 망나니개발자 - [Java] 람다식(Lambda Expression)과 함수형 인터페이스(Functional Interface) - (2/5)
2. 코딩 바다에서의 항해일지 - [Java] 람다식(Lambda) 익히기

 

반응형