자바 람다의 "타겟 타입(Target Type)"이란?

2024. 5. 27. 10:15High Level Programming Language/Learning the Java Language

람다의 타겟 타입(Target Type)은 자바에서 람다 표현식이 작동하는 핵심 개념 중 하나로,
람다를 사용할 수 있는 맥락과 타입 추론이 어떻게 이뤄지는지를 이해하는 데 중요합니다.

🎯 자바 람다의 "타겟 타입(Target Type)"이란?

✅ 정의

람다 표현식은 단독으로는 타입이 없습니다.
람다는 어떤 인터페이스에 대입되느냐에 따라 타입이 결정되며, 이 인터페이스 타입을 "타겟 타입(Target Type)"이라고 부릅니다.

 

자바에서 람다는 함수형 인터페이스(Functional Interface)에만 대입 가능하며,
람다가 대입되는 함수형 인터페이스가 곧 람다의 타겟 타입입니다.

📌 예제 1 – 기본적인 타겟 타입 사용

@FunctionalInterface
interface Printer {
    void print(String message);
}

public class LambdaExample {
    public static void main(String[] args) {
        Printer printer = msg -> System.out.println(msg);
        printer.print("Hello, Target Type!");
    }
}

🔍 여기서 타겟 타입은?

  • Printer printer = ... 이 문장에서 printer 변수의 타입이 Printer이므로,
  • msg -> System.out.println(msg)라는 람다의 타겟 타입은 Printer입니다.
  • Printervoid print(String message)를 갖는 함수형 인터페이스이므로,
  • 람다식의 파라미터 및 반환 타입을 이 메서드 시그니처에 따라 추론할 수 있습니다.

📌 예제 2 – 메서드 인자에서의 타겟 타입

@FunctionalInterface
public interface Runnable {
   
    public abstract void run();
    
}
public void execute(Runnable r) {
    r.run();
}

public void test() {
    execute(() -> System.out.println("Running!")); // Runnable이 타겟 타입
}
  • 위에서 Runnable이 타겟 타입입니다.
  • Runnablevoid run() 하나의 추상 메서드를 가지므로,
  • () -> System.out.println("Running!")는 이 메서드의 구현으로 간주됩니다.

🧠 타겟 타입의 작동 원리

자바 컴파일러는 람다 표현식을 다음과 같이 처리합니다:

  1. 람다가 사용된 문맥(context)을 보고
  2. 해당 문맥에서 기대되는 함수형 인터페이스 타입을 추론하고
  3. 이 인터페이스의 추상 메서드 시그니처를 기반으로
  4. 람다 표현식의 파라미터와 반환 타입을 추론

이 과정을 통해 타입이 없는 람다 표현식이 타입을 갖게 되는 것입니다.

⚠️ 주의사항 – 명시적 타겟 타입 없이 사용하면 오류

var lambda = msg -> System.out.println(msg); // ❌ 컴파일 에러
  • var로는 람다의 타입을 추론할 수 없습니다.
  • 람다에는 명시적인 타겟 타입이 필요합니다.
  • 해결 방법:
    Printer lambda = msg -> System.out.println(msg); // ✅ OK

📌 예제 3 – 메서드 참조에서도 타겟 타입이 결정

Consumer<String> printer = System.out::println;
  • System.out::println은 메서드 참조입니다.
  • 이 표현식의 타겟 타입은 Consumer<String>이고
  • Consumer<String>accept(String t)에 맞춰 메서드가 연결됩니다.

🔁 정리

개념 설명
타겟 타입(Target Type) 람다 표현식이 대입될 함수형 인터페이스 타입
왜 필요한가 람다식은 자체 타입이 없기 때문에 문맥을 통해 타입을 추론해야 함
결정 기준 대입되는 변수 타입, 메서드 파라미터 타입 등
관련 요소 함수형 인터페이스, 메서드 참조, 타입 추론
주의사항 var로 람다 선언 불가, 명확한 타겟 타입이 필요함

💬 요약

자바에서 람다는 단순한 "익명 함수"처럼 보이지만, 타겟 타입이 있어야만 존재할 수 있는 특수한 표현식입니다.
이 개념을 정확히 이해하면, 메서드 참조, 함수형 API 설계, 스트림 처리 등에서 훨씬 유연하고 타입 안정적인 코드를 작성할 수 있게 됩니다.