Java 92

[헤드퍼스트 디자인 패턴] 10. 상태 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다1. 상태 기계상태에 따라 시스템의 행동이 달라지고, 상태 전이는 명확하게 정의된 규칙에 따라 일어남구성 요소설명상태 모음시스템이 가질 수 있는 여러 상태들을 정의함 (Idle, Running, Paused, Finished 등)상태 표현 변수현재 상태를 나타내는 인스턴스 변수 (State currentState;) 등행동 모음상태에 따라 달라지는 행동들을 정의함 (start(), pause(), reset() 등) 예제: GumballMachine만약 상태가 추가될 경우, 상태에 의존하는 모든 코드들에 분기 코드가 추가되어야 함 예제) GumballMachine더보기public class GumballMachine { final..

Java/Design Pattern 2024.12.18

[헤드퍼스트 디자인 패턴] 9-2. 컴포지트 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 컴포지트 패턴객체를 트리구조로 구성해서 부분-전체 계층구조를 구현한 패턴리프와 컴포지트 객체를 동일한 인터페이스로 다룰 수 있음 장점장점설명일관된 처리 방식개별 객체와 복합 객체를 같은 방식으로 다룰 수 있음 (e.g., draw(), getPrice() 등)투명성 확보클라이언트는 리프인지 컴포지트인지 신경 쓰지 않고 동일한 방식으로 호출 가능확장성 높음새로운 리프나 복합 객체를 손쉽게 추가 가능 → 구조 변경이 쉬움 단점단점설명단일 책임 원칙 위반컴포지트 객체가 계층 관리 + 데이터 보관까지 함께 담당하게 됨불필요한 메서드 강제리프 노드에도 필요 없는 메서드를 구현해야 할 수 있음 → 인터페이스 오염 2. 예제: MenuCom..

Java/Design Pattern 2024.12.18

[헤드퍼스트 디자인 패턴] 9-1. 반복자 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 반복자 패턴컬렉션 내부의 구조를 노출하지 않고, 집합체 내부 요소들을 순차적으로 접근할 수 있는 방법 제공클라이언트는 인터페이스만 알고 있으면 됨 (접근 코드의 형태를 통일할 수 있음) 2. 예시: Iterator반복을 캡슐화하기 예시) 캡슐화 전더보기for (int i = 0; i 예시) 캡슐화 후 (Iterator)더보기Iterator iterator = breakfastMenu.createIterator();while (iterator.hasNext()) { MenuItem menuItem = iterator.next();}

Java/Design Pattern 2024.12.18

[헤드퍼스트 디자인 패턴] 8. 템플릿 메서드 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 템플릿 메서드 패턴전체 알고리즘의 흐름은 상위 클래스에 정의하고, 세부 단계 일부는 하위 클래스에서 구현하도록 유도하는 패턴 장점장점설명알고리즘 구조 유지전체 흐름(템플릿 메서드)은 변하지 않고 재사용 가능부분 단계만 재정의 가능서브클래스가 필요한 부분만 오버라이드해서 맞춤 동작 구현 가능후크(Hook) 메서드 지원선택적으로 오버라이드할 수 있는 "빈 메서드"를 제공 → 서브클래스가 조건에 따라 실행 여부 제어 가능 2. 예제: CaffeineBeverageCaffeineBeverage (abstract class)예제) CaffeineBeverage더보기public abstract class CaffeineBeverage { ..

Java/Design Pattern 2024.12.18

[헤드퍼스트 디자인 패턴] 7-2. 퍼사드 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 퍼사드 패턴복잡한 서브시스템을 하나의 단순한 인터페이스로 감싸는 디자인패턴복잡도를 감추어, 클라이언트가 쉽게 사용하도록 하는것이 목적 2. 예제: 홈시어터 퍼사드예제) HomeTheaterFacade더보기public class HomeTheaterFacade { Amplifier amp; Tuner tuner; StreamingPlayer player; Projector projector; TheaterLights lights; Screen screen; PopcornPopper popper; public void watchMovie(String movie) { poppe..

Java/Design Pattern 2024.12.17

[헤드퍼스트 디자인 패턴] 7-1. 어댑터 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 어댑터 패턴호환되지 않는 인터페이스를 클라이언트가 기대하는 인터페이스로 변환해주는 디자인 패턴기존 클래스를 수정하지 않고, 재사용할 수 있게 도와줌 2. 예제: 오리Duck예제) Duck더보기public interface Duck { void quack(); void fly();}public class MallardDuck implements Duck { public void quack() { System.out.println("꽥"); } public void fly() { System.out.println("날고 있어요!"); }} Turkey예제) Turkey더보기public interface ..

