개발 인생/자바

[java] 람다식

견과류아몬드 2022. 2. 7. 01:31

[ 람다식(Lambda Expression) 이란? ]

람다식(Lambda Expression)이란 함수를 하나의 식(expression)으로 표현한 것이다. 함수를 람다식으로 표현하면 메소드의 이름이 필요 없기 때문에, 람다식은 익명 함수(Anonymous Function)의 한 종류라고 볼 수 있습니다.

 

람다식은 자바 버전 8부터 추가된 기능입니다.

람다식은 함수형 프로그래밍을 자바에서 구현하기 위해서 추가된 기능입니다.

람다식을 알기 전에 "함수형 프로그래밍이 무엇인가?"에 대해서 아는 것이 좋을 것 같으니 함수형 프로그래밍에 대한 링크는 밑의 링크 참조 바랍니다.

함수형 프로그래밍 - https://nut-alrnond.tistory.com/m/12

 

함수형 프로그래밍

선언형 프로그래밍 vs 함수형 프로그래밍 프로그래밍은 방식은 크게 명령형 프로그래밍, 선언형 프로그래밍으로 구분된다. - 명령형 프로그래밍(≒절차적 프로그래밍): 프로그래밍의 상태와 상

 

 

nut-alrnond.tistory.com

람다식은 1급 객체를 만족해야한다.

람다식은 인터페이스를 구현해야한다.

 

1급 객체(First-class citizen)

아래 3 가지조건을 충족한다면 1급 객체라고 할수 있습니다.

  1. 변수나 데이타에 할당 할 수 있어야 한다.
  2. 객체의 인자로 넘길 수 있어야 한다.
  3. 객체의 리턴값으로 리턴 할수 있어야 한다.

 

인터페이스

클래스 구현과 마찬가지로 람다식을 구현하기 위해서는 인터페이스가 존재해야함.

단, 단 하나의 추상 메소드만 인터페이스 안에 존재해야 람다식이 구현이 된다.

//단 하나의 추상 메소드만 포함할 수 있게 하는 어노테이션 @FunctionalInterface 
@FunctionalInterface 
interface Cal { 
	int apply(int x, int y); 
} 

Cal add = (x, y) -> x + y;
Cal sub = (x, y) -> x - y;

 

람다식 문법

//기본구조
// 인자 -> 바디
(int a, int b) -> { return a + b; }

//가능한 문법
// 인자 타입 생략 - interface를 이용하여 컴파일러가 추론 
(a, b) -> { return a + b; }
// 하나의 statement의 경우 중괄호 생략 가능 (리턴문 제외)
(a, b) -> a + b ;
// 인자가 하나인 경우 인자 괄호 생략 가능
a-> a * 2 ;
// 인자가 없으면 빈 괄호로 표시 
() -> System.out.println("hi joeylee") ;
// 메소드 참조 Method reference 
// (value -> System.out.println(value)) 의 축약형 
System.out::println

//잘못된 문법
//두개 이상의 인자의 경우 소괄호 생략 불가
a, b -> {return a + b;}
//리턴, 두개 이상의 statement의 경우 중괄호 생략 불가
a -> return a;
a -> System.out.println(a);
     a = a + 1;

 

람다식, 익명 함수 구현, 클래스 구현 예시

  • 람다식
interface Cal { 
	int apply(int x, int y); 
} 

Cal cal = (x, y) -> x + y;
cal.apply(1,2);
  • 익명 함수 구현
interface Cal { 
	int apply(int x, int y); 
} 

Cal cal = new Cal(){
	@Override
    int apply(int x, int y){
    	int c = x + y;
    	return c;
}
cal.apply(1,2);
  • 클래스 구현
interface Cal { 
	int apply(int x, int y); 
} 

public class Add implements Cal{
	int apply(int x, int y){
    	int c = x + y;
        return c;
    }
}

Cal cal = new Add();
cal.apply(1,2);