람다
람다는 메서드를 하나의 식으로 표현한 것이다.
메서드를 일일히 선언해서 만들지 않아도 간단한 수학식처럼 간결하고 명확하게 표현이 가능하다.
람다식 만들기
두 수를 더하는 메서드가 있다고 하자
int sum(int num1, int num2) {
return num1 + num2;
}
이 메서드를 일단 람다식으로 만들면
(int num1, int num2) -> { // 반환타입과 메서드명 제거 + 화살표 추가
return num1 + num2;
}
위와 같이 메서드 명이 없어지고, 화살표(중요, 얘 있어야 댐)가 추가되고, 중괄호 안에 동작 내용(실행문)이 적힌다.
여기서 반환값이 있는 메서드는 return과 세미콜론(;)을 생략 가능하다.
(int num1, int num2) -> {
num1 + num2
}
여기서 또 중괄호 없애고, 바로 반환값을 줄 수 있다. (실행문이 하나만 있기 때문)
(int num1, int num2) -> num1 + num2
여기서 또또 매개변수 타입이 쉽게 유추되는 경우면 (사실, 숫자 두개를 단순히 더하는거니까) 매개변수 타입을 생략 가능하다.
(num1, num2) -> num1 + num2
뭔가 엄청 축약된 람다식 완성
함수형 인터페이스
자바에서 함수는 클래스 안에서 정의 되어야 하기 때문에 메서드 독립으로 있을 수 없다.
그렇기 때문에 클래스 객체를 생성 후 이객체로 메서드를 호출해야 한다.
그래서, 람다식도 사실 객체이다.
위에서 메서드 이름을 지운것도 볼 수 있는데, 이름이 없는 상태이기 때문에 이를 익명클래스 라고 한다.
코드 예시
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 {
public abstract int sum(int num1, int num2);
}
// 출력값
25
위의 코드에서 ExamplFunction 을 이용해서 객체를 만들고 그 안에 람다식을 넣엇다.
그리고, 해당 객체에 sum메서드를 호출해서 10, 15를 넣은 것을 볼 수 있다.
(기존의 인터페이스 문법을 활용하여 람다식을 다루는 것이다. )
이처럼 람다식과 인터페이스의 메서드가 1:1로 매칭되어 동작해야 한다.
매서드 래퍼런스
람다식으로 메서드를 호출 할 수 있다.
만약, 두 개의 수 중 큰 수를 내놓는 메서드가 선언 되어 있다고 하면,
코드 예시
(left, right) -> Math.max(left, right);
위와 같이 작성이 가능하다.
이 경우, 입력값과 출력값의 반환타입을 쉽게 유추 할 수 있기 때문에 입력, 출력값을 적어주지 않아도 된다.
// 클래스이름::메서드이름
Math :: max; // 메서드 참조
고러면 이렇게 또 간단한 람다식이 생겨난다.
IntBinaryOperator 인터페이스는 두 개의 int 매개값을 받아 int 값을 리턴하므로, Math::max 메서드 참조를 대입할 수있다.
IntBinaryOperator operato = Math :: max; //메서드 참조
정적 메서드를 참조 할 때
클래스 :: 메서드
인스턴스 메서드를 참조 할 때
참조 변수 :: 메서드
생성자 참조
메서드 참조는 생성자 참조도 포함된다.
생성자 참조 = 객체생성
객체를 생성하고 반환하도록 구성된 람다식은 생성자 참조로 대체 가능하다.
코드 예시
(a,b) -> {return new 클래스(a,b);};
//생성자 참조 문법
클래스 :: new
생성자가 오버로딩되서 어러개 있으면, 함수형 인터페이스의 추상 메서드와 동일한 매개 변수 타입과 개수를 가지고 있는 생성자를 찾아 실행한다.
'백엔드 > JAVA_이론공부' 카테고리의 다른 글
JAVA_스레드 (0) | 2022.09.28 |
---|---|
JAVA_스트림, 파일입출력 (0) | 2022.09.28 |
JAVA_애너테이션 (0) | 2022.09.28 |
JAVA_제네릭 (0) | 2022.09.28 |
JAVA_열거형 (0) | 2022.09.28 |