Java/자바 디자인 패턴
중재자 패턴 (Mediator Pattern) 이란?
중재자 패턴 (Mediator Pattern) 이란? 여러 객체 간의 의사소통하는 방법을 추상화한다. 객체간의 혼란스러운 종속성을 줄일 수 있는 디자인 패턴이다. 객체간 직접적인 통신을 제한하고 중개자 객체(Mediator Object)를 통해서만 협업하도록 한다. 실생활 예제 아파트의 관리사무소는 주민들간의 갈등을 중간에서 해결해준다. 비행기 이착륙을 돕는 관제탑 다이어그램으로 살펴보기 아래의 형태만 중재자 패턴인 게 아니라, 아래의 형태가 대표적인 중재자 패턴인 것이다. 즉, 다른 다이어그램으로 그려져도 중재자 패턴을 사용한 것일 수 있다. 여러 컴포넌트간 결합도를 중재자를 통해 낮춘다. Colleague 가 Colleague 를 직접 참조하는 선이 없다는 것이 중요하다. Mediator 를 참조하고..
이터레이터 패턴 (Iterator Pattern) 이란?
이터레이터 패턴 (Iterator Pattern) 이란? 컬렉션의 요소를 순회하는 패턴이다. 내부의 표현을 노출시키지 않는다. List, Stack, Tree, Set 과 같이 어떠한 컬렉션인지 노출시키지 않는다. 내부 표현을 노출시키면 컬렉션의 종류가 바뀔 때마다 클라이언트 코드를 변경해주어야 하는 불편함이 생긴다. 다이어그램으로 살펴보기 예시: 게시판 게시글 순회 Before: 인덱스를 직접 이용해 순회하기 전통적인 배열 및 컬렉션 순회 방법이다. 단, 컬렉션의 종류가 바뀌게 되면 클라이언트 코드를 수정해주어야 한다는 단점이 있다. public class Client { public static void main(String[] args) { Board board = new Board(); board..
인터프리터 패턴 (Interpreter Pattern) 이란?
인터프리터 패턴 (Interpreter Pattern) 이란? 인터프리터의 의미 자체는 보통 해석해주거나 통역해주는 역할을 가진 사람 혹은 물건이다. 악보를 음악으로 변환하는 것도 이러한 역할의 하나이기 때문에 연주자라는 의미도 있다. 가장 쉽게 볼 수 있는 예로는 정규표현식이 있다. 자주 등장하는 문제를 별개의 언어로 정의하고 재사용하는 패턴이다. 문법에 등장하는 규칙을 클래스로 표현하고 언어에서의 표현식을 해석하고 평가한다. Expression 이라는 추상 클래스를 만드는 경우가 많다. Expression 클래스에서 파생된 구체적인 클래스는 언어의 다양한 규칙 또는 요소를 나타낸다. 반복되는 문제 패턴을 언어 또는 문법으로 정의하고 확장할 수 있다. 다이어그램으로 살펴보기 컴포짓 패턴과 굉장히 유사하..
커맨드 패턴 (Command Pattern) 이란?
커맨드 패턴 (Command Pattern) 요청을 호출하는 쪽과 요청을 수행하는 쪽을 분리하는 (Decoupling) 패턴이다. 요청을 요청에 대한 모든 정보를 포함하는 독립형 객체 (stand-alone object) 로 변환하는 동작 디자인 패턴이다. 요청을 메서드 인수로 제공하거나 요청 실행을 지연하거나 대기열에 추가하거나 실행 취소 가능한 작업을 지원할 수 있다. 다이어그램으로 살펴보기 호출자, 명령, 수신자가 각각 나누어져 있다. 이 때문에 요청을 처리하는 방법이 바뀌더라도 호출자의 코드는 바뀌지 않는다. 커맨드 자체는 재사용도 가능하다. 로깅 혹은 실행취소 등 문제: 텍스트 에디터 앱의 예시 텍스트 에디터 상단 툴바에는 다양한 버튼들이 존재한다. 버튼들은 모두 다른 기능을 하지만 비슷하게 생..
책임 연쇄 패턴 (Chain Of Responsibility) 이란?
책임 연쇄 패턴 (Chain of Responsibility) 각각의 책임이 연결된 패턴이다. 단일 책임 원칙에서 말하는 그 책임과 비슷하다. ex) 어떤 클래스가 변경되어야 한다면 그 이유는 단 한가지 (단일 책임) 여야만 한다. 요청을 보내는 쪽과 요청을 처리하는 쪽 (핸들러) 을 분리하는 패턴이다. 일련의 핸들러를 따라 요청을 전달하는 패턴이다. 핸들러는 요청을 받으면 자신이 처리할지 다음 핸들러로 넘길지 결정한다. 일련의 핸들러를 가지고 있지만 실제요청이 들어오기 전까지는 어떤 핸들러를 써야할지 모를 때 유용하다. 적절한 핸들러를 찾거나 체인이 모두 소진될 때까지 체인을 따라 요청이 전달된다. 다이어그램으로 살펴보기 클라이언트는 핸들러 체인에 요청을 보내 처리를 요청한다. 클라이언트는 자신이 어떤..
프록시 패턴 (Proxy Pattern) 이란?
프록시 패턴이란? 사전적 의미로 대리 혹은 대리인과 같은 의미가 있다. 사용자가 접근하고 싶은 오브젝트에 접근하기 전에 프록시 오브젝트라 불리는 오브젝트에 접근을 먼저 하도록 강제하는 것이다. 오브젝트 접근 요청 시 해당 요청은 먼저 프록시 오브젝트에게 간다. 실생활에 비유하자면 연예인을 섭외하기 위해서 연예인에게 직접 전화를 거는 것이 아니라 매니저에게 전화를 걸어 섭외하는 것이다. 다이어그램으로 보기 Proxy 는 데코레이터 패턴처럼 필드 내부에서 RealSubject 를 참조하고 있다. 활용 예제: 메서드의 소요시간 측정과 게으른 초기화 (Lazy initialization) 가정 자동차를 만드는 메서드가 있다. 자동차를 만드는데 걸리는 시간은 그때그때 다르다. 평균적으로 1초 ~ 1.5초가 걸린다..
플라이웨이트 패턴 (Flyweight Pattern) 이란?
플라이 웨이트 (Flyweight) 패턴이란? 구조와 관련된 디자인 패턴이다. 변화하지 않는(intrinsic) 재사용 가능한(resuable) 커다란 객체를 캐시에 저장해두고 재활용하는 기법이다. 여러 개의 클래스 내부 필드 중 공통으로 사용되는 필드를 따로 빼내어 공유하여 메모리를 더 확보할 수 있게 해준다. flyweight 의 영단어 뜻은 스포츠에서 아주 가벼운 체급을 말한다. 필드의 중복을 최적화할 수 있어서 많은 인스턴스를 만드는 애플리케이션에서 효율이 좋다. OOM 현상을 방지하는데 유용하다. 자주 변경되는 속성 (Intrinsic State) 과 자주 변경되지 않는 속성 (Extrinsic State) 을 분리하여 자주 변경되지 않는 것을 재사용한다. 객체지향적 디자인이 목적이라기보다 성능..
퍼사드 패턴 (Facade Pattern) 이란?
퍼사드 패턴 (facade pattern) 라이브러리 혹은 프레임워크에 간소화된 인터페이스를 제공하는 패턴이다. 클래스의 복잡한 시스템에 간소화된 인터페이스를 제공한다. 클래스를 직접 사용하지 않는 것이 포인트이다. 퍼사드란 건물의 대문같은 입구를 말한다. 또 여기엔 내부 구조를 숨긴다는 의미도 내포되어 있다. 복잡한 서브 시스템을 최대한 숨겨 의존성을 최소화하는 방법이다. 자바 이메일 코드로 보는 퍼사드 패턴 예제 기존의 코드 아래의 코드도 잘 돌아가며 잘못된 부분은 없다. 그러나 몇가지 단점이 있다. 테스트하기에 약간 힘든 코드이다. 코드의 의도를 이해하기 위해 기술적인 부분까지 봐야 한다. public class Client { public static void main(String[] args) ..
데코레이터 패턴 (Decorator Pattern) 이란?
데코레이터 패턴 (Decorator pattern) 래퍼 객체를 이용해 모듈과 비슷한 방식으로 기존 객체에 기능을 추가할 수 있다. 기존 기능에 영향을 주지 않고 가능하다. 런타임에 객체에 '행위' 혹은 '기능'을 추가할 수 있게 해준다. 기존 객체를 '행위'를 가진 특별한 래퍼 객체 (데코레이터)에 넣어서 객체가 그 '행위'를 할 수 있게 만든다. 캐싱, 로깅, 검증과 같은 기능에 쓰일 수 있다. 피자 클래스 데코레이터 패턴 적용 예제 피자를 클래스로 매핑하여 만들어보려고 한다. 데코레이터 패턴 적용 전 데코레이터 패턴 적용 전의 코드를 보자 Pizza 생성 public class Pizza { protected String pizzaName() { return "피자"; } } 일반 피자를 만들었다...
컴포지트 패턴 (Composite Pattern, 컴포짓 패턴) 이란?
컴포지트 (Composite) 패턴 그룹 전체와 개별 객체를 동일하게 처리할 수 있는 패턴이다. 트리 형태로 데이터를 표현할 수 있을 때 유용하다. 여러 오브젝트를 트리 구조로 재구성한 뒤 오브젝트들을 각각의 오브젝트처럼 이용한다. 트리는 Leaf 와 Composite 로 이루어져 있다. 클라이언트가 복잡한 구조의 오브젝트를 이용할 때 복잡함에 영향을 받지 않고 쉽게 오브젝트를 이용할 수 있도록 도와준다. 다이어그램으로 살펴보기 Component 가 구조상 가장 Primitive 한 단위가 된다. Component 를 구현한 것이 Leaf 가 된다. Component 를 구현하면서 내부에 Component 를 포함하는 것이 Composite 가 된다. 이렇게 중첩 구조를 가진다. Client 입장에서는 ..
브릿지 패턴 (Bridge Pattern) 이란?
브릿지 (Bridge) 패턴 커다란 클래스 혹은 긴밀하게 연관된 클래스를 추상 부분과 구현 부분으로 쪼개어 나눈다. 두 부분이 독립적으로 개발될 수 있다. extend 보다 composition 을 적극 활용한다. 다이어그램으로 살펴보기 현실 예제 컵을 판매하는 회사가 있다. 컵의 재질은 플라스틱, 유리, 종이 등이 존재한다. 컵의 색상은 빨간색, 파란색, 노란색, 초록색 등이 존재한다. 컵을 클래스화 시켜서 자바 프로그램에 녹여넣고 싶은데, 어떤 방식이 좋을까? 상속 (extend) 을 통한 접근 먼저 Cup 클래스를 만들었다. 컵의 재질을 표현하기 위해서 Material 인터페이스를 추가했다. Material 을 상속하는 Plastic, Glass, Paper 등을 만들었다. 이를 이용해 Cup 에 ..
자바 디자인 패턴, 객체 생성 관련 패턴 (Object Creational Patterns) 이란?
객체 생성 관련 패턴이란? 이름처럼 객체의 생성에 관여하는 패턴이다. 객체 생성 과정에서 일반적으로 생길 수 있는 문제를 해결하기 위해 등장했다. 5가지 객체 생성 관련 패턴에 대한 간략한 설명 싱글톤 패턴 (Singleton Pattern): 하나의 객체를 생성하여, 애플리케이션 전역에서 이용할 수 있도록 만들어준다. 생성 비용이 비싸거나 생성이 까다로운 혹은 보안상의 문제로 단 하나만 존재해야 하는 객체를 생성할 때의 문제를 해결한다. 팩터리 메서드 패턴 (Factory Method Pattern): 연관된 여러 오브젝트를 손쉽게 생성할 수 있도록 만들어준다. 공통적인 필드를 여러개 가지고 있는 다양한 종류의 오브젝트를 만들어야 할 때 중복 코드를 줄이고, 확실하게 공통로직을 사용할 수 있게 해준다...