람다식
- 람다식이란?
- 함수를 하나의 식으로 표현한 것
- 메소드의 이름이 필요없기 때문에 익명 함수의 한 종류
- 함수처럼 작성하지만 익명 구현 객체를 생성하는 방식으로 구동
- 병렬처리, 이벤트 처리와 같은 함수적 프로그래밍에서 쓰임
- 함수형 인터페이스의 인스턴스를 생성해 함수를 변수처럼 선언
- 람다식으로 선언된 함수는 일급 객체로 Stream API의 매개변수로 전달 가능
- 람다식은 함수형 인터페이스에 사용 가능
- 람다식 실행시 인터페이스 구현 객체(익명 구현 객체) 생성
// Lambda ex)
(매개변수1, 매개변수2 ...) -> {실행문 ...}
() -> {
System.out.println("Hello");
};
- 람다식 장점
- 불필요한 반복문 삭제, 복잡한 식 단순화를 통해 코드가 간결, 가독성이 높아짐
- 지연연산을 수행함으로 불필요한 연산을 최소화
- 멀티 쓰레드를 활용한 병렬처리 용이
- 람다식 단점
- 람다식의 호출이 까다로움
- 람다 stream 사용시 단순 반복문을 사용하면 성능이 떨어짐
- 불필요하게 남발하면 오히려 가독성이 떨어짐
- 람다를 사용해 만든 함수는 재사용이 불가
- 재귀 형태로 만들 경우 부적합
함수형 인터페이스(functional interface)
- 함수형 인터페이스 정의
- 함수를 변수처럼 선언 가능
- 간결한 코드 작성 가능
- 람다식으로 생성된 순수 함수는 함수형 인터페이스로만 선언이 가능
// 함수형 인터페이스 어노테이션
@FunctionalInterface
public interface Calculation {
int cal(int a, int b);
}
public class Main {
public static void main(String [] args) {
//람다식을 함수형 인터페이스 타입 변수에 대입
Calculation calc = (a, b) -> a * b;
System.out.println(calc.cal(10,11)); // 110 출력
}
}
- "@FunctionalInterface" 어노테이션
- 함수를 일급 객체처럼 다룰수 있게 해주는 어노테이션
- 인터페이스에 선언해 단 하나의 추상 메서드만 갖도록 제한하는 역할
- 2개 이상의 메서드가 선언되면 컴파일러를 통해 오류 발생
표준 API 함수형 인터페이스
java.util.function 표준 API 패키지 함수형 인터페이스
이름 | 매개 변수 |
리턴값 | 메서드 형태 |
Consumer | O | X |
void accept(T t) |
Supplier | X | O |
T get() |
Function | O | O |
R apply(T t) |
Operator | O | O |
T apply(T t) |
Predicate | O | O |
boolean test(T t) |
- Consumer 함수형 인터페이스
- Supplier 함수형 인터페이스
- Function 함수형 인터페이스
- Operator 함수형 인터페이스
- 역할 - 매개 변수 계산해서 동일 타입으로 반환
- Predicate 함수형 인터페이스
- 역할 - 매개 변수 확인해서 boolean 값 반환
메서드 참조(Method Reference)
- 메서드 참조란?
- 함수형 인터페이스를 람다식이 아닌 일반 메서드를 참조시켜 선언하는 방법
- 람다식이 단 하나의 메서드만 호출하는 경우, 해당 람다식에서
불필요한 매개변수를 제거하고 사용
- 함수형 인터페이스 매개변수 타입, 개수, 반환형과
일반 메서드의 매개변수 타입, 개수, 반환형이 모두 일치해야함
- 일반 메서드, static 메서드, 생성자 모두 참조 가능
- 클래스 명::메서드 명 or 참조변수명::메서드 명으로 참조
- 메서드를 호출하는 것이 아닌 참조
// Method Reference ex)
@FunctionalInterface
public interface MathInterface { // 함수형 인터페이스
// 정수형 반환, 정수형 매개 변수 2개인 추상 메서드
int get(int a, int b);
}
public class Main {
public static void main(String [] args) {
// 람다식 표현 방식
MathInterface i = (a,b) -> Math.max(a,b);
//메서드 참조 방식
/* Math 클래스의 max()과 MathInterface get()의
반환 타입, 매개 변수 타입, 개수가 동일하기에 참조 가능 */
MathInterface i = Math::max;
System.out.println(i.get(5,6));
}
}
Leave a comment