본문 바로가기
[ JAVA ]/JAVA

[ Java ] Lambda

by 환이s 2023. 1. 17.
CHAPTER 25. Lambda Expression 알아가기

오늘은 JDK1.8부터 추가된 람다식(Lambda expression)에 대해서 포스팅해보려 합니다.

 

■  Lambda expression

람다식(Lambda expression)이란 함수형 프로그래밍의 표현법 입니다. 여기서 함수형 프로그래밍이란 객체 지향 프로그래밍이 나오기 전부터 있던 패러다임 중 하나로서 함수 안으로 들어오는 인자를 가지고 항상 불변한 결과를 돌려주는 것이 목적을 갖고 있습니다. 함수형 프로그램은 함수 내부 중괄호 안에 필요한 변수는 외부에서 받아오고 로직만이 존재하기 때문에 변수에 값이 할당되면 이후에 변하지 않고, 병렬처리나 이벤트 지향 프로그램에서 side effect가 없다는 장점이 있습니다.  즉, 람다식은 함수형 프로그래밍의 표현법으로 메서드를 하나의 식으로 표현한 것입니다. 

 

람다식 기본 문법은 다음과 같습니다.

 

//(매개변수) -> {실행코드}

public int mul(int x, int y) { return x * y; }
⇒ (int x, int y) -> { return x * y; }
⇒ (x, y) -> { return x * y; }
⇒ (x, y) -> x * y

 

■  Lambda  장단점

1 ) 장점

 

  • 코드의 간결성 - > 람다를 사용하면 불필요한 반복문의 삭제가 가능하며 복잡한 식을 단순하게 표현할 수 있습니다.
  • 병렬처리 가능 - > 멀티스레드를 활용하여 병렬처리를 사용할 수 있습니다.
  • 지연연산 수행 - > 람다는 지연연상을 수행 함으로써 불필요한 연산을 최소화할 수 있습니다.

 

2 ) 단점

 

  • 불필요하게 너무 사용하게 되면 오히려 가독성을 떨어 뜨릴 수 있습니다.
  • 람다 stream 사용 시 단순 for문 혹은 while문 사용 시 성능이 떨어집니다.
  • 람다식의 호출이 까다롭습니다.

 

■  함수형 인터페이스

 

이전 포스팅에서 알아보면 인터페이스는 두 개 이상 선언하면서 코딩을 하는 방식을 해왔습니다. 하지만 함수형 인터페이스는 구현해야 할 추상 메서드가 하나만 정의된 인터페이스입니다. 이를 방지하기 위해 함수형 인터페이스를 구체적으로 명시하는 방법은 @FunctionalInterface 어노테이션을 사용하는 것입니다. 해당 어노테이션을 붙이고 내부에 2개 이상의 추상 메서드가 적혀 있으면 에러를 확인할 수 있습니다.

 

 

람다식을 구현 할 때 주의점은 다음과 같습니다.

 

<주의점> 

result -> System.out.println(resylt); // (o)
//위 처럼 선언된 매개변수가 하나뿐인 경우에는 괄호()를 생략할 수 있습니다.
int result -> System.out.println(resylt); // (x)
//매개변수의 타입을 생략하지 않은 경우는 괄호()를 생략할 수 없습니다.

// 만약 매개 변수가 없다면 람다식에서 매개 변수가 자리가 없어지므로 다음과 같이 빈 괄호()를 반드시 사용해야 합니다.
//   () -> {실행문;}

// 괄호 {}안의 문장이 하나일 때만 괄호{}를 생략할 수 있고 문장의 끝에 ;(세미콜론)을 붙이지 않아야 합니다.

 

그럼 예제를 통해서 알아봅시다.

 

■  함수형 인터페이스 람다 예제

 

1. 함수형 인터페이스 선언

 

함수적 인터페이스라는 것을 구체적으로 명시하기 위해 @FunctionalInterface어노테이션을 사용합니다.

선언을 하려면 참조 변수가 있어야 객체의 메서드를 호출할 수 있기 때문에, 그러므로 객체에 참조변수 mul을 넣었습니다.

 

<예제 1>

@FunctionalInterface
public interface Ld {
    public int mul(int x, int y);

}

 

이 때 참조변수 mul의 타입은 클래스 또는 인터페이스가 가능하고, 람다식과 동등한 메서드가 정의되어 있는 것이어야 합니다.

그래야 참조변수로 람다식의 메서드를 호출할 수 있습니다.

 

2. 추상 메서드 구현 및 함수형 인터페이스 사용

 

<예제 2> 

    private static void ld1() {
        Ld ld = ((x, y) -> x*y); // 구현체
        int result = ld.mul(10,20);
        System.out.println("result = "+ result);
    }

    // public int fn(int x, int y){
    //      return x*y;                     ---> ld = ((x,y) -> x*y); 람다식
    // }
}

 

위 예제 코드를 보면 람다식으로 코드의 좀 더 간결화해서 활용할 수 있다는 걸 알 수 있습니다.

 

결과는 다음과 같습니다.

 

예시 문제를 통해서 좀 더 람다식에 대해 알아봅시다.

 

정수 2개를 입력 받아 4칙 연산을 하는 FunctionalInterface를 정의하고, Lambda를 이용하여 4칙연산을 수행하시오.

 

 

1. 함수형 인터페이스 선언

 

<예제 코드>

@FunctionalInterface
public interface Ldoper {
    public int oper(int x, int y);
}

 

2. 추상 메소드 구현 및 함수형 인터페이스 사용

 

<예제 코드>

	ld2();//method()
   
   	private static void ld2() {
        Ldoper add = ((x, y) -> x + y);
        Ldoper sub = ((x, y) -> x - y);
        Ldoper mul = ((x, y) -> x * y);
        Ldoper div = ((x, y) -> x / y);


        System.out.println("add = " + add.oper(10, 20));
        System.out.println("sub = " + sub.oper(10, 20));
        System.out.println("mul = " + mul.oper(10, 20));
        System.out.println("div = " + div.oper(10, 20));
    }

 

결과는 다음과 같습니다.

 

 


마치며

 

오늘은 람다식에 대해서 포스팅해보았습니다. 코드가 간결해지는 장점이 있는 만큼 단점도 있지만 미래의 개발자님의 코딩에 맞게 활용하시면 좋을 거 같습니다..! 다음 포스팅에 뵙겠습니다.

 

 

728x90