본문 바로가기

ComputerScience

(72)
[DesignPattern] 템플릿 메소드 패턴 (Template Method Pattern) 템플릿 메소드 패턴 템플릿 메소드 패턴은 알고리즘의 골격을 정의합니다. 템플릿 메소드를 사용하면 알고리즘의 일부 단계를 서브 클래스에서 구현할 수 있으며, 알고리즘의 구조는 그대로 유지하면서 알고리즘의 특정 단계를 서브 클래스에서 재정의할 수도 있습니다. 쉽게 말해 템플릿 메소드 패턴은 알고리즘의 템플릿을 만들고, 이 템플릿은 일련의 단계로 알고리즘을 정의한 메소드입니다. 위 UML Class Diagram 에서, AbstractClass는 templateMethod() 작업을 정의합니다. 이 메서드는 행동의 뼈대를 구현하고, primitive1()과 primitive2() 메시지를 자기 자신에게 보냅니다. 이 메시지들은 SubClass1에서 구현되어 있기 때문에 이 서브클래스에서 해당 알고리즘의 일부를..
[DesignPattern] 퍼사드 패턴(Facade Pattern) 퍼사드 패턴(Facade Pattern) 퍼사드 패턴은 서브 시스템에 있는 일련의 인터페이스를 통합 인터페이스로 묶어줍니다. 또한 고수준 인터페이스도 정의하므로 서브시스템을 더 편하게 쓸 수 있습니다. 위의 UML Class Diagram에서, Client 클래스는 Subsystem 클래스들에 직접적으로 접근하지 않습니다. 대신, Client는 간단한 인터페이스를 구현하고 Subsystem 클래스들 (Class1, Class2 및 Class3)을 통해 작동하는 Facade 클래스를 통해 작업합니다. Client는 단순한 Facade 인터페이스에만 의존하며 복잡한 서브시스템에 대해 독립적입니다. 여기서 중요한 포인트는 Facade 디자인 패턴을 사용하여 복잡한 서브시스템을 단순한 인터페이스로 감싸고, 클라..
[DesignPattern] Adapter Pattern 어댑터 패턴(Adapter Pattern) 어댑터 패턴은 특정 클래스 인터페이스를 클라이언트에서 요구하는 다른 인터페이스로 변환합니다. 이로써 인터페이스가 호환되지 않아 같이 쓸 수 없었던 클래스를 사용할 수 있게됩니다. 위의 UML Class Diagram에서, Target 인터페이스를 필요로 하는 Client 클래스는 Adaptee 클래스의 인터페이스가 Target 인터페이스와 일치하지 않기 때문에 Adaptee 클래스를 직접 재사용할 수 없습니다. 대신 클라이언트는 Adapter 클래스를 통해 작업하며, 이 Adapter 클래스는 Adaptee를 사용하여 Target 인터페이스를 구현합니다. 객체 어댑터 방식은 런타임에 어댑티 객체에 위임함으로써(Adaptee.specificOperation()) ..
[DesignPattern] Command Pattern 커맨드 패턴(Command Pattern) 커맨드 패턴을 사용하면 요청 내역을 객체로 캡슐화해서 객체를 서로 다른 요청 내역에 따라 매개변수화할 수 있습니다. 위의 UML Class Diagram 에서 Invoker 클래스는 직접 요청을 구현하지 않습니다. 대신 Invoker는 요청을 수행하기 위해 Command 인터페이스를 참조합니다(command.execute()). 이로써 Invoker는 요청이 어떻게 수행되는지와는 독립적이게 됩니다. Command1 클래스는 Command 인터페이스를 구현하여 Receiver1 객체에 대한 작업을 수행합니다 (receiver1.action1()). UML Sequence Diagram은 런타임 상호 작용을 보여줍니다. Invoker 객체가 Command1 객체에서..
[DesignPattern] Singleton Pattern 싱글톤 패턴 (Singleton Pattern) Singleton 패턴은 소프트웨어 디자인 패턴 중 하나로, 클래스의 인스턴스화를 단일 인스턴스로 제한하는 소프트웨어 디자인 패턴입니다. "Gang of Four" 디자인 패턴 중 하나로, 객체 지향 소프트웨어에서 반복적으로 발생하는 문제를 해결하는 방법을 설명합니다. 이 패턴은 시스템 전체에 걸쳐 작업을 조정해야 할 때 유용합니다. Singleton 패턴을 사용하면 객체가 다음을 수행할 수 있습니다. 1. 하나의 인스턴스만 가지도록 보장 2. 해당 인스턴스에 쉽게 액세스 3. 인스턴스의 생성을 제어 (예: 클래스의 생성자를 숨김) 이 용어는 수학적인 개념인 'singleton'에서 유래되었습니다. 싱글톤은 종종 global 변수와 비교하여 선호되는데, 그..
[DesignPattern] Factory Pattern과 Factory Method, Abstract Factory 차이 (+피자가게 예시) Factory Pattern 새로운 객체가 필요한 곳마다 new를 사용하여 구상 클래스를 코딩하면, 나중에 코드를 수정해야 할 가능성이 커지고 유연성이 떨어집니다. 디자인 패턴을 적용하지 않은 코드 예시를 보겠습니다. public class DependentPizzaStore { public Pizza createPizza(String style, String type) { Pizza pizza = null; if (style.equals("NY")) { if (type.equals("cheese")) { pizza = new NYStyleCheesePizza(); } else if (type.equals("veggie")) { pizza = new NYStyleVeggiePizza(); } else i..
[DesignPattern] Decorator Pattern Decorator Pattern 데코레이터 패턴(Decorator pattern)이란 주어진 상황 및 용도에 따라 동적 혹은 정적으로 어떤 객체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때 서브클래싱 대신 쓸 수 있는 유연한 대안이 될 수 있습니다. 여기서 동적으로 추가할 때는 보통 특정 객체를 결합하는 방식을 사용합니다. Class Diagram (클래스 다이어그램) Abstract Decorator (추상 데코레이터) 클래스 이 클래스는 Component 객체를 참조하는 참조 변수 (component)를 유지합니다. 모든 요청을 이 참조된 객체로 전달합니다 (component.operation()). 이로써 Decorator는 Component의 클라이언트에게 투명하게(보이지 않게) 동작합니다..
[DesignPattern] Observer Pattern Publishers + Subscribers = Observer Pattern 옵저버 패턴(Observer Pattern)은 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의합니다. 1. Class Diagram (클래스 다이어그램) Subject 클래스는 의존 객체(dependent objects)의 상태를 직접적으로 업데이트하지 않습니다. 대신, Subject는 Observer 인터페이스의 메서드 update()를 참조하여 상태를 업데이트합니다. 이렇게 함으로써 Subject는 의존 객체의 상태가 어떻게 업데이트되는지에 독립적이게 됩니다. Observer1과 Observer2 클래스는 Observer ..