Java (9) 썸네일형 리스트형 [Design Pattern] Structural - 브릿지 패턴 (Bridge Pattern) 브릿지 패턴은 abstract object structure 와 implementation object structure 의 계층이 분리되어 coupling 을 약화시키는 방향의 패턴이다. 여기서는 역할 Object 와 구현 Object 의 분리를 말한다기보단, 개념적은 측면으로서 역할 계층과 구현 계층을 확실하게 분리해주는 방향을 말한다. 문제 개요 위와 같은 UML 로직을 만든다고 해보자. 초기 요구사항에 맞춰서 Rectangle 을 그리기 위해서 Rectangle 을 abstract 화 하였고, 어떤 Rectangle 을 그리느냐에 따라 다른 방식으로 그릴 수 있도록 만들어줬다. public abstract class Rectangle { public void draw(){ // Rectangle .. [Design Pattern] Structural - 컴포지트 패턴 (Composite Pattern) Composite Pattern 은 한 인터페이스를 통해 Object Hierarchy 를 정의하여 생성할 수 있을 때 사용되는 패턴이다. 이 패턴을 사용하면 Tree 형태의 Hierarchical 한 구조를 표현할 수 있으며, 그렇게 표현된 Object 들을 동일한 역할체로 취급할 수 있다. 설명을 읽으면 이해가 안될 수 있는 꽤나 복잡한 패턴으로, 코드를 같이 보면서 이해해 나가길 권장한다. Composite Pattern 은 위와 같이 가상 상위 클래스를 두고, Hierarchy 상 최상단에 위치하는 Root Node 와 가상 클래스를 Inheritance 하며 Associate 하는 형태로 만들어준다. 이는 Decorator Pattern 에서도 봤던 모습이다. 그리고 abstract 상위 클래스.. [Design Pattern] Structural - 아답터 패턴 (Adapter Pattern) Adapter Pattern 은 Wrapper 라고도 불리는 패턴으로, Wrapping 과 같은 방법을 사용해서 서로 다른 일을 하게 된 두 interface 역할체들을 묶어주는 일을 해줄 때 사용하는 패턴이다. 현실에서 아답터처럼, 제공해주는 interface 를 다른 interface 와 연결해준다는 의미를 가지고 있다고 보면 된다. Adapter Pattern 에서는 Client 가 기대하고 있고 호출하는 interface 를 Target Interface 라고 한다. 아답터는 이 호출을 다른 인터페이스 측의 함수를 호출하게 되는데, 이 인터페이스는 Adaptee Interface 라고 한다. Client 는 이 Adapter 의 존재를 모른채 호출을 하기 때문에 Interface 연동성에 큰 도움.. [Design Pattern] Structural - 데코레이터 패턴 (Decorator Pattern) 데코레이이터 패턴은 이미 존재하고 있는 객체들에 대해서 dynamic wrapping 을 하여 그들의 [책임]을 변경 / 추가 하기 위해서 사용되는 패턴이다. 보통 동종 객체에서 다른 책임을 부여하기 위해서는 Inheritance 를 많이 사용하지만 Sub-Class 를 무분별하게 만들지 않고 책임지는 영역을 넓히기 위한 구조패턴이다. 해당 경우에서 각 구현체 안에서 동일한 특성들이 추가되어야 한다고 해보자. 가령, 각 커피에 휘핑크림이 들어가는지, 우유가 들어가는지, 모카가 들어가는지 등에 대한 속성들이 추가되어야 한다. 일반적으로는 Beverage 자체에 attribute 를 추가하는 방식을 생각할 것이다. 물론 틀린 것은 아니지만, 속성이 위와 같이 늘어날 때마다 계속 attribute 가 추가되는.. [Design Pattern] Creational - 빌더 패턴 (Builder Pattern) Spring 을 통해 개발을 해본 개발자라면 너무나 익숙할 Builder 패턴이다. 빌더 패턴은 Factory Method 처럼 최종적인 Product Object 생성을 위한 Creational 패턴이며, 그 Product 을 위해 여러 Part Object 들이 조립되어 생성되는 모습이 특징이다 (Spring 에서는 @Builder 를 사용해 빌더 패턴을 적용시킬 수 있다). 빌더 패턴 같은 경우 최종적인 Product 를 위해 Builder 들이 생성하게 되는 Part Object 들은 큰 의미가 없다. 그런 부분이 Builder 라는 Interface 를 사용해 Client 가 어떤 파트들이 등장하는지 알 필요 없게 만드는 이유이다. Builder 패턴에서 최종 Build 된 Product 가 어.. [Design Pattern] Creational - 팩토리 메소드 패턴 (Factory Method Pattern) Java 기준으로 객체를 생성할 때는 new 연산자를 통해서 Class Template 을 사용하여 Object Instance 를 찍어낸다. Interface 역할체를 생성할 때는 다음과 같은 연산을 통해서 구현체를 지정하기도 한다. Pizza a = new CheesePizza(); Pizza b = new PepperoniPizza(); 이와 같은 방식은 해당 로직이 있는 클래스에서 Concrete 구현체인 CheesePizza 와 PepperoniPizza 에 대한 의존성이 발생하게 된다. 만약 의존성 없이 이를 해결할 수 있다면, 유지 보수에 훨씬 용이할 것이다. 다음과 같이 Type 을 받아서 생성만을 전담하는 Class 를 만들어보자. public class SimplePizzaFactory.. [Design Pattern] Behavioral - 중재자 패턴 (Mediator Pattern) Mediator Pattern 은 Communication 중심의 디자인 패턴으로, Communication 이 Objects 들 간에 매우 복잡하게 진행되고 있을 때 그 역할을 위임하는 방식 등의 Controller 를 도입하는 패턴이다. Communication 을 하고자 하는 Colleague 들이 1:1로 직접 하는 것이 아니라, 중앙 Control Tower (Mediator) 을 둠으로써 Meidator 객체가 지속적으로 통신을 수집 / 분배하는 역할을 하게 된다. (통신 Colleague 들이 직접 수행을 한다면 N^2 의 Path 가 발생하여 복잡성이 증대된다) 1. Object 들 간의 상호 관계성을 encapsulate 한다 2. Colleague 들 간의 Coupling 을 약화시킨다.. [Design Pattern] Behavioral - 전략 패턴 (Strategy Pattern) Strategy Pattern 은 개인적인 생각으론 가장 기본이 되는 Pattern 으로, 많은 Pattern 들이 이 Strategy Pattern 으로 부터 파생되었다고도 한다. Strategy Pattern 은 어떻게 보면 무지성 Interface 사용하기에서 가장 기본적인 사용을 알 수 있도록 해주기도 한다. 우선 예제로 같이 살펴보자. 다음과 같은 UML을 구현해보려고 한다. Duck 이라는 최상위 계층이 있고, 다음과 같은 요구사항들을 만족하는 UML을 제시한다. 1. 모든 오리는 quack 할 수 있고, fly 할 수 있다2. 모든 오리는 반드시 동일한 방식으로 swim 한다3. 모든 오리는 display 방식을 스스로 구현해야 한다 Duck 이라는 최상위 계층이.. [Java] OOP, 객체 지향의 5대 원칙 (SOLID) Java 로 프로그램을 하게 될 경우, Java 의 언어적 특성인 객체지향 (OOP) 특성을 잘 반영하는 것이 중요합니다. 결국 모든 앱은 유지 보수 측면이 매우 중요한데, 이 OOP 측면을 잘 지키면, 유지 보수 및 관리에 큰 이점을 가져갈 수 있기 때문입니다. 이것이 어떻게 보면 Java 를 사용하는 이유라고 볼 수도 있을 것 같습니다. 객체 지향 설계에서 앱을 더욱 가독성 있고, 유연하고, 유지 보수 측면에서 유리하게 설계하기 위해서 제안되는 다섯가지 원칙을 SOLID 라고 합니다. Rober C. Martin 에 의해 제안된 이 다섯가지 원칙을 살펴보겠습니다. 굳이 다섯 포스트 만들면서 하나하나 까야할 내용은 아닌 것 같습니다. 차피 직접 설계해보시지 않으면 완전한 자신의 것이 되기는 힘들고,.. 이전 1 다음