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;
};
}
동작 방식
- 사용자 Provider 실행 (예:
JacksonPolymorphismTypeInfoProvider
) - SPI Provider 순회 실행
- 모두 실패하면
null
반환
즉, 이 함수는 여러 Provider들을 묶어서 “가상의 Provider”를 만들어 반환한다.
5. 클래스 구현 vs 람다 구현
JacksonPolymorphismTypeInfoProvider
는 클래스로 구현된 ProvidercomposeDescriptiveTypeInfoProvider
는 람다로 구현된 Provider를 반환- 둘 다 결국
DescriptiveTypeInfoProvider
타입으로 사용할 수 있음
6. 한 줄 비유
- 인터페이스(Provider) = 커피머신 규격
- 클래스 구현체(JacksonProvider) = 정식 출시된 커피머신
- 람다(→ { … }) = 임시로 만든 커피머신
- 둘 다 버튼을 누르면 커피(
DescriptiveTypeInfo
)가 나온다.