목록프로그래밍👩🏻💻/디자인 패턴 (12)
suyeonme
헤드 퍼스트 디자인 패턴을 읽고 정리한 내용입니다. 상태 패턴(State Pattern)이란? 상태 패턴을 사용하면 객체의 내부 상태가 바뀜에 따라서 객체의 행동을 바꿀 수 있다. 마치 객체의 클래스가 바뀌는 것과 같은 결과를 얻을 수 있다. 상태 패턴을 사용하지 않은 경우 뽑기 기계를 구현하는 코드이다. 문제점 코드에 대한 수정이 필요한 경우, 각각의 상태에 의존하는 모든 코드를 모두 고쳐야한다. 상태가 변화함에 따라서 조건문이 복잡해진다. public class GumballMachine { final static int SOLD_OUT = 0; final static int NO_QUATER = 1; final static int HAS_QUATER = 2; final static int SOLD ..
헤드 퍼스트 디자인 패턴을 읽고 정리한 내용입니다. 반복자 패턴이란? 반복자 패턴은 컬렉션의 구현 방법을 노출하지 않으면서 집합체 내의 모든 항목에 접근하는 방법을 제공한다. 반복자 패턴은 Iterator 인터페이스에 의존한다. * 컬렉션(collection)은 집합체(aggregate)라고도 불리운다. * java.util.Iterator는 Iterator 인터페이스를 제공한다. 반복자 패턴 사용시 이점 컬렉션 객체 안에 들어있는 모든 항목에 접근하는 방식이 통일되어있으면 종류에 관계없이 모든 집합체에 사용할 수 있는 다형적인 코드를 만들 수 있다. 모든 항목에 일일히 접근하는 작업을 컬렉션 객체가 아닌 반복자 객체가 맡는다. 따라서 집합체의 인터페이스와 구현이 간단해지고 집합체는 반복작업이 아닌 자신..
헤드 퍼스트 디자인 패턴을 읽고 정리한 내용입니다. 템플릿 메소드 패턴(Template Method Pattern)이란? 템플릿 메소드 패턴은 즉 일련의 단계로 알고리즘을 정의한 메소드이다. 여러 단계중 하나 이상의 단계가 추상 메소드로 정의되며 그 추상 메소드는 서브 클래스에서 구현한다. 템플릿 메소드 패턴 구현 구현 순서 prepareRecipe()는 어떤 알고리즘의 템플릿 역할을 한다. 템플릿 메소드는 서브 클래스에서 오버라이드하지 못하도록 final로 선언한다. 템플릿 메소드의 일부 알고리즘(추상 메소드)은 서브 클래스에서 구현한다. public abstract CaffeineBeverage { final void prepareRecipe() { // 템플릿 메소드 boilWater(); brew..
상속(Inheritance) 상속의 특징 코드를 재사용하여 중복을 줄일 수 있다. 따라서 유지보수가 쉬워진다. 상위 클래스와 하위 클래스가 is-a관계일 때 사용한다. (e.g. 동물 > 포유류 > 강아지) public class Mammals extends Animal { protected void breath() { ... } protected void birth() { ... } } 상속의 단점 상속은 단일 패키지에서 사용해야만 안전하다. 상위 클래스의 코드가 수정되면 하위 클래스의 코드도 수정되어야 하는 경우가 많다. (재정의 메소드) 상속은 캡슐화를 위반한다(하위 클래스가 상위 클래스에 구체적인 구현 내용을 의존하기 있기 때문) 조합(Composition) 상위 클래스를 상속하는 대신에 상위 클..
최소 지식 원칙(Principle of Least Knowledge)이란? 최소 지식 원칙에 따르면 객체 사이의 상호작용은 될 수 있으면 아주 가까운 '친구'사이에만 허용하는 편이 좋다. 즉 상호 작용하는 객체들은 다른 객체가 어떤 상태를 갖고 있는지 속사정을 몰라야한다. 여러개의 dot(.)을 사용하지 말라는 법칙으로 많이 알려져있다. * 데메테르 법칙(Law of Demeter), Don't talk to strangers(낯선이에게 말하지 마라) 모두 같은 의미이다. 최소 지식 원칙은 객체 지향 프로그래밍에서 기본적이지만 중요한 개념이다. 최소 지식 원칙을 준수할 경우, 여러 클래스가 복잡하게 얽혀있어서 시스템의 한 부분을 변경했을 때 다른 부분까지 줄줄이 고쳐야하는 상황을 방지할 수 있다. 최소 ..
헤드 퍼스트 디자인 패턴을 읽고 정리한 내용입니다. 어댑터 패턴(Adapter Pattern)이란? 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환한다. 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게 도와준다. 어댑터 패턴의 특징 어댑터를 새로 바뀐 인터페이스로 감쌀 때는 객체 구성(composition)을 사용한다. 이러한 접근법은 어댑티의 모든 서브 클래스에 어댑터를 쓸 수 있다는 장점이 있다. 클라이언트를 특정 구현이 아닌 인터페이스에 연결한다. 서로 다른 백엔드 클래스로 변환시키는 여러 어댑터를 사용할 수도 있다. 이렇게 인터페이스를 기준으로 코드를 작성하기에 타깃 인터페이스만 유지한다면 나중에 다른 구현을 추가하는 것이 가능하다. 클라이언트에서 어..
헤드 퍼스트 디자인 패턴을 읽고 정리한 내용입니다. 1. 커맨드패턴(Command Pattern)이란? 요청 내역을 객체로 캡슐화해서 객체를 서로 다른 요청 내역에 따라 매개변수화할 수 있다. 이러한 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능을 사용할 수 있다. 커맨드 패턴 활용 예시 1. 스케줄러, 스레드 풀, 작업 큐와 같은 작업에 사용할 수 있다. 작업 큐를 예시로 들면, 큐 한쪽 끝은 커맨드를 추가할 수 있고, 다른 쪽 끝에는 커맨드를 처리하는 스레드들이 대기하고 있다. 각 스레드는 우선 execute()를 호출하고 호출이 완료되면 커맨드 객체를 버리고 새로운 커맨드 객체를 가져온다. 작업 큐 클래스는 계산 작업을 하는 객체들과 완전히 분리돠어 있다. 큐에 커맨드 패턴을 구현하는 객..
헤드 퍼스트 디자인 패턴을 읽고 정리한 내용입니다. 1. 싱글톤 패턴(Singleton Pattern)이란? 클래스 인스턴스를 하나만 만들고, 그 인스턴스로의 전역 접근을 제공하는 디자인 패턴이다. 스레드 풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정을 처리하는 객체, 로그 기록용 객체, 디바이스 드라이버등에 주로 사용된다. 1.1 전역 변수 vs 싱글톤 전역 변수에 객체를 대입하면, 애플리케이션이 시작될 때 객체가 생성된다. 만약 객체가 자원을 많이 사용할 경우, 그리고 해당 객체가 사용되지 않으면 불필요하게 자원을 낭비할 수 있다. 2. 멀티스레딩을 고려하지 않은 싱글톤 간단하지만, 멀티스레드 환경에서는 문제가 발생할 수 있다. 생성자를 private으로 선언했으므로 Singleton에서만 클..