함수형 인터페이스 활용
357
여기에 질문 내용을 남겨주세요.
영한님, 항상 좋은 강의 감사드립니다! 🙇♂
최근에 람다와 함수형 인터페이스 강의를 들으며
그동안 아무 생각 없이 사용하던 optional 의 orElseThrow() 같은 메서드들이
사실 supplier 같은 함수형 인터페이스를 활용한 구조라는 걸 더 명확히 이해할수 있었던것 같습니다.
다만 한 가지 궁금한 점이 있습니다.
실무에서도 직접 함수형 인터페이스를 정의해서 사용하는 경우가 많은지 궁금합니다!
강의 덕분에 이제 개념은 어느 정도 이해했는데, 막상 제가 진행 중인 프로젝트에 “이걸 어떻게 녹여내야 유지보수성이 올라갈까?” 하는 부분이 아직 감이 잘 오지 않는것 같습니다.
혹시 영한님이 실무에서 함수형 인터페이스나 람다를 적용할 때 ‘이럴 때 쓰면 좋다’ 싶은 포인트가 있다면 조언 부탁드립니다!
항상 좋은 인사이트와 강의 주셔서 감사합니다 🙏
답변 1
1
안녕하세요. kdjin1215님
강의에서 말씀드린 것 처럼 함수형 인터페이스 자체가 대부분 이미 정의되어 있기 때문에, 직접 함수형 인터페이스를 정의해서 사용하는 경우는 드물고, 대신에 정의되어 있는 함수형 인터페이스를 활용하는 경우가 많습니다.
특히 실무에서는 전략 패턴 같은 것을 클래스를 만드는 대신 아주 간단히 람다(Lambda)로 구현하는 경우가 많습니다.
람다를 사용하면 익명 클래스나 별도의 구현 클래스 없이, 실행해야 할 코드 조각(로직)을 메서드의 인자로 직접 전달할 수 있기 때문입니다. 이것이 함수형 프로그래밍의 핵심적인 장점 중 하나입니다.
람다로 전략 패턴을 간결하게 구현하기
예를 들어, 상품 가격에 따라 다른 할인 전략을 적용해야 한다고 가정해 보겠습니다.
Before: 클래스를 사용하는 전통적인 방식
전략 패턴을 적용하기 위해 인터페이스와 여러 구현 클래스를 만들어야 했습니다.
// 1. 전략 인터페이스
interface DiscountStrategy {
int applyDiscount(int price);
}
// 2. 구체적인 전략 클래스들
class NewItemDiscount implements DiscountStrategy {
@Override
public int applyDiscount(int price) {
return (int) (price * 0.9); // 신상품 10% 할인
}
}
class SummerDiscount implements DiscountStrategy {
@Override
public int applyDiscount(int price) {
return price - 5000; // 여름 시즌 5000원 할인
}
}
// 3. 전략을 사용하는 컨텍스트
class PriceCalculator {
public int calculate(int price, DiscountStrategy strategy) {
return strategy.applyDiscount(price);
}
}
// 사용 예시
PriceCalculator calculator = new PriceCalculator();
int price1 = calculator.calculate(20000, new NewItemDiscount());
int price2 = calculator.calculate(30000, new SummerDiscount());
단순한 할인 로직 하나를 위해 인터페이스와 클래스를 여러 개 만들어야 해서 코드가 길고 복잡합니다.
After: 람다를 활용한 현대적인 방식
java.util.function.Function<T, R>이라는 이미 정의된 함수형 인터페이스를 활용하면, 별도의 클래스 없이 훨씬 간결하게 코드를 작성할 수 있습니다.
import java.util.function.Function;
class PriceCalculator {
// Function<Integer, Integer>가 DiscountStrategy 인터페이스 역할을 대체합니다.
public int calculate(int price, Function<Integer, Integer> discountStrategy) {
return discountStrategy.apply(price);
}
}
// 사용 예시
PriceCalculator calculator = new PriceCalculator();
// 신상품 할인 전략을 람다로 직접 전달
int price1 = calculator.calculate(20000, price -> (int) (price * 0.9));
// 여름 시즌 할인 전략을 람다로 직접 전달
int price2 = calculator.calculate(30000, price -> price - 5000);
NewItemDiscount, SummerDiscount 클래스가 모두 사라졌습니다. 대신 할인 로직을 람다 표현식으로 작성하여 calculate 메서드에 직접 전달했습니다. 코드의 양이 획기적으로 줄고, 어떤 로직이 적용되는지 한눈에 파악하기 쉬워집니다.
그 외에 컬렉션의 데이터 처리나, 비동기 작업의 콜백 처리에 주로 활용됩니다.
결론적으로 람다와 함수형 인터페이스는 '코드 조각(동작)'을 파라미터처럼 자유롭게 주고받기 위한 기술입니다. 이를 잘 활용하면 불필요한 클래스 생성을 줄이고, 코드의 의도를 더 명확하게 드러낼 수 있어 유지보수성이 높은 코드를 작성하는 데 큰 도움이 됩니다.
감사합니다.
방산 SW 개발자가 되기 위한 조언을 부탁드립니다!
1
98
1
JAVA로 백엔드 프로젝트
0
69
1
26년1회 실기 합격할수 있을까??ㅠㅠ
0
178
1
자바 실무 단계
0
314
2
진로가 큰 걱정입니다...
0
302
1
공부 방향
0
320
1
안녕하세요! 실무와 관련되서 질문드립니다!
0
337
1
WebFlux를 실무에 적용하기 전에 고민이 있습니다.
0
307
0
코딩테스트 준비
0
469
1
공부하다 진도를 못 나가고 있어요 ㅜㅜ
0
409
1
프로젝트를 하기 위한 커리큘럼
0
374
1
코드 리뷰 부탁드립니다!
1
382
1





