Justin의 개발 로그
article thumbnail
자바 DSL - 메서드 체인 패턴

주식(stock)을 거래(trade)를 하는 주문(order) 기능을 Java로 구현 public class Order { private String customer; private List trades = new ArrayList(); public void addTrade(Trade trade) { trades.add(trade); } public String getCustomer() { return customer; } public void setCustomer(final String customer) { this.customer = customer; } public double getValue() { return trades.stream().mapToDouble(Trade::getValue).sum..

람다 - 팩토리 패턴

public class OriginalFactoryPattern { public static Product createProduct(String name) { switch(name) { case "Car" : return new Car(); case "Boat" : return new Boat(); default: throw new RuntimeException("No such product " + name); } } @Test void 팩토리메서드_테스트() { Product p1 = OriginalFactoryPattern.createProduct("Car"); Product p2 = OriginalFactoryPattern.createProduct("Boat"); } } public class La..

람다 - 의무체인 패턴

public class originalResponsibilityChain { public abstract class ProcessingObject { protected ProcessingObject nextProcessor; //자신과 동일한 객체를 멤버로 받음 abstract protected T handleWork(T input); //하위 객체 등록 public void setSuccessor(ProcessingObject successor) { this.nextProcessor = successor; } public T handle(T input) { T result = handleWork(input); if(nextProcessor != null) { return nextProcessor.han..

람다 - 옵저버 패턴

[AS-IS] import java.util.ArrayList; import java.util.List; public class OriginalObserverPattern { interface Observer { void notify(T message); } interface Subject { void registerObserver(Observer o); void notifyObservers(T message); } class WeatherFeed implements Subject { private final List observers = new ArrayList(); @Override public void registerObserver(Observer o) { this.observers.add(o); ..

람다로 효과적 프로그래밍 - 템플릿메서드 패턴

[AS-IS] 람다를 사용하지 않은 전통적(?)인 템플릿메서드 패턴 구조 추상클래스를 통해 공통 로직과 템플릿으로 분리할 추상 메서드를 나눈다. 상속받은 클래스에서 추상 메서드를 구현한다. public class OriginalTemplateMethodPattern { abstract class OnlineBanking { public void deposit(int amount) { // 입금 공통 로직은 여기에 있다. System.out.println("입금액: " + amount + "원"); bearInterest(amount); } // 인터넷 뱅킹 업체마다 선이자 계산 방식이 다른 경우 템플릿 메소드로 분리 abstract void bearInterest(int amount); } private..

람다로 효과적 프로그래밍 - 전략패턴

전통적인 디자인패턴(GoF)에서 전략패턴 public class OriginalStrategyPattern { //인터페이스 선언 public interface ValidationStrategy { boolean execute(String s); } //클래스 구현 - 소문자 검증 private class IsAllLowerCase implements ValidationStrategy { @Override public boolean execute(String s) { return s.matches("[a-z]+"); } } //클래스 구현 - 숫자 검증 private class IsNumeric implements ValidationStrategy { @Override public boolean exec..

람다로 효과적 프로그래밍 - 람다를 활용해서 Enum에 메서드 재사용

Java 람다와 디자인패턴 언어에 새로운 기능이 추가되면서 기존 코드 패턴이나 많이 사용되던 관용코드의 인기가 식기도 한다. 예를 들어 Java5의 for-each는 기존의 반복자 코드(iterator)보다 간결하고, 에러를 유발할 가능성이 적어서 많이 사용되었고, Java7의 다이아몬드 연산자 때문에 기존의 제네릭 인스턴스를 명시적으로 생성하는 빈도가 줄었다. Java9의 var도 명시적인 타입 선언을 대체하고 형식 추론의 세계를 열어주고 있다. Java8의 람다의 등장으로 디자인 패턴에 람다 표현식이 더해지면서 이전에 디자인 패턴으로 해결하던 문제를 더 쉽고 간결하게 해결할 수 있게 되었으며, 심지어 많은 객체지향 디자인 패턴이 기존의 정형화된 패턴 구조를 벗어나서 메서드 참조를 활용한 간결한 구조로..

람다로 효과적 프로그래밍 - 조건부 연기 실행, 실행 어라운드 패턴

조건부 연기 실행(Conditional Diferred Execution) 아래 코드에서 getMessage 메서드는 1000번 호출된다. public class CDETest { private StopWatch sw; private String methodName; private boolean useLog = false; private CDETest() { sw = new StopWatch(); } @BeforeEach void startStopWatch() { sw.start(); } @AfterEach void endStopWatch() { sw.stop(); System.out.println(methodName + " running time : " + sw.getTotalTimeMillis() +..

git에서 .DS_Store 생성 방지

.gitignore 에 등록하자! .DS_Store 현재 폴더 하위의 .DS_Store 삭제 sudo find ./ -name ".DS_Store" -depth -exec rm {} \; [참고]MAC_OS에서 .DS_Store 생성하지 않도록 하는 방법 터미널을 열어 아래 명령어를 수행합니다. com.apple.desktopservices DSDontWriteNetworkStores true # 다시 켜려면 com.apple.desktopservices DSDontWriteNetworkStores false

article thumbnail
Java 함수형 인터페이스 #3 - 스트림, 람다
프로그래밍/Java-Spring 2023. 1. 20. 08:30

스트림은 왜 람다를 사용할 수 있나? (스트림은 어떻게 람다 표현식을 지원하나?) public interface Stream extends BaseStream { Stream filter(Predicate