본문 바로가기

전체 글51

프록시(Proxy) 패턴 - 구조 패턴 (Structural Patterns) 프록시 패턴은 다른 개체에 대한 접근을 제어하기 위한 디자인 패턴이다. 프록시 개체는 실제 개체에 대한 인터페이스를 제공하면서, 접근을 제어하거나 추가 기능을 수행할 수 있다. 실제 개체에 대한 접근을 통제하고, 로깅, 캐싱, 권한 확인 등 다양한 추가 기능을 제공할 수 있다. 프록시 패턴에는 종류가 있다.  1. 가상 프록시 (Virtual Proxy) : 실제 개체의 생성을 지연하여, 필요한 시점에만 생성한다. 예로 이미지 로딩을 지연시킬 때 사용할 수 있다. 2. 보호 프록시 (Protection Proxy) : 접근 제어를 위해 사용된다. 예로  권한 접근을 제한할때 사용할 수 있다.3. 원격 프록시 (Remote Proxy) :  원격 개체에 대한 접근을 제어한다. 예로 서버의 개체를 로컬에 접.. 2024. 5. 23.
플라이웨이트(Flyweight) 패턴 - 구조 패턴 (Structural Patterns) 플라이웨이트 패턴은 개체를 가능한 한번에 공유하여 사용하도록 하여 메모리를 절약하는 구조적 디자인 패턴이다. 대량의 개체를 다룰 때 유용하며, 개체의 상태를 분리하여 공유 가능한 상태(Intrinsic State)와 공유 불가능한 상태(Extrinsic State)로 나누어 메모리 사용을 최소솨 한다.  1. 공유 가능한 상태(Instrinsic State) - 개체간에 공유 할 수 있는 상태이다. 변경되지 않으며, 모든 개체가 동일하게 유지하는 부분이다.  2. 공유 불가능한 상태 (Extrinsic State) - 개체마다 다를 수 있는 상태이다. 개체가 사용될 때 외부에서 전달되는 상태이다. 3. 플라이웨이트 팩토리 (Flyweight Factory) - 플라이웨이트 개체들을 생성하고 관리하는 역할.. 2024. 5. 23.
퍼사드(Facade) 패턴 - 구조 패턴 (Structural Patterns) 퍼사드 패턴은 복잡한 서브 시스템에 대한 단순화된 인터페이스를 제공하여, 사용자가 복잡한 시스템을 쉽게 사용할 수 있도록 돕는 디자인 패턴이다. 여러 클래스의 복잡한 상호작용을 감추고, 단순한 인터페이스를 통해서만 시스템에 접근할 수 있게 한다. 1. 단순한 인터페이스 제공 : 서브 시스템의 복잡한 인터페이스를 단순화하여 제공한다.2. 복잡성 은닉 : 서브시스템의 내부 동작을 숨기고 사용자는 퍼사드 인터페이스를 통해서만 시스템을 사용할 수 있다. 3. 서브시스템과의 독립성 : 퍼사드는 서브 시스템과 클라이언트 코드 간의 의존성을 줄여준다. 개발자라면 평소에도 퍼사드 패턴의 사용자이다.어떤 뜻인지 이해가 안될 수 있는데 우리는 평소에도 많은 라이브러리와 프레임워크를 이용한다.이게 사실은 퍼사드 패턴으로 제.. 2024. 5. 23.
데코레이터(Decorator) 패턴 - 구조 패턴 (Structural Patterns) 데코레이터 패턴은 개체에 동적으로 새로운 기능을 추가할 수 있게 해주는 디자인 패턴이다. 개체를 다양한 방법으로 확장할 수 있어 코드의 유연성과 재사용성을 높일 수 있으며, 기존 개체를 변경하지 않고 기능을 확장할 수 있다.  예를 들어 커피머신을 생각해 보자  커피머신의 기본은 당연히 커피이다. 하지만 우유나 설탕을 추가함으로써 여러 조합을 만들 수 있다.   Component 인터페이스는 커피의 공통 인터페이스 역할을 한다. // Coffee 인터페이스: 커피의 공통 기능 정의interface Coffee { String getDescription(); double getCost();}  ConcreateComponent 클래스 // BasicCoffee 클래스: 기본 커피class Bas.. 2024. 5. 23.
컴포지트(Composite) 패턴 - 구조 패턴 (Structural Patterns) 컴포지트 패턴은 개체들을 트리 구조로 구성하여 부분-전체 계층을 나타내는 디자인 패턴이다.  이 패턴을 사용하면 클라리언트가 단일 개체와 복합 개체(여러 개체로 구성된 개체)를 동일하게 다를 수 있다. 개별 개체와 여러 개체로 구성된 그룹을 같은 방식으로 처리할 수 있게 해준다.  간단하게 예시로 파일 시스템을 생각해보자 파일 시스템의 구조는 파일과 폴더일것이다. 이때 파일은 개별 개체이고 폴더는 여러 파일이나 다른 폴더를 포함할 수 있는 복합 개체이다. 컴포징트 패턴을 사용하면 파일과 폴더를 같은 방식으로 처리할 수 있다.  1. Component(구성 요소) : 파일과 폴더의 공통 인터페이스 2. Leaf(잎) : 개별 개체, 본 예제에서는 파일을 의미3. Composite (복합 개체) : 복합 개.. 2024. 5. 23.
브리지(Bridge) 패턴 - 구조 패턴 (Structural Patterns) 브리지 패턴은 추상화와 구현을 분리하여 둘을 독립적으로 확장할 수 있도록 하는 디자인 패턴이다.  여러 모양과 색상이 있다고 가정해보자. 빨간색 원파란색 사각형 모양과 색상을 조합하는 모든 경우를 각각 클래스로 정의하면 클래스의 수가 기하급수적으로 늘어난다.브리지 패턴을 사용해서 모양과 색상을 분리하고 이들을 독립적으로 확장 할 수 있도록 해보자. Shape 클래스는 추상화 역할을 한다.// Shape 클래스: 추상화 역할abstract class Shape { protected Color color; protected Shape(Color color) { this.color = color; } public abstract void draw();} Color 인터페이스는.. 2024. 5. 23.
어댑터(Adapter) 패턴 - 구조 패턴 (Structural Patterns) 어댑터 패턴은 두개의 서로 호환되지 않는 인터페이스를 가진 클래스들이 함께 동작 할 수 있도록 중간에 어댑터 역할을 하는 클래스를 두는 디자인 패턴이다. 간단한 예시로는 전기 어댑터를 살펴보면 좋다. 한국에서는 220V 콘센트를 사용하는데 미국에서는 110V콘센트를 사용한다. 이때 한국에서 가지고간 220V 전자 제품을 미국에서 사용하고 싶다면 어댑터를 사용하는것이다. // V220Socket 인터페이스: 220V 소켓public interface V220Socket { void connect();} // V220Appliance 클래스: 220V 전자 기기public class V220Appliance implements V220Socket { @Override public void c.. 2024. 5. 16.
프로토타입(Prototype) - 생성 패턴(Creational Patterns) 프로토타입 패턴은 개체를 생성하는 디자인 패턴이다. 새로운 개체를 만들기 위해 기존의 개체를 복제하는 방법을 사용하는데 특히 개체 생성 과정이 복잡하거나 자원을 많이 소모할 때 유용하게 사용할 수 있다.기존에 만들어진 개체를 사용하여 새로운 개체를 생성하는 게 핵심인데 복제한 개체의 프로토타입(원본)을 가지고 있고, 이 원본 개체를 복제함으로써 새로운 개체를 빠르고 효율적으로 생성할 수 있다.  프로토타입 개체 정의 : 복제될 개체의 원분이 되는 프로토타입 개체를 정의한다. 이 개체는 모든 상태와 데이터를 가지고 있어야 하며, 자신을 복제할 수 있는 메커니즘을 제공해야 한다.  복제(클로닝) 메서드 : 프로토타입 개체는 자신의 복사본을 만들어 반환할 수 있는 clone() 메서드 같은 복제 메커니즘을 제.. 2024. 5. 15.
네 번째, 블로그를 하다 보니 2024년부터 블로그를 본격적으로 하고 있다.사실 크게 의미를 두지 않고 그냥 공부하면 글을 쓰고 물건을 사서 재미있으면 리뷰를 쓰고 뭐 이렇게 하려고 했다. 그런데 생각보다 글의 양이 많아지니 카테고리 정리가 필요하게 되었다. 다른 블로그는 어떤지 모르겠는데 티스토리는 카테고리가 2 뎁스까지라 정리가 쉽지 않다. 물론 내 블로그는 개발자 블로그로 볼 수도 있고... 그냥 일상을 남기는 어느 30대의 아저씨블로그로 볼 수 있다.앞으로도 티스토리로 블로그를 하는 게 맞는지 대체수단은 없는지 생각해 봐야겠다.수익을 내거나 하려는 게 아니라 태그도 넣지 않고 광고도 붙이지 않고 자기만족으로 시작한 블로그인데 생각만큼 자유롭지 않은 환경인 것 같아 아쉬움이 조금 있는듯하다. 블로그 명칭도 고민이다. 소소한 엔지.. 2024. 5. 15.
빌더(Builder) - 생성 패턴(Creational Patterns) 빌더 패턴은 개체의 생성 과정을 단계별로 분할하고, 그 과정을 캡슐화하여 복잡한 개체를 조립할 수 있게 도와주는 패턴이다. 이 패턴은 특히 복잡한 구성을 가진 개체를 생성할 때 유용하다. 동일한 생성 과정을 통해 다양한 표현과 구성의 개체를 만들 수 있다.  이 패턴의 구성을 먼저 보자  Builder : 개체의 여러 부분을 생헝하는 방법을 정의한 인터페이스이다. 여러단계에 걸쳐 복잡한 개체의 각 부분을 어떻게 생성할지 대한 세부사항을 포함한다. Concrete Builder : Builder 인터페이스를 구현하며, 구체적인 개체의 부품을 조립하는 방법과 최종 개체를 반환하는 메서드를 포함한다.  Director : Builder 인터페이스를 사용해 개체를 단계뼐로 생한다. Director는 어떤 순서로.. 2024. 5. 14.
추상 팩토리(Abstract Factory) - 생성 패턴(Creational Patterns) 추상 팩토리 패턴은 여러 관련 개체의 그룹, 서로 다르지만 특정 주제나 시나리오에 맞는 개체들을 생성하는 인터페이스를 제공하는 디자인 패턴이다. 이 패턴은 팩토리의 팩토리라고 표현할 수 있을 정도로 구체적인 클래스에 의존하지 않고 제품의 그룹을 생성할 수 있게 해 준다. 추상 팩토리의 구성은 팩토리 메서드 패턴과 비슷하다.  Abstract Factory  : 객체의 생성을 위한 인터페이스를 정의한다. 이 인터페이스는 여러 종류의 관련 있는 제품을 생성하는 메서드들을 포함한다. Concreate Factory : Abstract Factory 인터페이스를 구현하는 클래스이다. 특정 제품 그룹을 생성한다.Abstract Product : 생성될 제품들의 공통 인터페이스다.Concreate Product :.. 2024. 5. 14.
팩토리 메서드(Factory Method) - 생성 패턴(Creational Patterns) 팩토리 메서드 패턴은 객체 생성을 위한 인터페이스를 정의한다. 하지만 실제 객체 생성은 하위 클래스가 결정하도록 위임하는 생성 패턴이다. 이 패턴은 객체를 생성하는 코드와 해당 객체를 사용하는 코드를 분리함으로써 결합도를 낮추고, 유연성 및 확장성을 향상시킨다.Product (제품): 만들어질 객체들이 공통적으로 따라야 하는 인터페이스를 정의한다.Concrete Product (구체적인 제품): Product의 규칙을 실제로 구현한 객체이다.Creator (생성자): 객체를 만드는 방법을 선언하는 역할을 하며, "어떤 종류의 제품을 만들지"에 대해 추상적으로 정의한다. 실제 구현은 하위 클래스에서 이루어진다.Concrete Creator (구체적인 생성자): Creator가 정의한 메서드를 실제로 구현한.. 2024. 5. 13.