본문 바로가기
컴퓨터공학/정보처리기사

디자인 패턴에 관한 개념 정리

by 운명론자 2023. 1. 31.

이번 포스팅은 지난 객체 지향 설계에 관한 개념 정리에 이어 디자인 패턴에 대한 정리 글이다. 디자인 패턴이 무엇인지 개념을 먼저 알아보자. 디자인 패턴이란 소프트웨어 공학의 소프트웨어 설계에서 공통적으로 발생하는 이슈에 대해 자주 사용되는 설계 방법을 정리한 패턴을 의미한다. 개발의 효율성, 운용성 그리고 유지보수성 등의 품질을 높이기 위하여 개발 시 디자인 패턴을 참고하며 이는 프로그램이 최적화되는 것에 도움이 된다. 디자인 패턴의 구성요소를 알아보자. 디자인 패턴은 여섯 가지로 구성되어 있다. 패턴의 이름, 샘플 코드, 사례, 결과, 설루션, 문제 및 배경이 있다. 먼저 패턴의 이름이란 디자인 패턴을 부를 때 쓰는 이름과 디자인 패턴의 유형이다. 샘플 코드란 디자인 패턴이 적용되는 원시 코드이다. 사례란 디자인 패턴을 간단하게 적용한 사례이다. 결과란 디자인 패턴을 사용할 때 얻게 되는 영향이나 장점이다. 설루션이란 디자인 패턴을 이루고 있는 요소들, 협동 과정, 관계를 의미한다. 마지막으로 문제 및 배경이란 디자인 패턴이 사용되고 있는 분야나 배경, 해결해야 하는 문제를 뜻한다. 다음으로는 디자인 패턴 유형을 알아보자. 디자인 패턴의 유형으로는 생성 패턴과 구조 패턴 그리고 행위 패턴 세 가지가 있다. 생성 패턴이란 클래스를 정의하고 객체 생성 방식을 구조화하며 객체 인스턴스 생성에 참여, 캡슐화를 수행하는 패턴이다. 구조 패턴이란 클래스나 객체의 조합을 더 큰 구조 형성을 목적으로 다루는 패턴이다. 행위 패턴이란 클래스나 객체들의 역할 분담과 상호 작용하는 법을 다루는 패턴이다. 이러한 디자인 패턴은 크게 생성 패턴, 구조 패턴, 행위 패턴 세 가지로 나뉘며 이러한 큰 패턴 안에서 여러 가지 상세 패턴으로 나뉜다. 먼저 생성 패턴은 빌더, 프로토타입, 팩토리 메서드, 앱스트랙 팩토리, 싱글톤이 있다. 먼저 빌더 패턴이란 복잡한 인스턴스를 조합하여 만들어진 구조로 복합 객체를 만들 때 객체를 생성하는 방식과 객체를 표현하는 방식을 분리하여 똑같은 생성 절차이지만 서로 다른 표현 결과를 만들 수 있는 패턴이다. 이러한 빌더 패턴은 표기와 생성을 분리하여 복잡한 객체를 만들어낸다. 프로토타입 패턴은 첫 시작부터 일반적인 원형을 만든 뒤에 이를 복사하여 필요한 부분만 수정해 사용하는 패턴이다. 만들어 낼 객체의 원형을 제공하는 인스턴스에서 만들어 낼 객체들의 타입이 어떻게 나올지 결정되게 설정하며 객체를 만들 때 갖춰야 할 기본적 형태가 있을 때 사용되는 패턴이다. 즉 쉽게 말해 기존 객체를 복제하여 객체를 만들어내는 것이다. 세 번째 팩토리메서드 패턴이란 상위에 클래스에서 객체를 만드는 인터페이스를 정의하고 하위에 클래스에서 인스턴스를 생성하도록 하는 방법이다. 상위 클래스에서는 어떻게 인스턴스를 만들지만 결정한 뒤에 하위 클래스에서 그러한 데이터의 생성을 책임지고 조작하는 함수들을 모아 오버라이딩해 실제 객체를 만드는 클래스와 인터페이스를 분리해 내는 특징을 가진 디자인 패턴이다. 생성될 객체는 클래스에 국한되지 않고 만들어진다. 앱스트랙 팩토리 패턴에 대하여 알아보자. 앱스트랙 팩토리 패턴은 세부적인 클래스에 의존하지 않고 의존적이거나 서로 관련된 객체들의 조합을 만드는 인터페이스를 제공한다. 이러한 패턴을 통하여 만들어진 클래스에서는 사용자에게 인터페이스를 제공하며 구체적인 구현은 콘크리트 프로덕트 클래스에서 나타나는 특징을 갖고 있다. 주제가 동일한 각기 다른 팩토리를 묶어낸다. 싱글톤 패턴이란 전역 변수를 이용하지 않고 한 가지 객체만 생성하도록 한다. 생성된 객체는 어디서든 참조할 수 있게 디자인하는 패턴이다. 한 클래스에서는 한 가지 객체만 있을 수 있도록 제한하는 특징이 있다. 생성 패턴에 대해 알아보았으니 구조 패턴으로 넘어가 보자. 구조 패턴에는 브리지, 데코레이터, 퍼사이드, 플라이 웨이트, 프록시, 컴포지트, 어댑터 총 여섯 가지로 구성되어 있다. 브리지란 구현뿐만 아니라 추상화된 부분도 바뀌어야 할 경우 활용되는데, 기능 클래스 계층과 구현 클래스 계층을 이으며 구현부에서 추상 계층을 각각 분리해 추상화된 부분과 실제 구현 부분을 독립적으로 확장해 나갈 수 있는 패턴이다. 데코레이터 패턴 패턴이란 이전에 구현된 클래스에 필요한 기능들을 더해 나가는 설계 패턴이다. 기능적 확장을 해야 할 때 객체끼리 결합을 하여 기능을 동적으로 유연하게 나아갈 수 있게 해 주어 상속을 대체하여 사용하는 패턴이다. 객체 간 결합을 통하여 동적이고 유연하게 확장할 수 있다는 장점이 있다. 퍼사이드 패턴이란 단순한 인터페이스를 복잡한 시스템에 적용하여 사용자와 시스템 사이 또는 여러 시스템끼리의 결합도를 낮추어 쉽게 시스템 구조를 파악할 수 있게 하는 패턴이다. 단위별로 오류에 대하여 확인할 수 있게 해 주며 단순한 인터페이스를 제공해 사용자 측면에서 접근성이 높아진다는 장점이 있다. 여러 가지 통합된 인터페이스를 쓸 수 있게 해주는 디자인 패턴이다. 프록시 패턴은 실체 객체에 대한 대리 객체로 정의할 수 있다. 필요 행동을 실체 객체를 접근하기 전에 취할 수 있게 해 주며 이러한 점을 이용해 미리 할당하지 않아도 되는 것들을 실제 이용 시에 할당하게 해 메모리 용량을 아껴주며 실체 객체를 드러내지 않게 해 정보 은닉의 기능도 할 수 있는 패턴이다. 특정한 객체로 접근을 제어할 때 사용된다. 컴포지트 패턴은 트리 구조로 객체들의 관계를 구성해 부분과 전체 계층을 그려내는 패턴으로 사용자가 모두 동일하게 단일 객체와 복합 객체를 다룰 수 있도록 하는 패턴이다. 단일 객체와 복합 객체를 똑같이 취급한다는 게 특징이다. 마지막 어댑터 패턴은 이전에 만들어진 클래스를 다시 사용할 수 있도록 중간에서 맞춰주는 기능을 하는 인터페이스를 생성하는 패턴이다. 위임을 사용하는 인스턴스 패턴과 상속을 사용하는 클래스 패턴 두 가지 형태로 사용된다. 타 클래스의 인터페이스를 기존에 사용하던 인터페이스에 덧씌워 인터페이스가 호환되지 않는 클래스들을 같이 이용하게 해 준다.

댓글