람다(Lambda) 함수는 프로그래밍 언어에서 사용되는 개념으로 익명 함수(Anonymous functions)를 지칭하는 용어이다.
현재 사용되고 있는 람다의 근간은 수학과 기초 컴퓨터과학 분야에서의 람다 대수이다.
람다 대수는 간단히 말하자면 수학에서 사용하는 함수를 보다 *단순하게* 표현하는 방법이다.
람다 대수는 이름을 가질 필요가 없다. 즉, 익명 함수 (Anonymous functions)이다.
람다식(Lambda)은 익명함수(anonymous function)을 생성하기 위한 식으로서 객체 지향 언어보다 *함수 지향 언어*에 가깝다.
자바에서 람다식의 사용 목적은 인터페이스에 정의된 메소드를 구현시 코딩양을 확 줄여서 간편하게 사용하는 것이 목적이다.
자바에서는 함수 단독으로는 사용할 수 없고 객체를 통해서만 사용이 가능한 형태이므로
자바에서 람다를 실행하려면 전제조건으로 먼저 FunctionalInterface(함수형 인터페이스)를 구현한 익명(무명)클래스 객체가 생성되어져 있어야만 한다.
람다는 FunctionalInterface(함수형 인터페이스)를 구현한 익명(무명)클래스 객체의 메소드로 동작하게 된다.
여기서 주의할 점은 FunctionalInterface(함수형 인터페이스)는 오로지 *딱 한개만의 추상메소드로 이루어져야 한다*는 것이다.
만약에 FunctionalInterface(함수형 인터페이스)에 두 개 이상의 메소드가 선언되면 자바 컴파일러는 오류를 발생시킨다.
함수형 인터페이스를 만드려면 @FunctionalInterface 어노테이션을 사용하면 된다.
▷ 람다식을 사용한 것과 사용하지 않은 것 비교
람다식을 사용하지 *않은* 것
====== Main 클래스 ======
public static void main(String[] args) {
System.out.println("=== 람다식(Lambda)을 사용하지 않은 것[무명(익명) 클래스를 사용한 것] ===");
Inter_functional_1 anonymous_obj = new Inter_functional_1() {
@Override
public void area(double x, double y, int type) {
switch (type) {
case 1:
System.out.println("가로 " + x + ", 세로 " + y +" 인 사각형의 면적: " + (x*y));
break;
case 2:
System.out.println("밑변 " + x + ", 높이 " + y +" 인 삼각형의 면적: " + (x*y*0.5));
break;
case 3:
System.out.println("장축의 반지름 " + x + ", 단축의 반지름 " + y +" 인 타원형의 면적: " + (x*y*3.141592f));
break;
default:
System.out.println("세번째 파라미터는 1 또는 2 또는 3만 가능합니다.");
break;
} // end of switch(type)---------------------------
} // end of public void area(double x, double y, int type)
}; // end of anonymous Class ------------------------------
anonymous_obj.area(10.5, 5.5, 1);
// 가로 10.5, 세로 5.5 인 사각형의 면적: 57.75
람다식을 사용한 것
System.out.println("\n=== 람다식(Lambda)을 사용한 것 ===");
// new 없다, 자바에서 () 는 생성자 아니면 메소드
// 인터페이스에 대한 메소드 재정의, 함수형 인터페이스= 메소드가 한개만 있어야 함
// 어차피 한개밖에 없으니까 메소드 이름 생략 가능
// 타입도 생략 가능(type 말고)
Inter_functional_1 lambda_obj = (x, y, type) -> {
switch (type) {
case 1:
System.out.println("가로 " + x + ", 세로 " + y +" 인 사각형의 면적: " + (x*y));
break;
case 2:
System.out.println("밑변 " + x + ", 높이 " + y +" 인 삼각형의 면적: " + (x*y*0.5));
break;
case 3:
System.out.println("장축의 반지름 " + x + ", 단축의 반지름 " + y +" 인 타원형의 면적: " + (x*y*3.141592f));
break;
default:
System.out.println("세번째 파라미터는 1 또는 2 또는 3만 가능합니다.");
break;
} // end of switch(type)---------------------------
}; // end of anonymous Class ------------------------------
lambda_obj.area(10.5, 5.5, 1);
// 가로 10.5, 세로 5.5 인 사각형의 면적: 57.75
▷ 람다식 표기 방법
1. 기본 표기방법 - 메소드 이름만 뺌
Inter_functional_3 lambda_operator_1 = (double a, double b, String type) -> {
// 1. 람다식(Lambda) 표기 기본방법 - 메소드 이름만 뺌
Inter_functional_3 lambda_operator_1 = (double a, double b, String type) -> {
// Inter_functional_3 인터페이스는 한개밖에 없음
double result = 0.0;
switch (type) {
case "+":
result = a+b;
break;
case "-":
result = a-b;
break;
case "*":
result = a*b;
break;
case "/":
result = a/b;
break;
default:
System.out.println("세번째 파라미터는 + - * / 만 가능합니다.");
break;
} // end of switch -----------------------------------
return result;
};
opr_result = lambda_operator_1.operator(10, 20, "-");
System.out.println(opr_result); // -10.0
2. 파라미터의 타입도 생략 가능 - 메소드이름, 파라미터 타입 생략
Inter_functional_3 lambda_operator_2 = (a, b, type) -> {
Inter_functional_3 lambda_operator_2 = (a, b, type) -> {
double result = 0.0;
switch (type) {
case "+":
result = a+b;
break;
case "-":
result = a-b;
break;
case "*":
result = a*b;
break;
case "/":
result = a/b;
break;
default:
System.out.println("세번째 파라미터는 + - * / 만 가능합니다.");
break;
} // end of switch -----------------------------------
return result;
};
opr_result = lambda_operator_2.operator(10, 20, "*");
System.out.println(opr_result); // 200.0
3. 실행명령문이 한개 라면 { }; 을 생략할 수 있다.
Inter_functional_4 lambda_search = (str) -> System.out.println("회원들 중 \""+str+"\" 을(를) 조회합니다.");
lambda_search.search("감자깡");
// 회원들 중 "감자깡" 을(를) 조회합니다.
4. 실행명령문이 한개 라면 파라미터를 감싸는 소괄호( ) 을 생략할 수 있다.
Inter_functional_4 lambda_search_2 = str -> System.out.println("회원들 중 \""+str+"\" 을(를) 조회합니다.");
lambda_search_2.search("양파링");
// 회원들 중 "양파링" 을(를) 조회합니다.
5. 파라미터의 개수가 두개 이상이라면 를 감싸는 소괄호( ) 을 생략할 수 없다.
/*
Inter_functional_3 lambda_operator_3 = a, b, type -> { // ( )가 없으므로 오류 발생함
double result = 0.0;
switch (type) {
case "+":
result = a+b;
break;
case "-":
result = a-b;
break;
case "*":
result = a*b;
break;
case "/":
result = a/b;
break;
default:
System.out.println("세번째 파라미터는 + - * / 만 가능합니다.");
break;
} // end of switch -----------------------------------
return result;
};
*/
6. 파라미터가 없는 람다식은 무조건 괄호()를 써야 한다.
Inter_functional_5 lambda_search_all = () -> {
System.out.println("1. 파라미터에 값이 없는 것은");
System.out.println("2. 모든 회원들을 조회합니다.");
};
lambda_search_all.searchAll();
/*
1. 파라미터에 값이 없는 것은
2. 모든 회원들을 조회합니다.
*/
7. 실행명령문이 한개더라도 return 이 있을 경우에는 { }; 을 생략할 수 없다.
Inter_functional_6 lambda_6 = (a,b) -> {return a+b;};
// Inter_functional_6 lambda_6 = (a,b) -> return a+b; *오류
System.out.println( lambda_6.plus(10,20) ); // 30
8. return 문만 있는 단일 코드인 경우에는 { }; 및 return 까지 생략할 수 있다.
Inter_functional_6 lambda_6_2 = (a,b) -> a+b;
System.out.println( lambda_6_2.plus(10,20) ); // 30
'Java' 카테고리의 다른 글
| 컬렉션(Collection) - 2. ArrayList (0) | 2022.06.28 |
|---|---|
| 콜렉션(Collection) - 1 (0) | 2022.06.28 |
| 익명(무명)클래스(anonymousClass) (0) | 2022.06.28 |
| Exception 생성하기 (0) | 2022.06.25 |
| Exception (0) | 2022.06.25 |