최근들어 디자인 패턴을 다시 학습하고 싶다는 생각이 강해졌었습니다.
그래서 디자인 패턴에 관련해 학습을 하며 블로그에 정리할 예정입니다. 총 세 편으로 생각하고 있고, 생성 패턴 / 구조 패턴 / 행위 패턴으로 나누어서 코드와 함께 정리할 예정입니다.
오늘은 디자인 패턴이 무엇인지 개념을 알아보고 생성 패턴 / 구조 패턴 / 행위 패턴의 특징을 간단히 정리해 볼 것입니다.
우선, 디자인 패턴이란 무엇일까?
디자인 패턴은 개발하면서 발생하는 반복적인 문제들을 어떻게 해결할 것인지에 대한 해결 방안입니다.
쉽게 말해 프로그래밍 세계에서의 가이드북인 것이죠. 📖
코드를 짜는데 자꾸만 중복되는 코드가 생길 때 어떻게 하면 방지할 수 있는지 궁금할 때 디자인 패턴이라는 가이드북을 펼쳐보면 됩니다.
디자인 패턴하면 꼭 GoF의 디자인 패턴이라는 것이 보입니다.
1995년 GoF(Gang of Four)라고 불리는 네 사람들이 디자인 패턴을 세 가지로 분류하며 구체화 하여 책을 썼고, 그리고 이 분류가 소프트웨어 공학에서 많이 사용되기때문에 이를 GoF의 디자인 패턴이라고 합니다. 본 글에서도 GoF의 디자인 패턴에서 소개된 23개 패턴을 정리해 볼 것입니다.
1) 생성 패턴
생성 패턴은 이름 그대로 객체의 생성과 관련된 패턴입니다.
객체의 생성과 참조 과정을 캡슐화하여 객체가 생성되거나 변경되어도 프로그램 구조가 영향을 받지 않도록 프로그램에 유연성을 더해줍니다.
이름 | 의도 |
추상 팩토리 패턴 | 동일한 주제의 다른 팩토리를 묶어 줍니다. |
빌더 패턴 | 생성과 표현을 분리해 동일한 생성 절차에서도 다른 표현 결과를 만들어 냅니다. |
팩토리 메서드 패턴 | 객체 생성을 서브 클래스로 위임해 캡슐화 합니다. |
프로토타입 패턴 | 원본 객체를 복제해 객체를 생성합니다. |
싱글톤 패턴 | 클래스의 인스턴스가 하나임을 보장하고 어디서든 참조할 수 있도록 합니다. |
2) 구조 패턴
구조 패턴은 클래스나 객체를 조합해 더 큰 구조로 만들 수 있게 해주는 패턴입니다.
예를 들어 서로 다른 인터페이스를 갖는 객체를 하나로 묶어 단일 인터페이스를 제공하거나, 객체들을 묶어 새로운 기능을 제공합니다. 구조 패턴은 객체를 묶어 새로운 구조를 만듭니다.
이름 | 의도 |
어댑터 패턴 | 클래스의 인터페이스를 다른 클래스도 함께 이용할 수 있도록 변환합니다. |
브리지 패턴 | 구현과 추상층을 분리해 각자 독립적으로 발전시킬 수 있게 합니다. |
컴포지트 패턴 (합성 패턴) | 0개, 1개 혹은 그 이상의 객체를 묶어 하나의 객체로 이용합니다. |
데코레이터 패턴 | 기존 객체에 다른 객체를 덧붙이는 방식으로, 매서드에 새로운 행동을 추가하거나 오버라이드 합니다. |
퍼싸드 패턴 | 인터페이스 집합에 접근할 수 있는 통합된 인터페이스를 제공합니다. |
플라이웨이트 패턴 | 크기가 작은 유사한 객체를 매번 생성하지 않고 공유하도록 하여 생성·조작하는 비용을 절감합니다. |
프록시 패턴 | 접근이 어려운 객체로의 접근을 제어하기 위해 대역을 제공합니다. |
3) 행위 패턴
행위 패턴은 클래스나 객체들이 서로 상호작용하는 방법이이나 어떤 알고리즘을 어떤 객체에 할당하는 것이 좋을지를 정의하는 패턴입니다. 즉, 객체나 클래스의 상호작용과 책임 분배 방법에 대해 정의하는 패턴입니다.
하나의 객체로 수행할 수 없는 작업을 여러 객체로 분배하면서 결합도를 최소화 할 수 있도록 도와줍니다.
이름 | 의도 |
책임 연쇄 패턴 | 객체가 요청을 처리하지 못하면 요청이 다음 객체로 넘어갑니다. |
커맨드 패턴 | 요청을 객체 형태로 캡슐화하여 재사용하거나 취소할 수 있도록 저장합니다. |
인터프리터 패턴 | 언어의 문법 규칙을 클래스로 표현하고 이를 기반으로 특정 입력을 해석하여 실행합니다. |
반복자 패턴 | 접근이 잦은 객체에 대해 동일한 인터페이스를 사용합니다. 여러 집합에 대해 일관된 방식으로 반복할 수 있습니다. |
중재자 패턴 | 객체들의 상호작용을 캡슐화하여 새로운 객체로 정의합니다. 객체간 결합도를 낮추고 재사용성을 높입니다. |
메멘토 패턴 | 복원을 위해 특정 시점에서 객체 내부 상태를 객체화해서 저장하는 패턴입니다. |
옵서버 패턴 | 객체의 변화를 상속되어있는 다른 객체들에게 알려 자동으로 갱신될 수 있게 하는 패턴입니다. |
상태 패턴 | 객체의 상태에 따라 동일한 동작을 다르게 행동해야할 때 사용합니다. |
전략 패턴 | 동일한 계열의 알고리즘을 캡슐화하여 클라이언트가 런타임에 이를 선택하여 사용하도록 합니다. |
탬플릿 메서드 패턴 | 상위 클래스에서 구조를 정의하고 하위 클래스에서 각기 다른 구체적인 처리를 합니다. |
방문자 패턴 | 객체 구조와 연산 작업의 결합을 없애고 유지보수성을 높입니다. 연산 작업은 각 클래스를 '방문'하여 수행합니다. |
마무리하며
디자인 패턴의 개념을 알아보고 각각 패턴의 특징을 알아보았습니다.
디자인 패턴은 공부해두면 언젠가 필요할 때 많은 도움이 될 것이라고 생각합니다.
수학의 공식과 비슷한 느낌이 들어요.
다음에는 생성 패턴의 종류를 자세히 알아보고, 코드와 함께 어떤 상황에서 적용할 수 있을지도 생각해 볼 것입니다. 감사합니다.
'Etc' 카테고리의 다른 글
엑셀 읽어오기 API 개발 시 꼭 고려해야하는 상황 및 예외처리 w 토지조서 엑셀, Apache POI 타입, 엑셀 서식 문제 (0) | 2025.03.02 |
---|---|
왜 우리는 CORS를 알아야 할까? (3) | 2024.11.09 |