// 이런 코드가 계속 반복되는 거죠...
dataMap.put( "name", StringUtil.equals(dataBean.getPrivateYn(), "Y") ? "비공개": dataBean.getName() );
dataMap.put( "question", StringUtil.equals(dataBean.getPrivateYn(), "Y") ? "비공개": dataBean.getQuestion() );
dataMap.put( "title", StringUtil.equals(dataBean.getPrivateYn(), "Y") ? "비공개":dataBean.getTitle() );
이번 유지보수 업무를 하다 중복되는 get 메소드를 중복해서 호출해야하는 상황이 있었다.
똑같이 privateYn이 "Y"인지 확인하는 로직인데, 뒤에 불러와야 하는 get 메소드만 getTitle(), getCtgNm1() 등등 다 달랐다.
'어떻게 하면 이 똑같은 로직을 한 번에 해결할 수 있을까?' 고민하다가, 자바 8에 추가된 신박한 기능들을 알게 되어서 정리해봤습니다.
1. Supplier<String>: 요청하면 값을 '공급'해줌
Supplier는 자바 8에서 추가된 함수형 인터페이스라는 인데, 말 그대로 '공급자' 역할을 한다.
- 하는 일: 아무런 입력값 없이, 요청이 오면 특정 타입의 값을 '공급'해줌
- 사용법: Supplier<T> 형태로 쓰는데, <T>에 우리가 받을 값의 타입을 넣어주면 됨.
- Supplier<String>: 문자열(String)을 공급해 줘!
- Supplier<Integer>: 숫자(Integer)를 공급해 줘!
이 안에는 get()이라는 메소드 하나만 있는데, 이 메소드를 호출하면 딱! 정해진 값을 뱉어낸다.
나는 그래서 중복된 코드를 줄이기 위해 아래와 같이 코드를 만들었다!
import java.util.function.Supplier;
public String getPublicValue(ExampleBean bean, Supplier<String> valueSupplier) {
if ("Y".equals(bean.getPrivateYn())) { // privateYn이 Y면
return "비공개"; // 무조건 "비공개"를 반환해!
} else { // 아니면
return valueSupplier.get(); // Supplier가 공급해주는 값을 반환해줘!
}
}
2. Supplier는 사용하는 람다! 그 중, :: (메소드 레퍼런스)
::는 "메소드 레퍼런스" 라고 부르는 문법인데, 쉽게말해 () -> dataBean.getTitle() 같은 람다식을 더 간단하게 쓸 수 있게 해준다!
| 람다식(Lambda) | 메소드 레퍼런스 |
| () -> dataBean.getTitle() | dataBean::getTitle |
| () -> new ArrayList<String>() |
ArrayList::new
|
'객체::메소드' 형태로 사용하는데, " 이 객체의 이 메소드를 쓸꺼야! " 라고 딱 지정해주는 느낌이다!
위의 Supplier<String> 과 함께 쓰면 아래처럼 위에서 만든 메소드를 사용할 수 있다.
dataMap.put("title", getPublicValue(dataBean, dataBean::getTitle));
dataMap.put("name", getPublicValue(dataBean, dataBean::getName));
dataMap.put("question", getPublicValue(dataBean, dataBean::getQuestion));
// 람다식을 사용한 예시: 람다식으로는 복잡한 로직도 전달 가능
dataMap.put("question", getPublicValue(dataBean,
() -> StringUtils.replace(dataBean.getQuestion(), "\n", " ")));
4. 왜 Supplier와 ::를 사용해야 할까?
Supplier와 메소드 레퍼런스를 활용하면 다음과 같은 중요한 이점을 얻을 수 있다.
- 코드 간결성 및 가독성: 반복되는 코드를 제거하고, 로직을 한 곳에 모아 코드를 더 읽기 쉽게 만듭니다.
- 재사용성: 특정 기능을 추상화하여 다양한 곳에서 재사용할 수 있는 유연한 코드를 만들 수 있습니다.
- 유지보수성: 로직 변경이 필요할 때 한 곳만 수정하면 되므로, 유지보수가 훨씬 용이해집니다.
정말 파도파도 끝이없는 라이브러리들과..함수들...
매번 할때마다 새롭다...
'Self Study > Java' 카테고리의 다른 글
| Spring MVC 에서 React 로 전환 (1) | 2025.07.28 |
|---|---|
| [JAVA] ImmutableMap : 변경 불가능한 맵(Map) (1) | 2024.07.08 |
| [JAVA] instanceof 연산자 : 인스턴스의 타입을 확인 (0) | 2024.07.01 |
