본문으로 바로가기

람다식이란?

category 프로그래밍/자바 2019. 1. 28. 09:32

  • 수적 프로그래밍
    • y=f(x) 형태의 함수로 구성된 프로그래밍 기법
      • 데이터를 매개값으로 전달하고 결과를 받는 코드들로 구성
      • 객체 지향 프로그래밍 보다는 효율적인 경우
        • 대용량 데이터의 처리시에 유리
          • 데이터 포장 객체를 생성후 처리하는 것 보다,데이터를 바로 처리하는 것이 속도에 유리
          • 멀티코어 CPU에서 데이터를 병렬 처리하고 취합할때 객체보다는 함수가 유리
        • 이벤트 지향 프로그래밍(이벤트가 발생하면 핸들러 함수 실행)에 적합
          • 반복적인 이벤트 처리는 핸들러 객체보다는 핸들러 함수가 적합
    • 현대적 프로그래밍 기법
      • 객체 지향 프로그래밍 + 함수적 프로그래밍



  • 자바 8부터 함수적 프로그래밍 지원
    • 람다식(Lamda Expression)을 언어 차원에서 제공
      • 람다 계산법에서 사용된 식을 프로그래밍 언어에 접목
      • 익명 함수(anonymous function)을 생성하기 위한 식
        • (타입 매개변수,...) x  -> { 실행문;....} y 
    • 자바에서 람다식을 수용한 이유
      • 코드가 매우 간결해진다.
      • 컬렉션 요소(대용량 데이터)를 필터링 또는 매핑해서 쉽게 집계할 수 있다.
    • 자바는 람다식을 함수적 인터페이스(한개의 메소드를 가지고 있는 인터페이스)의 익명 구현 객체로 취급
      • 람다식 -> 매개변수를 가진 코드 블록 -> 익명 구현 객체
      • 어떤 인터페이스를 구현할지는 대입되는 인터페이스에 달려있다.

                     Runnable이 가지고 있는 메소드를 찾는다.  run 밖에 없다.

                    


    • 함수적 스타일의 람다식을 작성하는 방법
             
                          (타입 매개변수,....) -> { 실행문 ; .....}        예)  (int a)-> { System.out.println(a); }


  • 매개 타입은 런타임시에 대입값에 따라
            자동으로 인식하기 때문에 생략 가능

            (a) -> { System.out.println(a) ; }
  • 매개변수가 없다면 괄호 ( ) 를 생략할 수 없다.

            ( ) -> { 실행문 ; ... }
  • 하나의 매개변수만 있을 경우에는 괄호() 생략 가능

             a -> { System.out.println(a) ; }
  • 리턴값이 있는 경우 , return 문을 사용

            (x,y) -> { return x+y;  };
  • 하나의 실행문만 있다면 중괄호 { } 생략가능

            a -> System.out.println(a) 
  • 중괄호에 { }에 return 문만 있을 경우, 중괄호 생략가능

            (x,y) ->  x+y


  • 타켓 타입(target type)
    • 람다식이 대입되는 인터페이스를 말한다.
    • 익명 구현 객체를 만들 때 사용할 인터페이스 이다.
                        Runnable runnable = 람다식; => Runnable이 타겟타입 

  • 함수적 인터페이스(functional interface)
    • 모든 인터페이스는 람다식의 타겟 타입이 될 수 없다.
      • 람다식은 하나의 메소드를 정의하기 때문에
      • 하나의 추상 메소드만 선언된 인터페이스만 타켓 타입이 될 수 있음
    • 함수적 인터페이스
      • 하나의 추상 메소드만 선언된 인터페이스를 말한다.
    • @FunctionalInterface 어노테이션
      • 하나의 추상 메소드만을 가지는지 컴파일러가 체크하도록 함
      • 두 개 이상의 추상 메소드가 선언되어 있으면 컴파일 오류 발생
      • 함수적 인터페이스라고 해서 꼭 FunctionalInterface를 가질 필요는 없음
                            
                                 

    • 예제)

<MyFunctionalInterface.java>

@FunctionalInterface
public interface MyFunctionalInterface {
       public void method();
}

<MyFunctionalInterfaceExample.java>

public class MyFunctionalInterfaceExample {
       public static void main(String[] args) {
              
              MyFunctionalInterface fi;
                                         
              fi = new MyFunctionalInterface() {
                     @Override
                     public void method() {
                           System.out.println("호출1");
                     }
              };
              fi.method();  
              
              //람다식
              fi = ()->{System.out.println("호출2");};
              fi.method();
       }
}

결과>
호출1
호출2