[Java] 람다표현식(Lambda Expression) / 함수형 인터페이스 / 메서드 참조 연산(::)
by 우와한개발자
[ 람다 표현식 ]
(parameter1, parameter1, ...) -> {body}
- 람다 표현식은 주로 함수형 인터페이스와 함께 사용
- 즉, 하나의 추상 메서드만 가진 인터페이스를 구현해야할 때 주로 사용됨.
1) 람다식 매개변수
| 매개변수 개수 | 소괄호 |
| 0개 | 필수 |
| 1개 | 생략 가능 |
| 2개 이상 | 필수 |
| 타입 명시 | 필수 |
Function<String, String> f = s -> s.toUpperCase();
BinaryOperator<Integer> add = (a, b) -> a + b;
Supplier<String> s = () -> "hello";
Function<String, String> f = (String s) -> s.toUpperCase();
2) 한 줄(표현식 람다)
- 식(expression) 하나면 {} 없이 가능
- 반환 타입이 있으면 return도 보통 안 씀
Function<String, String> f = s -> s.toUpperCase();
Predicate<Integer> p = n -> n > 0;
Consumer<String> c = s -> System.out.println(s);
3) 여러 줄 (블록 람다)
- 여러 문장을 쓰려면 {}를 써야 함
- 반환값이 있는 경우 return을 명시해야 함
Function<String, String> f = s -> {
String trimmed = s.trim();
String upper = trimmed.toUpperCase();
return upper; // ✅ 블록이면 return 필요
};
1. 함수형 인터페이스
- 함수형 인터페이스 : 오직 하나의 추상 메서드만 가지는 인터페이스 (상속받은 추상메서드 제외하고 인터페이스 고유의 추상 메서드)
- 주요 함수형 인터페이스
| 기호 | 의미 |
| T | Type (일반적인 타입) |
| E | Element (컬렉션 요소 타입) |
| K | Key (Map의 키 타입) |
| V | Value (Map의 값 타입) |
| N | Number (숫자 타입) |
| R | Return (반환 타입) |
| U | Another Type (두 번째 타입, 보조 타입) |
| S | Another Type (세 번째 타입 등 추가 타입) |
| ? | 와일드카드 (구체 타입 미정) |
| 인터페이스 | 메서드 | 반환값 | 설명 |
| Supplier<T> | T get() | T | 매개변수 없이 결과 값을 반환. 데이터를 생산(제공)하는 역할 |
| Consumer<T> | void accept(T t) | void | 하나의 값을 받아 소비. 출력·저장 등 처리만 수행 |
| Function<T, R> | R apply(T t) | R | 하나의 값을 받아 다른 타입의 결과 반환. 변환/매핑 작업 |
| Predicate<T> | boolean test(T t) | boolean | 조건을 검사하여 true/false 반환. 조건 판별 및 필터링에 사용 |
| UnaryOperator<T> | T apply(T t) | T | 동일한 타입의 결과 반환. 값 변경/가공에 사용 |
| BinaryOperator<T> | T apply(T t1, T t2) | T | 두 값을 받아 동일한 타입 결과 반환. 값의 결합(덧셈, 문자열 연결 등)에 사용 |
2. 메서드 참조 연산자 (::)
- 메서드 참조는 항상 함수형 인터페이스 타입이 필요하다.
1) 정적 메서드 참조
클래스명::정적메서드명
- 클래스 이름과 메서드 이름을 사용해 정적메서드 참조
2) 인스턴스 메서드 참소
객체참조변수명::메서드명
3)생성자 참조
클래스명::new
- 객체가 아니라 생성자를 가리키는 함수라서 변수에 바로 대입할 수 없고, 반드시 Supplier 같은 함수형 인터페이스 타입에 담아야함.
public class Parent{
public void method(){};
public static void main(String[] args) {
Supplier<Parent> instance = Parent::new; // ✅ 가능
// Parent instance = Parent::new; // ❌ 불가능
}
}
[ 전체 코드 ]
더보기
import java.util.function.Function;
import java.util.function.Supplier;
public class MethodRefQuickExample {
// 정적 메서드
static String upperStatic(String s) { return s.toUpperCase(); }
// 인스턴스 메서드
String upperInstance(String s) { return s.toUpperCase(); }
public static void main(String[] args) {
// 1) 정적 메서드 참조: 클래스명::정적메서드명
Function<String, String> f1 = MethodRefQuickExample::upperStatic;
// 2) 인스턴스 메서드 참조: 객체참조변수명::메서드명
MethodRefQuickExample obj = new MethodRefQuickExample();
Function<String, String> f2 = obj::upperInstance;
// 3) 생성자 참조: 클래스명::new
Supplier<MethodRefQuickExample> maker = MethodRefQuickExample::new;
System.out.println(f1.apply("static")); // STATIC
System.out.println(f2.apply("instance")); // INSTANCE
System.out.println(maker.get().upperInstance("new")); // NEW
}
}
'언어 > Java' 카테고리의 다른 글
| [Java] 어노테이션(Annotation)이란? 개념과 특징, 주요 어노테이션 정리 (0) | 2026.03.03 |
|---|---|
| [Java] 스트림(Stream)이란? 개념과 주요 메서드, 직렬/병렬 스트림 (0) | 2026.03.03 |
| [Java] 예외(Exception) - try catch문, throws, throw , 예외 종류 (0) | 2026.03.02 |
| [Java] 객체지향 프로그래밍 - 인터페이스(Interface)란? (0) | 2026.03.02 |
| [Java] 객체지향 프로그래밍 - final, abstract (0) | 2026.02.27 |
블로그의 정보
우와한개발자 님의 블로그
우와한개발자