ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Camel][Java] Lambda Expression - 람다식
    Java/개념 정리 2020. 7. 16. 21:43

    1. Lambda Expression (람다식)이란?

    람다식은 간단하게 설명하자면 함수를 변수처럼 사용하는 것입니다. 다른 말로는 식별자 없이 실행가능한 함수라고도 설명할 수 있습니다. 람다식의 경우에는 Java 8에서부터 지원하기 시작했습니다. JDK 8버전 이전에는 메소드 그 자체를 변수로 사용할 수 없었지만, JDK 8버전부터는 람다식을 사용해 함수를 변수처럼 사용할 수 있게된 것입니다. 이러한 람다식을 사용하면 이전보다 문법적으로 간결하게 표현할 수 있습니다.

     

     

    2. 람다식의 왜 사용하는가?

    결론부터 말하자면, 람다식의 주된 사용이유는 인터페이스가 가지고 있는 메소드를 간편하게 구현해서 사용하는 것 때문입니다. 

     람다식을 사용하기 위해서는 구현하기 위한 Functional 인터페이스(@FunctionalInterface)가 요구됩니다. 애노테이션의 이름에서부터 알 수 있듯이, Functional 인터페이스는 함수 구현을 위한 인터페이스입니다. Functional 인터페이스임을 명시하는 방법은 @FunctionalInterface 애노테이션을 사용하면됩니다. 

     

    참고. @FunctionalInterface 애노테이션이란?

    @FunctionalInterface 애노테이션으로 명시된 인터페이스에서는 오직 한 개의 abstract 메소드만 선언할 수 있습니다. 한 개가 아니라 다수의 abstract 메소드를 선언하게되면 컴파일 에러가 발생하게 됩니다. 

     

     

    3. 람다식의 장점 및 단점

    람다식은 함수형에 대해서 새로 정의하지 않고, 기존에 존재하는 인터페이스의 형태를 기반으로 람다식을 표현하기 때문에 완벽한 함수형 프로그래밍 방식이 아닙니다. 그리고 이러한 람다식은 완벽한 함수형 프로그래밍 방식이 아닌 만큼 장점외에도 단점이 존재하기 마련입니다. 

     

    람다식의 장점

    • 코드의 간결화
      • 람다식을 사용하면 함수를 만드는 과정없이 한번에 처리할 수 있게되면서 코드가 간결해질 수 있습니다. 

    • 병렬처리 가능
      • 함수형 프로그래밍은 반복대상을 사용자코드에서 직접 지정하지 않으며, 이러한 점은 Collection API의 개선효과를 가져다 줍니다. 또한 멀티 쓰레드를 활용해 병렬처리가 용이합니다.  

    • 메소드를 사용해서 행동방식 전달 가능
      • 메소드에서 객체를 생성한 뒤 전달할 필요없이, 람다식을 사용하면 행동 방식 그 자체를 전달할 수 있습니다. 

    • 의도의 명확성
      • 코드가 간결해지면서 개발자의 개발의도를 명확하게 보여줄 수 있습니다.

    • 지연연산 수행
      • 람다식에서는 지연연산을 수행하여 불필요한 연산을 최소화합니다. 

    람다식의 단점

    • 까다로운 호출 방법
      • 람다식을 생성하고 전달하는 것은 별 문제가 없지만, 람다식을 실행할 때 인터페이스에 선언된 메소드를 호출하는 것이 직접 메소드를 호출해야하기 때문에 까다로운 편입니다. 또한 람다식 내에서는 람다식을 가리키는 변수를 참조할 수 없기때문에 함수 내부에서 자신을 다시 호출하는 재귀형식의 호출이 어렵습니다.

    • 무분별한 람다식의 남용은 가독성을 떨어뜨린다
      • 람다식을 사용해 코드를 간결하게 작성할 수 있다는 점을 장점으로 설명했지만, 무분별하게 람다식을 남용하면 비슷한 기능의 함수를 중복해서 생성하는 경우가 많기에 오히려 코드의 가독성을 떨어뜨릴수 있습니다. 

    위의 장단점 외에도 자잘한 장점 및 단점들이 있습니다. 좀 더 다양하게 람다식의 장점 및 단점을 알고자 하시는 분들은 람다식의 장점 및 단점으로 구글링해보시는 걸 추천드립니다. 

     

     

    4. 람다식의 표현 및 사용방법

     

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

     

    람다식은 매개변수, 화살표 그리고 함수몸체로 구성되어 있습니다. 매개변수가 하나일 경우에는 매개변수를 생략할 수 있으며, 함수 몸체 또한 단일 실행문일 경우 괄호를 생략할 수 있습니다. 

     하지만 함수 몸체가 return문으로만 구성되어 있다면 괄호를 생략할 수 없습니다. 

     

    기존 Java 문법을 사용하면 아래와 같습니다.

    new Thread(new Runnable() {
       @Override
       public void run() { 
          System.out.println("기존 자바문법입니다."); 
       }
    }).start();

    하지만 람다식을 사용하면 아래와 같이 표현할 수 있습니다.

    new Thread(()->{
          System.out.println("람다식 사용");
    }).start();

     

    추가적으로 위에서 설명했던 Functional 인터페이스를 사용하면 아래와 같이 사용할 수 있습니다.

    @FunctionalInterface
    interface Calculate {
        public int Calc(int first, int second);
    }
    public static void main(String[] args){
    
       Calculate plus = (first, second) -> first + second;
       System.out.println(plus.Calc(4, 2));
    
       Calculate minus = (first, second) -> first - second;
       System.out.println(minus.Calc(4, 2));
    
    }

     

     

    5. Reference (참고 페이지)

    https://khj93.tistory.com/entry/JAVA

    https://m.blog.naver.com/2feelus/220695347170

    https://coding-factory.tistory.com/265#recentEntries

    댓글

Camel`s Tistory.