Java/Design Pattern 2024.12.17

[헤드퍼스트 디자인 패턴] 6. 커맨드 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 커맨드 패턴요청자와 수행자를 분리하는 패턴요청을 하나의 객체로 캡슐화하여, 서로 다른 요청을 매개변수로 처리 요소구성요소역할 설명Receiver실제 작업을 수행하는 객체Command작업을 캡슐화한 인터페이스 또는 클래스Invoker커맨드 객체를 받아 실행을 요청하는 객체 장점요청을 객체로 기능 확장 (저장, 취소, 재실행 등)요청 내역을 유연하게 구성 가능 (큐잉, 로깅, 트랜잭션 처리 등) 2. 예제: 리모컨리모컨 (Receiver)예제) RemoteControl더보기public class RemoteControl { Command[] onCommands, offCommands; Command undoCommand;..

Java/Design Pattern 2024.12.17

[헤드퍼스트 디자인 패턴] 5. 싱글턴 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 싱글턴 패턴애플리케이션 전체에서 하나의 인스턴사만 존재하도록 보장하는 디자인 패턴항목설명단 하나의 객체만 필요한 경우불필요한 객체 생성을 방지하여 자원 절약결과의 일관성 유지여러 인스턴스가 존재하면 데이터 충돌 및 상태 불일치 위험 발생전역 접근 가능어디서든 동일한 인스턴스에 접근 가능 → 사용 편리지연 초기화 가능필요할 때만 객체 생성 → 메모리 등 리소스 효율성 증가 예시) 구현더보기public class Singleton { private static Singleton uniqueInstance; private Singleton() {} public static Singleton getInstance() {..

Java/Design Pattern 2024.12.16

[헤드퍼스트 디자인 패턴] 4. 팩토리 메서드 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. 기존 문제: new 키워드new 키워드를 통해 직접 객체 생성 시 → 특정 구현체에 강하게 의존하게 됨⚠️ OCP, DIP 위반 → 코드 변경에 취약, 테스트 어려움 2. 팩토리 메서드 패턴객체를 생성을 서브클래스에서 위임하는 패턴클라이언트 코드와 구현체 생성 코드를 분리시킴 추상 클래스화서브클래스에 피자 생성을 위임함어떤 종류의 피자를 만들지에 대한것은 어떤 서브클래스를 생성했느냐에 따라 결정됨클라이언트는 어떤 구현이 생성되는지 몰라도 됨 예제) PizzaStore더보기추상클래스public abstract class PizzaStore { public Pizza orderPizza(String type) { ..

Java/Design Pattern 2024.12.16

[헤드퍼스트 디자인 패턴] 3. 데코레이터 패턴

에릭 프리먼 님의 "헤드퍼스트 디자인 패턴" 책을 정리한 포스팅 입니다 1. OCP (Open/Closed Principle) 새로운 행동을 추가하여 확장기존 코드를 수정 필요 없음 2. 데코레이터 패턴클래스에 기능을 추가할 때, 상속이 아닌 객체를 감싸는 방식으로 확장하는 구조항목설명상속의 문제점- 슈퍼클래스에 모든 기능을 넣으면 → 일부 서브클래스에는 불필요하거나 부적절한 기능까지 상속됨- 기능 변경 시 상속 구조 전체에 영향 발생→ 해결 방법- 기능을 데코레이터 객체로 분리- 원래 객체를 감싸고, 필요한 기능만 동적으로 위임하여 확장형식- 데코레이터 클래스는 원래 객체와 동일한 인터페이스 또는 슈퍼클래스를 구현- 따라서 감싼 객체처럼 사용 가능이점- 기능을 동적으로 추가 가능- 여러 데코레이터 중첩..

Java/Design Pattern 2024.12.16