CS/디자인패턴
[디자인 패턴] 개요
_OB1N
2021. 5. 17. 16:59
개발자가 자신이 작성한 코드에 바라는 건 다음 3가지 정도가 될 수 있다.
- 유연성(Flexible): 작은 노력으로 코드의 변화를 줄 수 있으면 좋겠다.
- 재사용성(Re-Usable): 다른 곳에 가져다 쓸 때, 별 탈없이 쓸 수 있으면 좋겠다.
- 유지보수성(Maintainable): 코드를 수정할 때, 다른 부분에 영향이 없이 쉽게 수정할 수 있으면 좋겠다.
이 요소과 더불어 가독성과 같은 추가적인 요소까지 모두 고려하면서 코드를 작성하는 것은 엄청난 노력이 필요할 것이다.
그래서!! 과거 선배 개발자들이 열심히 고민하면서 만들어낸 구조를 일반화시켜서 동일한 성격의 다양한 상황에 적용될 수 있도록 한 것이 바로 "디자인 패턴"이다.
1. 객체 지향 설계 원칙 _ SOLID원칙
먼저, 좋은 객체 지향 코드란 어떤 원칙을 따라야 하는가... 에 대해서 조금 더 알아보고 넘어가려고 한다.
일반적으로 코드의 품질에 대해 이야기 할때 응집도와 결합도에 대한 이야기를 하곤 하는데, 응집도는 높고 결합도는 낮은 것을 좋은 코드라 이야기한다. 이러한 관점을 객체 지향적으로 어떻게 만들 수 있는가에 대해 정리한 것이 SOLID원칙이다.
- SRP (단일 책임 원칙, Single Responsibility Principle): 한 클래스(또는 함수)는 하나의 책임만 가져야 한다.
- OCP (개방-폐쇄 원칙, Open-Closed Principle): 확장에는 열려있으나, 변경에는 닫혀 있어야 한다.
- 자주 변경되는 요소를 찾아 인터페이스나 추상 클래스로 클래스를 만들고 이를 이용해라.
- 자주 변경되는 요소를 찾아 인터페이스나 추상 클래스로 클래스를 만들고 이를 이용해라.
- LSP (리스코프 치환 법칙, Liskov Substitution Principle): 객체를 하위 타입의 인스턴스로 교체 가능해야 한다.
- ISP (인터페이스 분리 원칙, Interface Segregation Principle): 인터페이스가 잘 분리되어 있어야 한다.
- 인터페이스가 범용적으로 설계되어 있으면, 해당 인터페이스를 상속받은 클래스 입장에서는 필요 없는 기능임에도 불구하고 구현해야 하는 문제가 있기에 좋지 못한 설계에 속한다.
- 인터페이스가 범용적으로 설계되어 있으면, 해당 인터페이스를 상속받은 클래스 입장에서는 필요 없는 기능임에도 불구하고 구현해야 하는 문제가 있기에 좋지 못한 설계에 속한다.
- DIP (의존관계 역전 원칙, Dependency Inversion Principle): 의존관계에 있어 변하기 쉬운 것(구체적인 클래스)보다, 변하기 어려운 것(인터페이스, 추상 클래스)에 의존해야 한다.
- 구체적인 클래스에 변화를 주어야 한다고 생각해보면, 이 변화는 상위 클래스에 연쇄적인 변화를 만들게 될 것이고, 이는 좋지 못한 설계이다.
- 구체적인 클래스에 변화를 주어야 한다고 생각해보면, 이 변화는 상위 클래스에 연쇄적인 변화를 만들게 될 것이고, 이는 좋지 못한 설계이다.
2. 디자인 패턴
디자인 패턴은 크게 3가지 종류(Creational, Structural, Behavoir)로 나누어진다.
Creational Patterns | Structural Patterns | Behavoir Patterns |
Abstract Factory (추상 팩토리) | Adapter (어댑터) | Chain of Reponsibility (책임 연쇄) |
Builder (빌더) | Bridge (브리지) | Command (커맨드) |
Factory Method (팩토리 메소드) | Composite (컴퍼지트) | Interpreter (인터프리터) |
Prototype (프로토타입) | Decorator (데코레이터) | Mediator (중재자) |
Singleton (싱글톤) | Facade (퍼사드) | Memento (메멘토) |
Flywieght (플라이웨이트) | Observer (옵저버) | |
Proxy (프록시) | State (상태) | |
Stratgy (전략) | ||
Template Method (템플릿 메소드) | ||
Visitor (방문자) |
이러한 구분을 GoF 패턴이라 하며, 하나씩 공부해 가면서 정리해가고자 한다.
References
- Rohig Joshi. (2015). Java Design Patterns. Java Code Geeks
- https://dev-momo.tistory.com/entry/SOLID-%EC%9B%90%EC%B9%99