람다식 (Lambda Expression)
: 함수를 하나의 식으로 표현한 것
- 함수를 람다식으로 표현하면 메소드의 이름이 필요없기 때문에 람다식은 익명함수의 한 종류라고 볼 수 있음

- 기존 함수와는 다르게 메소드 명이 필요하지 않으며, 괄호()와 화살표 ->를 이용해 함수를 선언함
- 불필요한 코드를 줄이고, 가독성을 높이기 위해 등장
- 함수형 인터페이스의 인스턴스를 생성하여 함수를 변수처럼 선언하는 람다식에서는 메소드의 이름이 불필요하다고 여겨져 사용하지 않음
-> 컴파일러가 문맥을 살펴 타입을 추론함
1. 람다식 특징
- 람다식 내에서 사용되는 지역변수는 final이 붙지 않아도 상수로 간주
- 람다식으로 선언된 변수명은 다른 변수명과 중복될 수 없음
2. 람다식의 장점
- 코드를 간결하게 만들 수 있음
- 식에 개발자의 의도가 명확히 드러나 가독성이 높아짐
- 함수를 만드는 과정 없이 한 번에 처리할 수 있어 생산성이 높아짐
- 병렬 프로그래밍이 용이함
3. 람다식의 단점
- 람다를 사용하면서 만든 익명 함수는 재사용이 불가능함
- 디버깅이 어려움
- 람다를 남발하면 비슷한 함수가 중복 생성되어 코드가 지저분해질 수 있음
- 재귀로 만들 경우 부적합
함수형 인터페이스(Functional Interface)
: 추상 메소드가 하나인 인터페이스
- default 메소드 & static 메소드를 여러개 가지고 있더라도 추상 메소드가 하나면 함수형 인터페이스
- 자바의 람다식은 함수형 인터페이스를 반환
- 함수형 인터페이스를 구현하기 위해서는 인터페이스를 개발하여 내부에는 1개 뿐인 abstract 함수를 선언하고, 위에는
@FunctionalInterface 어노테이션을 붙여주면 됨

- 람다식으로 생성된 순수 함수는 함수형 인터페이스로만 선언이 가능함
cf) 순수 함수 vs 일반 함수
▶ 순수 함수
: 항상 같은 입력 -> 같은 출력
- 부작용이 없음
- 외부 변수를 바꾸거나, 콘솔에 출력하거나, DB 접근이 없음
=> 예측이 가능하고, 디버깅 / 테스트가 쉬움
▶ 일반 함수
: 입력이 같아도 출력이 달라질 수 있음
- 부작용이 있음
- 파일 쓰기, 콘솔 출력, DB 접근, 전역 변수 변경 등
- 순수 함수 EX)
int add(int a, int b) {
return a + b;
}
- 일반 함수 EX)
int addWithLog(int a, int b) {
System.out.println("덧셈 수행 중");
return a + b;
}
자바에서 제공하는 함수형 인터페이스
1. Supplier
: 아무것도 안받고, 뭔가를 만들어주는 애
- 입력은 없지만 출력은 있음
- 매개변수 없이 반환값만을 갖는 함수형 인터페이스
- T get()을 추상 메소드로 갖고 있음
@FunctionalInterface
public interface Supplier<T> {
T get(); // 인자 없이 값 하나를 리턴함
}

- 사용 EX)

- orElseGet(Supplier)는 값이 없을 때만 실행
- 테스트나 의존성 주입할 때 공급자 역할
2. Consumer
: 뭔가를 받아서 소비만 하는 애
- 입력값은 있지만 return 값은 없음
- 객체 T를 매개변수로 받고, 반환값은 없음
- andThen이라는 함수를 제공하는데, 이를 통해 하나의 함수가 끝난 후 다음 Consumer를 연쇄적으로 이용할 수 있음
- 함수형에서 함수는 값의 대입 또는 변경 등이 없기 때문에
-> Consumer가 Split으로 데이터를 변경하더라도 원본의 데이터는 유지됨
@FunctionalInterface
public interface Consumer<T> {
void accept(T t); // T 타입의 값을 받아서 사용하지만, 반환은 없음
}

- 사용 EX)
- forEach에서 자주 사용
- 콜백 처리
- DB 저장
3. Function < T, R >
: 객체 T를 매개변수로 받아서 처리한 후, R로 반환
- Consumer와 마찬가지로 andThen을 제공하고, 추가적으로 compose를 제공
- andThen()
: 첫 번째 함수가 실행된 이후, 다음 함수를 연쇄적으로 실행하도록 연결해줌
- compose()
: 첫 번째 함수 실행 이전에 먼저 함수를 실행하여 연쇄적으로 연결해줌
- identity()
: 자기 자신을 반환하는 static 함수
- 사용 EX)

4. Predicate < T >
: 객체 T를 매개변수로 받아 처리한 후, boolean을 반환
- Boolean test( T t ) 추상 메소드를 갖고 있음
- 사용 EX)

메소드 참조(Method Reference)
: 함수형 인터페이스를 람다식이 아닌 일반 메소드를 참조시켜 선언하는 방법
- 일반 메소드를 참조하기 위해 3가지 조건을 만족해야 함
- 함수형 인터페이스의 매개변수 타입 == 메소드의 매개변수 타임
- 함수형 인터페이스의 매개변수 개수 == 메소드의 매개변수 개수
- 함수형 인터페이스의 반환형 == 메소드의 반환형
- 참조 가능한 메소드는 일반 메소드, static, 생성자가 있고 클래스 이름 :: 메소드 이름으로 참조할 수 있음
- 일반 메소드 참조)

- static 메소드 참조)

- 생성자 참조)

- 생성자도 메소드 참조를 할 수 있음
- 생성자는 new로 생성해주므로, 클래스 이름 :: new로 참조할 수 있음
'JAVA' 카테고리의 다른 글
16. Generic (1) | 2025.04.29 |
---|---|
15. Default Method & 추상 클래스 & 인터페이스 (0) | 2025.04.29 |
13. 자바 8의 특징 (1) | 2025.04.17 |
12. 비동기처리 문법 비교 (0) | 2025.04.17 |
11. Error & Exception 2 (0) | 2025.04.17 |