-
챕터[2] 동작 파라미터화모던자바인액션 2020. 10. 21. 15:55
제너릭이란 클래스에서 사용할 타입을 클래스 외부에서 선택하여 사용한다.
제네릭 타입은 참조형 타입만 가능하다 (기본형 사용 불가능)
->Wrapper Class 사용
동작 파라미터화란?
자주 바뀌는 요구사항에 효과적으로 대응할 수 있는 방법으로 아직은 어떻게 실행할 것인지 결정화지 않은 코드 블럭을 의미한다.
동작 파라미터화
변화는 요구사항에 대응하기 위하여 기존에는 메서드를 제작하여 구현하였다. 아래와 같이 2가지의 일을 하는 2개의 메서드를 구현하여 판단했다.
-> 사과의 색이 빨간색인 사과만 거르는 필터링 메서드
-> 사과의 색이 초록색인 사과만 거르는 필터링 메서드
매 요구사항마다 메서드가 하나씩 생길 수 있는 반면 동작 파라미터화를 이용하여 참 또는 거짓만 반환하는 함수인 프리디케이트를 정의해보자.
아래의 예제코드와 같이 ApplePredicate를 정의하여 요구사항에 맞게 test 메서드를 다른 방식으로 동작 시킨 것 이다.
그 외 두개의 동작을 동시에 구현한 프리디케이트도 정의할 수 있다.
public interface ApplePredicate { boolean test (Apple apple); } public class AppleColorPredicate implements ApplePredicate { @Override public boolean test(Apple apple) { return "GREEN".equals(apple.getColor()); } } public class AppleHeavyWeightPredicate implements ApplePredicate { @Override public boolean test(Apple apple) { return apple.getWeight() > 150; } }
반면 이러한 방식으로 생기는 코드도 여러 클래스를 정의 하여 인스턴스화 하며 많은 코드량을 발생시키는데 이 문제점을 개선하는 방법으로는 익명 클래스 라는 기법을 제공한다.
익명클래스 : 자바의 지역 클래스 와 비슷한 개념으로 이름이 없는 클래스이다. 익명 클래스를 이용 시 클래스 선언과 인스턴스화를 동시에 할 수 있다. (아래 예제와 같이 즉석에서 구현하여 만들고 사용할 수 있다.)
public List<Apple> inventory = Arrays.asList(new Apple(150, Apple.Color.GREEN), new Apple(110, Apple.Color.GREEN), new Apple(170, Apple.Color.RED)); List<Apple> redApples = filterApples(inventory, new ApplePredicate() { @Override public boolean test(Apple apple) { return Apple.Color.RED.equals(apple.getColor()); } });
람다 : 반면 익명클래스 만으로도 공간이 너무 많이 사용되고 있어서 결국에는 이걸 보완하기 위하여 자바8부터 도입된 방법으로 아래 예제와 같이 구현할 수 있다.
public List<Apple> inventory = Arrays.asList(new Apple(150, Apple.Color.GREEN), new Apple(110, Apple.Color.GREEN), new Apple(170, Apple.Color.RED)); List<Apple> result = filterApples(inventory, (Apple apple) -> Apple.Color.RED.equals(apple.getColor()));
그나마 github : github.com/hodolee246/ModernJavaStudygithub.com/hodolee246/ModernJavaStudy/blob/master/src/main/java/com/example/modernjava/ch2/ExamPredicate.java
'모던자바인액션' 카테고리의 다른 글
챕터[7] 스트림 병렬화 (0) 2020.10.21 챕터[6] 스트림 그룹화 (0) 2020.10.21 챕터[5] 스트림 데이터 수집 (0) 2020.10.21 챕터[4] 스트림 (0) 2020.10.21 챕터[3] 람다 (0) 2020.10.21