본문 바로가기
정보처리기사

[정보처리기사] Gof 디자인 패턴 생성패턴 암기하기 (feat. 스타크래프트)

by 공불러 2024. 2. 22.
728x90
반응형

[정보처리기사] Gof패턴 생성패턴 암기하기 (feat. 스타크래프트)

생성패턴암기방법

 

Gof 디자인 패턴은 정보처리기사  실기에서 매우 빈출로 나오는 문제 중 하나입니다. 생성, 구조, 행위 중 어디에 속하는 패턴인지 찾거나 패턴 하나에 대한 설명을 하고 무슨 패턴인지 물어봅니다. 첫 번째 힌트는 생성 패턴 중 ~한 패턴이다와 같이 생구행 중 어디에 속하는 지 물어봅니다.

이를 쉽게 외우기 위해 Gof 디자인 패턴을 스타크래프트에 비교해보겠습니다. Factory라는 단어가 많이 나와 저는 자꾸 테란이 생각나더라구요...ㅎㅎ

목차

     

    1. 생성 패턴이란?

    생성 패턴(creational patterns)은 객체를 생성하는 과정을 추상화하고, 객체의 생성 방법을 결정하는 디자인 패턴입니다. 이러한 패턴들은 객체를 생성, 조합 및 표현하기 위한 방법을 제공하여 객체 생성 과정에서의 유연성과 재사용성을 증가시킵니다. 주로 다음과 같은 상황에서 사용됩니다:

    1. 객체 생성 과정이 복잡하거나 다양한 조건에 따라 달라져야 할 때
    2. 객체 생성을 캡슐화하고, 시스템의 다른 부분과의 결합도를 낮추고 싶을 때
    3. 객체 생성의 변화를 관리하고 유연성을 확보하고자 할 때

    생성 패턴은 소프트웨어 디자인 패턴 중 하나로, 객체의 생성 방식을 다룹니다. 이 패턴은 객체 생성의 복잡성을 숨기고, 객체의 유형을 시스템에서 유연하게 관리하고 재사용할 수 있는 방법을 제공합니다.

     

    생성 패턴의 주요 목적은 객체 생성 프로세스를 추상화하여 응용 프로그램의 유연성과 확장성을 향상시키는 것입니다. 이러한 패턴은 새로운 객체를 생성하고 조합하는 방법에 대한 일반적인 해결책을 제시합니다.

     

    (출처: Gamma, E., Helm, R., Johnson, R., & Vlissides, J. 디자인 패턴: 객체지향 소프트웨어를 재사용하는 기법. 1995)

     

    2. 생성 패턴 설명 표

    2.1 생성 패턴 설명 및 키워드 표

    패턴 설명 키워드
    빌더
    (builder)

    여러단계로 나누어
    조립, 분리
    복잡한 생성 과정을 여러단계로 나누어 처리한다.
    최종적으로 다양한 표현을 갖는 객체를 생성할 수 있도록 한다.
    코드의 유지보수성과 확장성을 향상시키는데 유용하다.

    복잡한 인스턴스를 조립하여 만드는 구조.

    생성하는 방법과 구현하는 방법을 분리.
    집을 짓는 사람을 연상.
    공간을 분리해서 각 공간을 어떻게 꾸밀까 고민하는 빌더.
    생성자, 조립, 분리, 꾸밈
    프로토타입
    (prototype)

    기존 객체 복제
    원형을 만들어서 필요한 부분에만 사용하는 패턴.
    기존 객체를 복사함으로써 다른 객체를 생성.
    원형, 복사, 생성
    팩토리 메소드
    (factory method)

    서브클래스가 결정
    객체 생성을 처리하는 인터페이스를 제공.
    실제 객체의 생성은 서브클래스가 결정하도록 위임

    1. 상위 클래스에서 객체를 생성하는 인터페이스를 정의.
    ( 인터페이스는 객체의 행동을 정의하는 것을 말함. 인터페이스를 정의한다는 것은 상위 클래스가 반드시 가져야하는 행동을 정의한다는 의미)

    2. 하위 클래스에서 인스턴스를 생성하는 방식.


    팩토리에서 제품을 뽑아 낼 때, 기계들을 설치하는 것과 실제 뽑아내야할 제품의 기능은 별개로 정하는 방식.

    오버라이딩이 필수인 패턴.
    오버라이딩은 상위(부모) 클래스에서 정의된 메소드를 하위(자식)클래스에서 재정의하는 방식을 말하므로, 팩토리 메소드는 인터페이스와 오버라이딩이 주요 키워드이다.

    * 오버로딩은 동일 메소드가 여러 형태의 매개변수를 가지고 갯수도 다르게 가질 수 있는 것을 말한다는 것도 기억해두기
    인터페이스, 상속,
    오버라이딩,
    서브클래스가 결정
    추상 팩토리
    (Abstract Factory)

    객체 패밀리 생성 인터페이스
    서로 관련된 객체들의 패밀리를 생성하기 위해 인터페이스를 제공한다.
    구체적인 클래스를 명시하지 않아도 객체들을 생성할 수 있다.

    구체적인 클래스에 의존하지 않음.

    ( 즉, 클라이언트 코드가 실제로 사용하는 객체가 어떤 구체적인 클래스인지에 대해 알 필요가 없습니다.)
    의존성 역전 원칙(Dependency Inversion Principle, DIP)

    서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스 제공.
    (하위 클래스의 객체들의 조합으로 인터페이스를 생성)

    생성된 클래스에서는 사용자에게 API를 제공.
    ( 인터페이스를 통해 일관된 방법으로 객체를 생성하고 조작할 수 있는 메소드를 제공한다는 의미)

    구체적인 구현은 Concrete Product(구체적 제품) 클래스에서 이루어짐.

    동일한 주제의 서로 다른 팩토리로 묶음.
    관련된 객체 , 의존성, 조합,
    인터페이스
    싱글톤
    (Singleton)

    하나만 생성
    객체를 하나만 생성하도록 하는 패턴.

    전역 변수 사용 불가.
    ( 전역 변수는 어디서든 사용할 수 있는 변수 이기 때문에 Singleton 구현과 반대됨)

    생성된 객체는 어디에서는 참조할 수 있음.


    한 클래스에 하나의 객체만을 존재하도록.
    하나, 참조, 전역

     

    2.2 생성 패턴 부가 설명

    2.2.1 인터페이스(Interface)

    객체의 행동을 정의하기 위한 일종의 계약(Contract)입니다.

    즉, 인터페이스는 객체가 제공해야 하는 동작(메서드)들의 집합을 명시적으로 정의하는 것입니다.

    이 동작들은 메서드의 형식만을 가지고 있고, 실제 구현 내용은 포함하지 않습니다.

    인터페이스는 객체 간의 상호작용을 위해 사용되며, 특정 객체가 어떤 기능을 제공하는지 알려주는 역할을 합니다.

     

    JAVA에서 위 인터페이스를 쓸 때는 Interface - Implement를 꼭 기억해야한다.

    2.2.2  추상 팩토리 메서드 부가 설명

    클라이언트 코드란 서버에 작성되어 있는 기능을 클라이언트에서 불러오는 모든 소스를 말합니다. 웹 개발에선 일반적으로 그렇게 여겨지는 용어입니다. 앞서 추상 팩토리 메서드 설명에서 클라이언트 코드에 대해 언급되어 있었는데, 상위 클래스에 대해 정확히 어떻게 되어 있는지 몰라도 하위 팩토리에서 사용할 수 있다는 것을 말합니다.

     

    서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스 제공: 추상 팩토리는 서로 연관되거나 의존적인 객체들의 조합을 만드는 데 사용됩니다.

    즉, 여러 객체들의 집합을 일관되게 생성하는 인터페이스를 제공합니다. 이를 통해 객체들 간의 관계를 일관되게 유지하고, 객체들 간의 결합도를 낮출 수 있습니다.

     

    예시. 팩토리 메서드에서 상위 클래스에서 인터페이스만 정의하고 하위 클래스에서 인스턴스를 생성하는 방식

    // 동물을 생성하는 인터페이스
    public interface AnimalFactory {
        // 동물을 생성하는 메소드
        Animal createAnimal();
    }
    
    // 강아지를 생성하는 구체적 팩토리 클래스
    public class DogFactory implements AnimalFactory {
        @Override
        public Animal createAnimal() {
            return new Dog(); // 강아지 객체 생성
        }
    }
    
    // 고양이를 생성하는 구체적 팩토리 클래스
    public class CatFactory implements AnimalFactory {
        @Override
        public Animal createAnimal() {
            return new Cat(); // 고양이 객체 생성
        }
    }

    2.2.3 추상화(Abstraction)

    복잡한 현실 세계를 단순화하여 필요한 부분에만 초점을 맞추는 과정입니다. 즉, 추상화는 객체의 공통된 특성이나 동작을 추출하여 그것을 클래스나 인터페이스로 정의하는 것을 말합니다. 추상화를 통해 객체들 간의 공통된 특징을 찾아내고, 이를 일반화하여 새로운 클래스나 인터페이스를 생성할 수 있습니다.

    3. 스타크래프트로 암기하기

    3.1 빌더 패턴

    테란의 건물 건설 과정은 빌더 패턴과 유사합니다.

    건물을 건설하는 SCV는 복잡한 구조를 조립하여 건물을 만들어냅니다. 이것은 실무에서 객체의 생성 및 초기화 과정이 복잡한 경우에 유용하게 적용될 수 있습니다.

    예를 들어, 대규모 웹 애플리케이션의 구성 요소를 조립할 때 빌더 패턴을 사용하여 각 요소를 조합하고 관리할 수 있습니다.

    3.2 프로토타입 패턴

    테란의 SCV는 건물을 건설할 때 원본 건물을 복제하여 새로운 건물을 만듭니다. 이것은 실무에서 데이터베이스나 다른 소스에서 데이터를 가져와서 객체를 생성할 때 유용합니다.

    데이터의 복사본을 만들어 작업을 수행하면 데이터 소스에 더 적은 부하를 주고 성능을 향상시킬 수 있습니다.

    3.3 팩토리 메소드

    테란의 공장 건물이 팩토리 메소드 패턴을 사용합니다. 공장은 건물 건설을 위해 SCV를 생산하는데, 이 때 SCV를 생산하는 과정을 서브 클래스에 위임합니다.

    각각의 건물마다 SCV를 생산하는 방법이 다를 수 있으며, 각 건물마다 해당하는 공장을 만들어 SCV를 생산합니다

    3.4 추상 팩토리 패턴

    테란의 공장 건물이 추상 팩토리 패턴을 사용합니다.

    공장은 건물 건설을 위해 여러 종류의 유닛을 동시에 생산할 수 있습니다. 예를 들어, 배럭과 팩토리를 동시에 생산할 수 있으며, 각 유닛을 생산하는 공장을 각각 만들어 관리합니다.

    이렇게 하면 클라이언트는 구체적인 유닛을 직접 선택할 필요 없이, 해당하는 공장을 통해 유닛을 생산할 수 있습니다.

     

    3.5 싱글톤 패턴

    테란의 지휘 센터는 게임 내에서 오직 하나만 존재할 수 있으며, 생성된 지휘 센터는 어디서든 참조할 수 있습니다. 이것은 실무에서 로깅, 설정 관리, 캐시 등과 같이 전역적으로 사용되는 객체를 관리할 때 유용합니다.

    예를 들어, 로깅 라이브러리의 인스턴스를 싱글톤으로 구현하여 애플리케이션 전체에서 한 번만 초기화하고 사용할 수 있습니다.

     

    4. 예시 문제

    1. 아래 설명에 해당하는 디자인 패턴은 무엇인가요?
      "복잡한 인스턴스를 조립하여 만드는 구조. 생성하는 방법과 구현하는 방법을 분리합니다. 집을 짓는 사람을 연상시켜, 공간을 분리해서 각 공간을 어떻게 꾸밀지 고민하는 패턴입니다."
      • : 빌더 패턴 (Builder Pattern)
    2. 아래 설명에 해당하는 디자인 패턴은 무엇인가요?
      "원형을 만들어서 필요한 부분에만 사용하는 패턴이며, 기존 객체를 복사함으로써 다른 객체를 생성하는 패턴입니다."
      • : 프로토타입 패턴 (Prototype Pattern)
    3. 아래 설명에 해당하는 디자인 패턴은 무엇인가요?
      "상위 클래스에서 객체를 생성하는 인터페이스를 정의하고, 하위 클래스에서 인스턴스를 생성하는 방식입니다. 오버라이딩이 필수인 패턴입니다."
      • : 팩토리 메소드 패턴 (Factory Method Pattern)
    4. 아래 설명에 해당하는 디자인 패턴은 무엇인가요?
      "구체적인 클래스에 의존하지 않고, 서로 연관되거나 의존적인 객체들의 조합을 만드는 인터페이스를 제공하는 패턴입니다. 동일한 주제의 서로 다른 팩토리로 묶입니다."
      • : 추상 메소드 패턴 (Abstract Factory Pattern)
    5. 아래 설명에 해당하는 디자인 패턴은 무엇인가요?
      "객체를 하나만 생성하도록 하는 패턴이며, 전역 변수 사용 불가합니다. 생성된 객체는 어디에서나 참조할 수 있으며, 한 클래스에 하나의 객체만을 존재하도록 합니다."
      • : 싱글톤 패턴 (Singleton Pattern)
    728x90
    반응형

    댓글