우와한 개발자

[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
    }
}

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기