Armeria12

오늘 배운 것

Armeria 이슈

1

Java 함수형 인터페이스와 람다 구조 이해하기

1. 함수형 인터페이스란?

  • 메서드 하나만 가진 인터페이스
  • 람다식으로 간단하게 구현 가능
  • 예시:
    @FunctionalInterface
    interface StringProvider {
      String provide(int number);
    }
    

2. 람다식으로 구현하기

(((java StringProvider provider = (num) -> “숫자는 “ + num; System.out.println(provider.provide(10)); // “숫자는 10” )))

  • provider함수 객체(StringProvider)
  • 실제 실행(provide) 시 반환값은 String

3. 메서드에서 Provider 반환하기

static StringProvider composeProvider() {
    return (num) -> {
        if (num > 0) return "양수";
        else if (num < 0) return "음수";
        else return "제로";
    };
}
  • 외부: StringProvider 자체(= 함수)를 반환
  • 내부: 함수 실행 시 String을 반환

4. 실제 코드 예시 (Armeria 내부)

private static DescriptiveTypeInfoProvider composeDescriptiveTypeInfoProvider(
        @Nullable DescriptiveTypeInfoProvider descriptiveTypeInfoProvider) {
    return typeDescriptor -> {
        if (descriptiveTypeInfoProvider != null) {
            DescriptiveTypeInfo info = descriptiveTypeInfoProvider.newDescriptiveTypeInfo(typeDescriptor);
            if (info != null) return info;
        }

        for (DescriptiveTypeInfoProvider provider : SPI_DESCRIPTIVE_TYPE_INFO_PROVIDERS) {
            DescriptiveTypeInfo info = provider.newDescriptiveTypeInfo(typeDescriptor);
            if (info != null) return info;
        }

        return null;
    };
}

동작 방식

  1. 사용자 Provider 실행 (예: JacksonPolymorphismTypeInfoProvider)
  2. SPI Provider 순회 실행
  3. 모두 실패하면 null 반환

즉, 이 함수는 여러 Provider들을 묶어서 “가상의 Provider”를 만들어 반환한다.


5. 클래스 구현 vs 람다 구현

  • JacksonPolymorphismTypeInfoProvider클래스로 구현된 Provider
  • composeDescriptiveTypeInfoProvider람다로 구현된 Provider를 반환
  • 둘 다 결국 DescriptiveTypeInfoProvider 타입으로 사용할 수 있음

6. 한 줄 비유

  • 인터페이스(Provider) = 커피머신 규격
  • 클래스 구현체(JacksonProvider) = 정식 출시된 커피머신
  • 람다(→ { … }) = 임시로 만든 커피머신
  • 둘 다 버튼을 누르면 커피(DescriptiveTypeInfo)가 나온다.

results matching ""

    No results matching ""