JAVA 람다식(Lamda Expression)

람다식이란?

람다식을 구글에 검색을 하면 아래와 같이 설명이 나온다.

람다식, 또는 람다 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(匿名函數, Anonymous functions)를 지칭하는 용어이다. ... 람다식은 주로 고차 함수에 인자(argument)로 전달되거나 고차 함수가 돌려주는 결과값으로 쓰인다
출처 - 나무위키 람다식

람다식은 FunctionalInterface의 구현체이다.

1. 기존 함수표현


	// 기존 함수표현
	public float getAverage(float num1, float num2) {
		return (num1 + num2) / 2;
	}

※ 변환예시

public float getAverage(float num1, float num2) -> { return (num1 + num2) / 2 ; }

2. 람다표현식

※ 람다표현식을 그냥 사용하면 오류가 발생한다. 람다표현식을 사용하기 위해서는 함수형 인터페이스가 꼭 필요하다.

	// 람다표현식을 사용한 표현
	(num1, num2) -> (num1 + num2) / 2

인터페이스

일반 인터페이스와의 차이점은 @FunctionalInterface라는 어노테이션을 붙인것인데 이 어노테이션을 붙이면 함수형 인터페이스의 형식을 컴파일러가 체크해서 오류를 알려준다. 함수형 인터페이스는 한개의 추상메소드만 가질 수 있다. 두개를 선언하면 컴파일러가 오류로 잡아낸다.

CalcAverage 인터페이스

/**
 * @author 왕꿀빵
 */
@FunctionalInterface
public interface CalcAverage {
	/**
	 * 두수의 평균을 계산하는 함수 이다.
	 * @param num1 매개변수 숫자1 
	 * @param num2 매개변수 숫자2
	 * @return 평균값
	 */
	float getAverage(float num1, float num2); 
	// public abstract float getAverage(float num1, float num2) 중 public abstract를 생략하였다.
}

람다식 이전방식
인터페이스가 존재하는다는 전재하에 아래코드를 람다식으로 변환 할 수 있다. 인터페이스가 존재하고 함수를 생성하며 재정의 하는 방식이 아닐 경우 람다식을 사용할 수 없다.

자바는 메소드가 독립적으로 존재할 수 없는 구조이기 때문에 메소드는 객체안에 존재하는 것을 원칙으로 한다.


//람다식 이전의 방식
CalcAverage funcBeforeLamda = new CalcAverage() {
	@Override
	public float getAverage(float num1, float num2) {
		return (num1 + num2) / 2;
	}
};

float funcBeforeLamdaAverVal = funcBeforeLamda.getAverage(191.2f, 121.5f);
System.out.println("[람다식이전] 평균  : " + funcBeforeLamdaAverVal);

람다표현식에서 파라미터 타입 함수명 리턴타입을 축약할 수 있는 이유는 인터페이스가 그 정보를 가지고 있기 때문이다.


// 람다표현식 방식
CalcAverage funcLamda = (num1 , num2) -> (num1 + num2)/2 ;
float funcLamdaAverVal = funcLamda.getAverage(191.2f, 121.5f);
System.out.println("[람다표현식] 평균  : " + funcLamdaAverVal);

람다식을 리턴타입으로 지정하여 함수를 전달 받은 값으로 함수를 수행할 수 있다.



// 함수의 리턴으로 구현한 람다식으로 평균을 구하는 예제
CalcAverage returnLamdaFunc = getCalcAverage();
float returnLamdaFuncAverVal = returnLamdaFunc.getAverage(191.2f, 121.5f);


// 리턴타입이 람다식
static CalcAverage getCalcAverage() { // 변환타입이 람다식 CalcAverage인 메서드
	return (num1 , num2) -> (num1 + num2)/2 ;
}

람다식을 매개변수로 넘겨서 함수를 호출할 수도 있다.


static void excuteCalcAverage(CalcAverage f, float num1, float num2) { // 매개변수의 타입이 MyFunction인 메서드
	System.out.println("[매개변수로 람다식(funcLamda)과 값을 받음] 평균  : " + f.getAverage(num1, num2));
}

// 람다표현식 방식
CalcAverage funcLamda = (num1 , num2) -> (num1 + num2)/2 ;
float funcLamdaAverVal = funcLamda.getAverage(191.2f, 121.5f);
System.out.println("[람다표현식] 평균  : " + funcLamdaAverVal);
	
// 매개변수로 람다식과 람다식으로 평균을 구하는 예제
excuteCalcAverage(funcLamda, 191.2f, 121.5f);

전체소스
/**
 * @author 왕꿀빵
 */
@FunctionalInterface
public interface CalcAverage {
	/**
	 * 두수의 평균을 계산하는 함수 이다.
	 * @param num1 매개변수 숫자1 
	 * @param num2 매개변수 숫자2
	 * @return 평균값
	 */
	float getAverage(float num1, float num2); 
	// public abstract float getAverage(float num1, float num2) 중 public abstract를 생략하였다.
}

/**
 * 
 * @author 왕꿀빵
 *
 */
public class DeveloperDiaryLamdaExpression {
	
	static void excuteCalcAverage(CalcAverage f, float num1, float num2) { // 매개변수의 타입이 MyFunction인 메서드
		System.out.println("[매개변수로 람다식(funcLamda)과 값을 받음] 평균  : " + f.getAverage(num1, num2));
	}
	
	static CalcAverage getCalcAverage() { // 변환타입이 람다식 CalcAverage인 메서드
		return (num1 , num2) -> (num1 + num2)/2 ;
	}
	
	public static void main(String[] args) {
		//람다식 이전의 방식
		CalcAverage funcBeforeLamda = new CalcAverage() {
			@Override
			public float getAverage(float num1, float num2) {
				return (num1 + num2) / 2;
			}
		};
		float funcBeforeLamdaAverVal = funcBeforeLamda.getAverage(191.2f, 121.5f);
		System.out.println("[람다식이전] 평균  : " + funcBeforeLamdaAverVal);
		
		// 람다표현식 방식
		CalcAverage funcLamda = (num1 , num2) -> (num1 + num2)/2 ;
		float funcLamdaAverVal = funcLamda.getAverage(191.2f, 121.5f);
		System.out.println("[람다표현식] 평균  : " + funcLamdaAverVal);
	
		// 매개변수로 람다식과 람다식으로 평균을 구하는 예제
		excuteCalcAverage(funcLamda, 191.2f, 121.5f);
		
		// 함수의 리턴으로 구현한 람다식으로 평균을 구하는 예제
		CalcAverage returnLamdaFunc = getCalcAverage();
		float returnLamdaFuncAverVal = returnLamdaFunc.getAverage(191.2f, 121.5f);
		System.out.println("[다른 함수의 리턴을 받은 람다표현식] 평균  : " + returnLamdaFuncAverVal);
	}
}

결과값

좋은 웹페이지 즐겨찾기