카테고리 없음

2022년 2회 정보처리기사 기출문제 15번

엉클지니 2025. 2. 7. 09:09

15. GoF(Gang of Four) 디자인 패턴을 생성, 구조, 행동 패턴의 세 그룹으로 분류할 때, 구조 패턴이 아닌 것은?

    Adapter 패턴 Bridge 패턴

     Builder 패턴 Proxy 패턴

 

GoF(Gang of Four) 디자인 패턴: 구조 패턴과 틀린 선택지 분석

**디자인 패턴(Design Pattern)**은 소프트웨어 설계에서 자주 사용되는 해결 방법을 정리한 패턴입니다.
GoF(Gang of Four) 디자인 패턴은 에리히 감마(Erich Gamma) 등 4명의 연구자가 정리한 23가지 디자인 패턴으로, 소프트웨어 개발에서 널리 사용됩니다.

이번 글에서는 GoF 디자인 패턴의 분류를 설명하고, 문제에서 제시된 선택지 중 구조 패턴이 아닌 항목을 분석하겠습니다.


1. GoF(Gang of Four) 디자인 패턴의 3가지 그룹

GoF 디자인 패턴은 생성(Creational), 구조(Structural), 행동(Behavioral) 패턴의 3가지 그룹으로 분류됩니다.

(1) 생성 패턴(Creational Pattern)

  • 객체의 생성과 관련된 패턴으로, 객체 생성을 캡슐화하여 코드의 유연성을 높입니다.
  • 대표적인 생성 패턴:
    • Factory Method
    • Abstract Factory
    • Singleton
    • Builder
    • Prototype

(2) 구조 패턴(Structural Pattern)

  • 클래스나 객체의 구조를 조정하여 유연성을 높이는 패턴입니다.
  • 대표적인 구조 패턴:
    • Adapter
    • Bridge
    • Composite
    • Decorator
    • Facade
    • Flyweight
    • Proxy

(3) 행동 패턴(Behavioral Pattern)

  • 객체 간의 상호작용 및 책임을 정의하는 패턴입니다.
  • 대표적인 행동 패턴:
    • Observer
    • Strategy
    • Command
    • Iterator
    • State
    • Visitor
    • Template Method

2. 문제에서 제시된 선택지 분석

패턴 분류 설명

① Adapter ✅ 구조 패턴 인터페이스 변환을 통해 기존 코드와 호환성을 유지하는 패턴
② Bridge ✅ 구조 패턴 구현과 추상화를 분리하여 독립적인 변경이 가능하도록 하는 패턴
③ Builder ❌ 생성 패턴 객체 생성을 단계적으로 수행하는 패턴 (구조 패턴이 아님)
④ Proxy ✅ 구조 패턴 객체에 대한 접근을 제어하는 대리 객체를 사용하는 패턴

틀린 선택지: ③ Builder 패턴

  • Builder 패턴은 객체 생성과 관련된 패턴으로, 생성 패턴(Creational Pattern)에 속합니다.
  • 구조 패턴(Structural Pattern)은 클래스나 객체의 구조를 변경하는 것이 목적이지만, Builder 패턴은 객체 생성을 유연하게 하는 것이 목적입니다.

💡 Builder 패턴은 "객체 생성을 단계적으로 수행하는 패턴"이므로 구조 패턴이 아니라 생성 패턴입니다. 따라서 정답은 "③ Builder 패턴"입니다.


3. 각 패턴의 개념 및 예제

(1) Adapter 패턴 (구조 패턴)

  • 기존 클래스의 인터페이스를 변환하여 다른 클래스와 호환되도록 하는 패턴.
  • 예제:
    interface Target {
        void request();
    }
    
    class Adaptee {
        void specificRequest() {
            System.out.println("Adaptee의 메소드 실행");
        }
    }
    
    class Adapter implements Target {
        private Adaptee adaptee;
    
        public Adapter(Adaptee adaptee) {
            this.adaptee = adaptee;
        }
    
        @Override
        public void request() {
            adaptee.specificRequest();
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Target adapter = new Adapter(new Adaptee());
            adapter.request(); // "Adaptee의 메소드 실행" 출력
        }
    }
    

(2) Bridge 패턴 (구조 패턴)

  • 구현과 추상화를 분리하여 독립적으로 확장할 수 있도록 하는 패턴.
  • 예제:
    interface Device {
        void turnOn();
        void turnOff();
    }
    
    class TV implements Device {
        public void turnOn() { System.out.println("TV On"); }
        public void turnOff() { System.out.println("TV Off"); }
    }
    
    class Remote {
        protected Device device;
    
        public Remote(Device device) {
            this.device = device;
        }
    
        public void power() {
            System.out.println("Remote power");
            device.turnOn();
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Remote remote = new Remote(new TV());
            remote.power(); // "Remote power" -> "TV On"
        }
    }
    

(3) Builder 패턴 (생성 패턴, ❌ 정답)

  • 복잡한 객체 생성을 단계별로 수행하는 패턴.
  • 예제:
    class Car {
        private String engine;
        private int wheels;
    
        public Car(String engine, int wheels) {
            this.engine = engine;
            this.wheels = wheels;
        }
    }
    
    class CarBuilder {
        private String engine;
        private int wheels;
    
        public CarBuilder setEngine(String engine) {
            this.engine = engine;
            return this;
        }
    
        public CarBuilder setWheels(int wheels) {
            this.wheels = wheels;
            return this;
        }
    
        public Car build() {
            return new Car(engine, wheels);
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Car car = new CarBuilder().setEngine("V8").setWheels(4).build();
        }
    }
    
  • Builder 패턴은 "객체 생성"을 다루므로 구조 패턴이 아니라 생성 패턴(Creational Pattern)입니다.

(4) Proxy 패턴 (구조 패턴)

  • 원래 객체에 대한 접근을 제어하는 대리 객체(Proxy)를 제공하는 패턴.
  • 예제:
    interface Subject {
        void request();
    }
    
    class RealSubject implements Subject {
        public void request() {
            System.out.println("RealSubject 요청 실행");
        }
    }
    
    class Proxy implements Subject {
        private RealSubject realSubject;
    
        public Proxy() {
            this.realSubject = new RealSubject();
        }
    
        public void request() {
            System.out.println("Proxy를 통해 접근");
            realSubject.request();
        }
    }
    
    public class Main {
        public static void main(String[] args) {
            Subject proxy = new Proxy();
            proxy.request(); // "Proxy를 통해 접근" -> "RealSubject 요청 실행"
        }
    }
    

4. 정리

선택지 분류 설명

① Adapter ✅ 구조 패턴 기존 인터페이스를 변환하여 호환성을 유지
② Bridge ✅ 구조 패턴 구현과 추상화를 분리하여 확장성을 높임
③ Builder ❌ 생성 패턴 객체 생성을 단계별로 수행하는 패턴 (구조 패턴 아님)
④ Proxy ✅ 구조 패턴 객체에 대한 접근을 제어하는 패턴

5. 결론

💡 GoF 디자인 패턴에서 "Builder 패턴"은 생성 패턴(Creational Pattern)에 속하며, 구조 패턴(Structural Pattern)이 아닙니다.
💡 문제에서 정답은 "③ Builder 패턴"입니다. 🚀

반응형