자바스크립트 화살표 함수와 비슷하게 쓰임
단 자바스크립트는 => 이렇게 쓰였다면 자바는 -> 이렇게 사용함
람다식은 함수형 프로그래밍 기법을 지원하는 자바의 문법요소임
간단히 말해서 메서드를 하나의 식으로 표현한 것으로 코드를 매우 간결하면서 명확하게 표현할수 있다는 장점있음
람다식(Lambda Expression)이란 함수를 하나의 식(expression)으로 표현한 것이다. 함수를 람다식으로 표현하면 메소드의 이름이 필요 없기 때문에, 람다식은 익명 함수(Anonymous Function)의 한 종류라고 볼 수 있다.
람다식의 특징
람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주된다.
람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없다.
람다식의 장점
코드를 간결하게 만들 수 있다.
식에 개발자의 의도가 명확히 드러나 가독성이 높아진다.
함수를 만드는 과정없이 한번에 처리할 수 있어 생산성이 높아진다.
병렬프로그래밍이 용이하다.
람다식의 단점
람다를 사용하면서 만든 무명함수는 재사용이 불가능하다.
디버깅이 어렵다.
람다를 남발하면 비슷한 함수가 중복 생성되어 코드가 지저분해질 수 있다.
재귀로 만들경우에 부적합하다.
객체지향적 언어의 특성을 가진 자바의 특성에 따라 일반적인 함수가 아니라 익명의 객체이기 때문에 기존 자바의 문법 요소를 해치지 않으면서 함수형 프로그래밍 기법을 사용할 수 있는 함수형 인터페이스(functional interface)가 만들어지게 됨
//기존 메서드 표현 방식
void sayhello() {
System.out.println("HELLO!")
}
//위의 코드를 람다식으로 표현한 식
() -> System.out.println("HELLO!")
int sum(int num1, int num2) {
return num1 + num2;
}
(int num1, int num2) -> { // 반환타입과 메서드명 제거 + 화살표 추가
return num1 + num2;
}
(int num1, int num2) -> num1 + num2;
// 기존 방식
void example1() {
System.out.println(5);
}
// 람다식
() -> {System.out.println(5);}
// 기존 방식
int example2() {
return 10;
}
// 람다식
() -> {return 10;}
이런식으로 활용가능함
함수형 인터페이스
// sum 메서드 람다식
(num1, num2) -> num1 + num2
// 람다식을 객체로 표현
new Object() {
int sum(int num1, int num2) {
return num1 + num1;
}
}
public class LamdaExample1 {
public static void main(String[] args) {
/* Object obj = new Object() {
int sum(int num1, int num2) {
return num1 + num1;
}
};
*/
ExampleFunction exampleFunction = (num1, num2) -> num1 + num2;
System.out.println(exampleFunction.sum(10,15));
}
@FunctionalInterface // 컴파일러가 인터페이스가 바르게 정의되었는지 확인하도록 합니다.
interface ExampleFunction {
int sum(int num1, int num2);
}
// 출력값
25
람다식은 익명이라 재활용이 불가능한것을 보완하기 위하여 interface 에 담고 활용
package com.choongang;
@FunctionalInterface
public interface MyFunctionalInterface {
// void accept();
void accept(int n);
}
package com.choongang;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
// MyFunctionalInterface example =
// () -> {
// System.out.println("람다식 호출");
// };
// example.accept();
MyFunctionalInterface example =
(num) -> {
System.out.println("람다식 호출\n".repeat(num));
};
Consumer<Integer> exmaple1 =
(Integer num) -> {
System.out.println("컨슈머 호출\n".repeat(num));
};
example.accept(3);
exmaple1.accept(3);
}
}
메서드 레퍼런스
(left, right) -> Math.max(left, right)
(left, right) -> Math::max
// 클래스이름::메서드이름
Math :: max // 메서드 참조
IntBinaryOperator operato = Math :: max; //메서드 참조
---------------------------------------
클래스 :: 메서드
---------------------------------------
참조 변수 :: 메서드
//Calculator.java
public class Calculator {
public static int staticMethod(int x, int y) {
return x + y;
}
public int instanceMethod(int x, int y) {
return x * y;
}
}
///////////////////////////////////
```java
import java.util.function.IntBinaryOperator;
public class MethodReferences {
public static void main(String[] args) throws Exception {
IntBinaryOperator operator;
/*정적 메서드
클래스이름::메서드이름
*/
operator = Calculator::staticMethod;
System.out.println("정적메서드 결과 : " + operator.applyAsInt(3, 5));
/*인스턴스 메서드
인스턴스명::메서드명
*/
Calculator calculator = new Calculator();
operator = calculator::instanceMethod;
System.out.println("인스턴스 메서드 결과 : "+ operator.applyAsInt(3, 5));
}
}
/*
정적메서드 결과 : 8
인스턴스 메서드 결과 : 15
*/
```
이 뿐만이 아닌 클래스도 축약 가능
(a,b) -> new 클래스(a,b)
//생성자 참조 문법
클래스 :: new
'IT > JAVA' 카테고리의 다른 글
JAVA - 파일 입출력(I/O) (0) | 2024.12.03 |
---|---|
JAVA - 스트림(Stream) (0) | 2024.12.02 |
JAVA - 애너테이션(Annotation) (1) | 2024.12.02 |
JAVA - 컬렉션 프레임 워크 (0) | 2024.12.02 |
JAVA - Collection 3) 예외처리 (1) | 2024.11.29 |