JAVA 8부터 함수적 프로그래밍을 위해 람다식(Lambda Expression)을 지원합니다.

익명구현객체 코딩기법에 비해 코드가 매우 간결해지고,

컬렉션 요소(대용량 데이터)를 필터링하거나 매핑을 해서 쉽게 집계할 수 있습니다.

 

 


 

 

람다식에서는 두 가지 용어가 있습니다.

 

  1. 타겟 타입(Target Type)
    타겟 타입은 람다식으로 구현할 함수적 인터페이스(Functional Interface)를 의미합니다.

  2. 함수적 인터페이스(Functional Interface)
    자바 8이상부터 @FuntionalInterface 어노테이션을 통해 함수적 인터페이스를 정의할 수 있습니다.
    추상메서드가 1개라면, 함수적 인터페이스이지만 어노테이션을 붙이는 이유는
    컴파일러가 컴파일 시에 검사할 수 있도록 하기 위함입니다.

 

 

람다식은 이러한 함수적 인터페이스를 implements 합니다.

implements하는 함수적 인터페이스를 람다식의 타겟 타입(Target Type)이라고 합니다.

 

람다식이 구현하는 익명함수는 익명구현객체와 비슷하지만 약간의 차이가 있습니다.

익명함수는 1개의 추상 메서드만 재정의하지만,

익명구현객체는 추상 메서드의 갯수에 대한 제한이 없습니다.

 

 

여기서 "익명"이란 이름이 없는 것이 아니라 이름을 모르는 것을 의미합니다.

그렇다면, 익명구현객체를 찍어낸 인터페이스는 추상메서드의 개수에 제한이 없습니다.

 

다음은 간단한 람다식 구현 코드입니다.

 

@FunctionalInterface
interface ICalculator {
    public abstract int add(int number1, int number2) throws Exception; // 덧셈
	
} // end Interface

 

@Log4j2
public class App {

	
    // ICalculator 인터페이스를 구현(Implements)
    public static void main(String[] args) throws Exception {
		
        ICalculator calc = (int number1, int number2) -> {
            return number1 + number2;
        };

    } // main

} // end class

 

 

위의 실행 클래스는 생략 전 add() 메서드입니다.

람다식은 여기서 파라미터의 타입을 제거할 수 있습니다.

 

 

@Log4j2
public class App {

	
    // ICalculator 인터페이스를 구현(Implements)
    public static void main(String[] args) throws Exception {
		
        // 생략 전
        //ICalculator calc = (int number1, int number2) -> {
        //    return number1 + number2;
        //};
        
        
        ICalculator calc = (number1, number2) -> {
            return number1 + number2;
        };

    } // main

} // end class

 

 

만약 파라미터가 1개라면 소괄호를 생략할 수 있습니다.

기존에 생성했던 함수적 인터페이스에서 추상 메서드의 파라미터 또한 수정해야 합니다.

 

 

@Log4j2
public class App {

	
    // ICalculator 인터페이스를 구현(Implements)
    public static void main(String[] args) throws Exception {
		
        // 생략 전
        // ICalculator calc = (int number1, int number2) -> {
        //     return number1 + number2;
        // };
        
        // 파라미터 타입 생략
        // ICalculator calc = (number1, number2) -> {
        //    return number1 + number2;
        // };
        
        // 파라미터가 1개일 때, 소괄호 생략 가능
        ICalculator calc = number1 -> {
            return number1 + 100;
        };

    } // main

} // end class

 

 

여기서 중괄호 블록안에 return문만 있을 경우, 중괄호 블록과 return 키워드까지 생략해야 합니다.

 

 

@Log4j2
public class App {

	
    // ICalculator 인터페이스를 구현(Implements)
    public static void main(String[] args) throws Exception {
		
        // 생략 전
        // ICalculator calc = (int number1, int number2) -> {
        //     return number1 + number2;
        // };
        
        // 파라미터 타입 생략
        // ICalculator calc = (number1, number2) -> {
        //     return number1 + number2;
        // };
        
        // 파라미터가 1개일 때, 소괄호 생략
        // ICalculator calc = number1 -> {
        //     return number1 + 100;
        // };
        
        // return키워드, 중괄호 블록 생략
        ICalculator calc = number1 -> number1 + 100;
        
        

    } // main

} // end class

 

 

최종적으로 생략된 코드에서

  • number1 : 파라미터 선언부
  • number + 1 : 메서드 구현부

 

입니다.

 

 

 

 

 

 

+ Recent posts