Stream데이터의 흐름Collection 형태로 구성된 데이터를 람다를 이용해 간결하고 직관적으로 프로세싱for, while 등 기존 loop 를 대체병렬처리 가능데이터 소스를 변경하지 않음재사용 불가컬렉션은 현재 자료구조가 포함되는 모든 값을 메모리에 저장하는 자료구조스트림은 요청할 때만 요소를 계산하는 고정된 자료구조내부반복은 데이터 표현과 하드웨어를 활용한 병렬성 구현을 자동으로 선택지연된 연산 : 중간 연산을 합친 다음에 합쳐진 중간 연산을 최종 연산으로 한번에 처리Filter만족하는 데이터만 걸러내는데 사용Predicate에 true를 반환하는 데이터만 존재하는 stream을 리턴중간처리 기능 Intermediate Operation, 여러가지 중간처리 이어붙이기 가능Stream filter ..
동작 파라미터화 메서드가 다양한 동작(전략)을 받아서 내부적으로 다양한 동작을 수행할 수 있다. 코드/동작(전략)을 메서드 인수로 전달, 한 개의 파라미터로 다양한 동작 변화하는 요구사항에 더 잘 대응할 수 있는 코드를 구현 //As-Is public static List filterGreenApples(List inventory) { List result = new ArrayList(); for (Apple apple : inventory) { if (GREEN.equals(apple.getColor())) { //색으로 필터링 result.add(apple); } } return result; } //Step1 public static List filterGreenApplesByColor(List i..

메소드에서 알고리즘의 골격을 정의함. 알고리즘의 여러 단계 중 일부는 서브클래스에서 구현할 수 있음. 알고리즘의 구조는 유지하면서 서브클래스의 특정 단계를 재정의 가능. public abstract class CaffeineBeverage { //전체적인 처리 과정을 관리 final void prepareRecipe() { //템플릿 메소드. 아무렇게나 음료를 만들지 못하도록 final 선언 boilWater(); brew(); pourInCup(); addCondiments(); } abstract void brew(); //서로 다른 방식으로 처리되는 메소드를 추상화 abstract void addCondiments(); //메소드를 일반화시켜서 베이스 클래스에 등록 void boilWater() {..

어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용 가능 인터페이스를 단순화 시키고 클라이언트와 구성요소들로 이루어진 서브시스템을 분리 public class HomeTheaterTestDrive { public static void main(String[] args) { Amplifier amp = new Amplifier("Top-O-Line Amplifier"); Tuner tuner = new Tuner("Top-O-Line AM/FM Tuner", amp); DvdPlayer dvd = new DvdPlayer("Top-O-Line DVD Player", amp); CdPlayer cd = new CdPla..

한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 사용 가능 호환되지 않는 인터페이스를 사용하는 클라이언트를 그대로 활용 가능 클라이언트와 구현된 인터페이스를 분리 인터페이스가 바뀌더라도 변경 내역은 어댑터에서 캡슐화되기 때문에 클라이언트는 바뀔 필요 없음 public interface Duck { void quack(); void fly(); } public interface Turkey { void gobble(); void fly(); } public class WildTurkey implements Turkey{ @Override public void gobble() { System...

커맨드 패턴 커맨드(Command) 패턴은 객체지향 디자인 패턴 중 하나로, 요청을 객체의 형태로 캡슐화하여 사용자가 서로 다른 요청을 실행할 수 있도록 합니다. 즉, 요청을 발생시키는 객체와 요청을 처리하는 객체 사이의 결합도를 낮추는 데에 사용됩니다. 요청을 하는 객체(Invoker)와 요청을 수행하는 객체(Receiver)를 분리 Command 객체가 Receiver 객체를 캡슐화 Command 객체를 이용해서 요청을 매개변수화 가능 Command 인터페이스: 수신자 객체와 관련된 작업을 수행하는 execute 메서드를 제공합니다. ConcreteCommand 클래스: Command 인터페이스를 구현하는 구체적인 커맨드 클래스입니다. 요청을 수신자 객체에 전달하는 책임을 갖습니다. Receiver ..
싱글턴 패턴 클래스 인스턴스가 하나만 만들어지도록 하고, 그 인스턴스에 대한 전역 접근을 제공 전역 변수에 객체를 대입하면 애플리케이션이 시작될 때 객체가 생성 한 번도 쓰지 않더라도 자원을 차지 싱글턴 패턴은 필요할 때만 객체 생성 고전적인 싱글턴 패턴 public class Singleton { private static Singleton uniqueInstance;//유일한 인스턴스를 저장하는 정적 변수 private Singleton() {}//외부에서 생성 불가능 public static Singleton getInstance() {//유일한 인스턴스를 반환하는 정적 메소드 if (uniqueInstance == null) { uniqueInstance = new Singleton();//게이른..

정적 팩토리 (static factory method) 객체를 생성하기 위한 메소드를 실행시키기 위해서 객체의 인스턴스를 만들지 않기 위해 사용 서브클래스를 만들어서 객체 생성 메소드의 행동을 변경시킬 수 없다는 단점 팩토리 메소드 패턴 객체를 생성하기 위한 인터페이스를 정의, 어떤 클래스의 인스턴스를 만드는 일을 서브클래스에서 결정 디자인 원칙 1. 애플리케이션에서 달라지는 부분을 찾아내고, 달라지지 않는 부분으로부터 분리시킨다. (캡슐화) 2. 구현이 아닌 인터페이스에 맞춰서 프로그래밍한다. 3. 상속보다는 구성을 활용한다. 4. 서로 상호작용을 하는 객체 사이에서는 가능하면 느슨하게 결합하는 디자인을 사용해야 한다. 5. 클래스는 확장에 대해서는 열려 있어야하지만 코드 변경에 대해서는 닫혀 있어야 ..
Optional은 null 또는 값을 감싸서 NPE(NullPointerException)로부터 부담을 줄이기 위해 등장한 Wrapper 클래스 Optional의 역할은 더 이해하기 쉬운 API를 설계하도록 돕는 것. → 메서드 시그니처만 보고도 선택형 값인지 여부를 구별 값을 Wrapping하고 다시 풀고, null 일 경우에는 대체하는 함수를 호출하는 등의 오버헤드가 있으므로 잘못 사용하면 시스템 성능이 저하 메소드의 반환 값이 절대 null이 아니라면 Optional을 사용하지 않는 것이 좋다. 메소드의 결과가 null이 될 수 있으며, null에 의해 오류가 발생할 가능성이 매우 높을 때 반환값으로만 사용 파라미터로 넘어가는 값이 아니라 반환 타입으로써 제한적으로 사용되도록 설계 빈 Optiona..