Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- a-d
- 잡담
- gulp
- spring5receipe
- spring configuration
- 일빵빵알파벳파닉스
- 나만재밌는이야기
- 프레디케이트
- 제대로알기
- 발음공부
- 일급함수
- es5
- 영속성컨텍스트
- 스프링구성
- 클린코드
- Java8
- 모던자바인액션
- 스프링5레시피
- JPA
- 메서드참조
- 엔티티매핑
- 다시보기연습
- 달리기를말할때내가하고싶은이야기
- 동작파라미터화
- 생각
- 영속성
- 객체지향생활체조원칙
- 람다
- ES6
- 1월의독서
Archives
- Today
- Total
notepad
CHAPTER 2. 동작 파라미터화 코드 전달하기 본문
해당 포스팅은 '모던 자바 인 액션'(라울-게이브리얼 우르마 외 2인 저) 책의 내용을 학습을 위해 정리한 내용입니다.
Goal
동작 파라미터화가 무엇인지 알아보자.
키워드
- Predicate : true/false를 반환하는, 선택 조건을 결정하는 인터페이스
- 전략패턴 :
Design Pattern 스트래티지 패턴이란 - Heee’s Development Blog- 익명클래스 : 이름 없는 클래스, 선언과 인스턴스화를 동시에 진행
- 람다 : 알아가보자.!
동작 파라미터란?
아직은 어떻게 실행할 것인지 결정하지 않은 코드블록을, 나중에 실행 될 메서드의 인수로 전달하는것.
동작을 담은 코드를 메서드 인자로 전달하는것
- 사용자의 요구사항은 계속 변한다.
- 추가된 요구사항을 처리하는 위해 우리는 계속해서 같은 코드 블록을 복사, 붙여넣기 하고 불필요한 코드를 작성하고, 코드는 점점 지저분하게 된다.
- 동작파라미터화 & 람다 사용을 통해 중복된 코드는 제거하고, 복잡한 과정은 제거하자.
동작 파라미터화 / 추상화가 필요한 상황
- 농장 재고 목록 어플리케이션에 리스트에 “녹색 사과” 만 필터링 하는 기능을 추가한다고 가정하자
: 녹색 사과 필터링 기능 구현- “녹색 사과”를 필터링 하는 기능 구현을 하고 나니 “빨간 사과” 도 필터링 하고 싶다고 한다
: 빨간 사과도 필터링 가능하도록 ‘색상’을 파라미터화- ‘색상’을 인자로 받도록 수정하고 나니 무게가 150g 이상인 사과를 필터링 하고싶다고 한다
: 색상 필터링 메서드를 복사하여 파라미터를 무게로 변경하여 사용(중복코드발생)- 색상은 빨강이면서 무게는 150 이상인 사과를 필터링 하고 싶다고 한다.
: 가능한 모든 속성으로 필터링 하도록 기능 변경 -> 복잡한 코드 발생
메서드를 인자로 전달하려면 어떡해아할까?
- 공통된 부분을 추상화 하여 객체를 인자로 전달
: 매 번 클래스를 만들어줘야한다.- 익명 클래스를 구현하여 인자로 전달
: 불필요한 코드는 계속해서 존재한다.- 람다를 사용 : 복잡한 과정 간소화.
: GOOD !
1. 공통된 부분을 추상화 하여 객체를 인자로 전달 / 동작 파라미터화
- 선택 조건을 결정하는 인터페이스 정의 (프레디게이트)
interface ApplePredicate{
boolean test(Apple apple);
}
- 추상적 조건으로 필터 클래스 추가
class AppleColorGreenFilter implements ApplePredicate{
@Override
public boolean test(Apple apple) {
return GREEN == apple.getColor();
}
}
class AppleWeightHeavyFilter implements ApplePredicate{
@Override
public boolean test(Apple apple) {
return apple.getWeight() > 150;
}
}
- 추상적 조건으로 필터링
private List<Apple> filterColorAndWeightApple(List<Apple> inventory, ApplePredicate p) {
List<Apple> apples = new ArrayList<>();
for (Apple apple:inventory){
if(p.test(apple)){
apples.add(apple);
}
}
return apples;
}
- 코드 전달 (동작 파라미터화)
List<Apple> heavyApple = application.filterColorAndWeightApple(inventory, new AppleWeightHeavyFilter());
List<Apple> greenApple = application.filterColorAndWeightApple(inventory, new AppleColorGreenFilter());
2. 익명 클래스를 구현하여 동작 파라미터화
- 코드 전달 부분에서 익명 클래스로 인자 전달
List<Apple> heavyApple = application.filterColorAndWeightApple(inventory, new ApplePredicate() {
@Override
public boolean test(Apple apple) {
return GREEN == apple.getColor();
}
});
3. 람다를 사용하여 동작 파라미터화
- 람다로 동작 파라미터화 / 복잡한 과정이 간소화된다.
List<Apple> heavyApple = application.filterColorAndWeightApple(inventory, (Apple apple) -> RED.equals(apple.getColor());
요약
- 동작 파라미터화에서는 메서드 내부적으로 다양한 동작을 수행할 수 있도록 코드를 메서드 인수로 전달한다.
- 동작 파라미터화를 이용하면 변화하는 요구사항에 더 잘 대응할 수 있는 코드를 구현할 수 있고, 나중에 엔지니어링 비용을 줄일 수 있다.
'JAVA > 모던자바인액션' 카테고리의 다른 글
자바 8, 9, 10, 11 무슨 일이 일어나고 있는가? (0) | 2020.05.27 |
---|