프로그래밍/자바(Java)

[ 자바 / JAVA ] 함수형 프로그래밍과 람다식(Lambda Expression)

후르트링 2021. 7. 26. 19:29
728x90

자바에서는 기능을 수행하기 위해 객체를 생성하고, 객체 내부에 멤버 변수와 메소드를 선언하여 사용하는 객체 지향 프로그래밍 방식입니다.

그러나 Java SE 8 부터는 함수형 프로그래밍 방식을 지원하게 되었습니다.

자바에서 제공하는 함수형 프로그래밍 방식을 "람다식(Lambda Expression)"이라고 합니다.

자바에서는 익숙하지 않은 개념이므로 하나씩 알아보도록 하겠습니다.

 

[함수형 프로그래밍]

  • 함수형 프로그래밍은 영어로 Functional Programming, 줄여서는 FP 라고 합니다.
  • 함수형 프로그래밍은 순수 함수(매개변수만 사용하여 만드는 함수)를 사용하여 구현하고 호출하는 방식입니다.
  • 이러한 방식은 함수 내부에서 외부 변수를 사용하지 않아서 side effect를 주지 않도록 구현하는 방식입니다.

 

[람다식]

  • 람다식은 자바에서 함수형 프로그래밍을 사용하는 방식입니다.
  • 람다식을 사용함으로써 코드의 길이를 줄일 수 있습니다.
  • 람다식을 선언하기 위해서는 함수형 인터페이스가 필요합니다.
  • 함수형 인터페이스
    • @FunctionalInterface 애노테이션으로 선언합니다.(optional)
    • 익명 함수와 매개 변수만으로 구현되므로 인터페이스는 단 하나의 메소드만을 선언해야 합니다.
    • 함수형 인터페이스 안에 여러개의 메소드를 선언하면 오류가 생깁니다.

 

[람다식 문법]

간단하게 람다식 문법에 관하여 살펴보겠습니다.

  • 파라미터가 1개인 람다식 문법
(p1) -> {  
//람다식 함수 바디 구현
}  
  • 객체 지향에서의 일반적인 자바 함수 예시
int add(int x, int y){
    return x+y;
}
  • 람다식으로 표현
(int x, int y ) -> {return x+y;}
  • 매개변수가 두 개이상인 경우 괄호를 생략할 수 없습니다.
x, y -> {System.out.println(x+y);}  //오류
  • 실행문이 한 문장인 경우 중괄호 생략 가능합니다.
str-> System.out.println(str);
  • 실행문이 한 문장이라도 return문(반환문)은 중괄호를 생략할 수 없습니다.
str-> return str.length();  //오류
  • 실행문이 한 문장의 반환문인 경우엔 return과 중괄호를 모두 생략가능합니다.
(x, y) -> x+y;
str -> str.length;

 

[객체 지향 vs 람다식]

  • 객체 지향에서의 자바 코드
interface Drawable{  
    public void draw();  
}

public class LambdaExpressionExample {
    public static void main(String[] args) {
        int width=10;
          Drawable d1=new Drawable()
        {  
            public void draw(){
                System.out.println("Drawing "+width);
            }  
        };  
        d1.draw();  
    }  
}

 

  • 람다식을 사용했을 때의 자바 코드
@FunctionalInterface
interface Drawable{  
    public void draw();  
}  

public class LambdaExpressionExample2 {  
    public static void main(String[] args) {  
        int width=10;
        Drawable d2=()->{  
            System.out.println("Drawing "+width);  
        };  
        d2.draw();  
    }  
}