일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- JPA
- jQuery값전송
- 스프링데이터흐름
- 제너릭
- 페이징
- 페치조인
- springflow
- calendar
- 프로젝트생성
- joinfetch
- paging
- namedQuery
- jQueryUI
- javaservlet
- 엔티티직접사용
- JQuery
- 제네릭
- fetchjoin
- values()
- Generic
- 벌크연산
- LIST
- fullcalendar
- javascriptcalendar
- JPQL
- Hibernate
- jscalendar
- 대량쿼리
- 자바서블릿
- jQuery값전달
- Today
- Total
가자공부하러!
모던자바인액션(CH2) - 동작 파라미터화 코드 전달 본문
https://github.com/HyeongJunMin/ModernJava
목차
요약
한 메소드에 각기 다른 동작을 하는 여러 종류의 코드블록을 전달하여 다른 결과를 만들어낼 수 있도록 설계하는 것을 동작 파라미터화 라고 한다.
동작 파라미터화를 통해 보기 좋은 코드를 만들 수 있고, 변화하는 요구사항에 더 유연하게 대처할 수 있다.
결론
단순 필터기능이라면 굳이 뭐 상속받고 생성해서 넘기지 말고 stream().filter() 쓰는게 좋을거라고 생각한다.
책 내용
1. 요구사항 변화에 대응하는 방법
- 동작 파라미터화를 이용하면 좋음
2. 동작 파라미터화(Behavior parameterization)
- 아직은 어떻게 실행할 것인지 결정하지 않은 코드블록을 의미
- 코드블록의 실행은 나중에 프로그램에서 호출하며 결과적으로 메서드의 동작이 파라미터화 된다.
- 목적 : 요구사항 변화에 유연한 대처 가능, 클린 코드
3. 익명 클래스
4. 람다 표현식 미리보기
5. 실전 예제 : Comparator, Runnable, GUI
동작 파라미터화(behavior parameterization)
한 메소드에 각기 다른 동작을 하는 여러 종류의 코드블록을 전달하여 다른 결과를 만들어낼 수 있도록 설계하는 것
프레디케이트(predicate)
참 또는 거짓을 반환하는 함수
public interface ApplePredicate {
boolean test (Apple apple);
}
public class AppleHeavyWeightPredicate implements ApplePredicate {
public boolean test (Apple apple) {
return apple.getWeight() >= 150;
}
}
public class AppleGreenColorPredicate implements ApplePredicate {
@Override
public boolean test(Apple apple) {
return Apple.Colors.GREEN.equals(apple.getColor());
}
}
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class Apple {
public enum Colors {
GREEN, RED, BLACK
}
private Colors color;
private Integer weight;
public static List<Apple> filterApplesCustomPredicate(List<Apple> inventory, ApplePredicate p) {
List<Apple> result = new ArrayList();
for (Apple apple : inventory) {
if (p.test(apple)) {
result.add(apple);
}
}
return result;
}
public static boolean isGreenApple(Apple apple) {
return Colors.GREEN.equals(apple.getColor());
}
}
class Ch2BehaviorParamizeTest {
List<Apple> inventory = new ArrayList();
@BeforeEach
void setUp() {
inventory.add(new Apple(Apple.Colors.RED, 150));
inventory.add(new Apple(Apple.Colors.GREEN, 100));
inventory.add(new Apple(Apple.Colors.BLACK, 50));
}
@Test
void predicateTest() {
//작성한 필터메소드에 조건에 따라 predicate를 다르게 사용하면
//파라미터에 따라 다른 동작을 수행한다
//아래 코드에서 동작파라미터화에서 말하는 코드블록은 Apple...Predicate()이다
Apple.filterApplesCustomPredicate(inventory, new AppleGreenColorPredicate());
Apple.filterApplesCustomPredicate(inventory, new AppleHeavyWeightPredicate());
//predicate 굳이 안하고 람다로 하는게 좋을듯
Apple.filterApples(inventory, apple -> Apple.Colors.RED.equals(apple.getColor()));
}
}
익명클래스
value 맞추기(인텔리제이가 답 알려줌)
@Test
void pickActualResultTest() {
MeaningOfThis meaningOfThis = new MeaningOfThis();
meaningOfThis.doIt();
}
public class MeaningOfThis {
public final int value = 4;
public void doIt() {
int value = 6;
Runnable r = new Runnable() {
public final int value = 5;
public void run() {
int value = 10;
System.out.println(this.value);
}
};
r.run();
}
}
Runnable로 코드 블록 실행하기
자바 스레드를 이용하면 병렬로 코드 블록을 실행할 수 있다.
병렬처리는 언제 하는게좋을까... 로그인 트래픽 밀릴 때? 마땅히 떠오르지 않으므로 이런 방법도 있구나 하고 넘어감
@Test
void howToCreateThread() {
//자바 8 이전
Thread t = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread made by anonymous class");
}
});
//람다 활용
t = new Thread(() -> System.out.println("thread made by lambda"));
}
추가로 공부할 내용
1. 공유객체란?
2. Runnable과 Callable은 각각 어떤 차별점이 있을까?
'공부 > Java' 카테고리의 다른 글
모던자바인액션(CH3) - 람다 표현식 (0) | 2020.04.20 |
---|---|
Optional 활용 기록 (0) | 2020.04.02 |
모던자바인액션(CH1) - 자바8부터 추가된 것들 (0) | 2020.03.29 |
Hibernate(13) - 연관관계 매핑 연습 (0) | 2019.12.24 |
Spring Boot 테스트 활용(1) - JUnit 기초 환경설정 (0) | 2019.12.23 |