디자인 패턴
자주 사용하는 설계 형태를 정형화해서 이를 유형별로 설계 템플릿을 만들어둔 것
- 객체지향 언어를 이용해 프로그래밍 할 때 디자인 패턴을 사용한다면 보다 효율적이고 재사용성이 높은 설계 가능
- 유지보수 용이
디자인 패턴의 종류
GoF(Gang of Four)가 정의하는 디자인 패턴 → 총 23가지
- 생성 패턴(Creational Pattern)
- 객체를 생성하는 것과 관련된 패턴으로 객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화 하도록 만들어 줌
- 유연성 높일 수 있고 코드를 유지하기 쉬운 편
- 종류
- Factory Method : 생성할 객체의 클래스를 국한하지 않고 객체 생성
- Singleton : 한 클래스에 한 객체만 존재하도록 제한함
- Prototype : 기존 객체를 복제함으로써 객체를 생성
- Builder : 생성과 표기를 분리해 복잡한 객체를 생성함
- Abstraction Factory(추상 팩토리) : 동일한 주제의 다른 팩토리를 묶어줌
- 구조 패턴(Structural Pattern)
- 프로그램 내의 자료구조나 인터페이스 구조 등 프로그램의 구조를 설계하는데 많이 활용
- 규모가 크고 복잡한 시스템을 개발하기 쉽게 만들어주는 패턴
- 종류
- Adapter : 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 해줌
- Composite : 0개, 1개 혹은 그 이상의 객체를 묶어 하나의 객체로 이용할 수 있음
- Bridge : 추상화와 구현을 분리해 둘을 각자 독립적으로 변형할 수 있게 하는 패턴
- Decorator : 기존 객체의 메서드에 새로운 행동을 추가하거나 Override 가능
- Facade : 다수의 유사한 객체를 생성, 조작하는 비용을 절감할 수 있음
- Proxy : 접근 조절, 비용 절감, 복잡도 감소를 위해 접근이 힘든 객체에 대한 대역 제공
- 행위 패턴(Behavioral Pattern)
- 반복적으로 사용되는 객체들의 상호작용을 패턴화한 것
- 클래스나 객체들이 상호작용하는 방법과 책임을 분산하는 방법을 정의
- 여러가지 행위 관련 패턴을 사용하여 독립적으로 일을 처리하게 해줌
- 메세지 교환과 관련된 것 → 객체들 간의 행위나 알고리즘 등과 관련된 패턴을 말함
- 종류
- Template Method : 상위 클래스에서는 추상적으로 표현하고 그 구체적인 내용은 하위 클래스에서 결정되는 패턴
- Interpreter : 문법 규칙을 클래스화하여 언어를 해석하고 정의하는 패턴
- Iterator(반복자) : 반복이 필요한 자료구조를 모두 동일한 인터페이스를 통해 접근할 수 있도록 하여 컨테이너의 요소들에 접근함
- Observer : 어떤 클래스에 변화가 일어났을 때, 이를 감지하여 다른 클래스에 통보해줌
- Strategy(전략) : 알고리즘 군을 정의하고 각각 캡슐화하여 서로 교환하여 사용할 수 있게 해줌
- Visitor : 각 클래스의 데이터 구조로부터 처리 기능을 분리하여 별도의 클래스로 만들고 이 클래스의 메소드가 각 클래스를 다니며 특정 작업을 수행함
- Chain of Responsibility(책임 연쇄) : 책임들이 연결되어 있어 해당 부분에서 처리가 불가능하면 다음으로 넘어가는 구조
- Command : 명령어를 각각 구현하는 것이 아닌 하나의 추상 클래스에 메소드를 하나 만들고 각 명령이 들어오면 그에 맞는 서브 클래스가 선택되어 실행하는 구조
- Mediator(중재자) : 클래스간의 복잡한 상호작용을 캡슐화하여 한 클래스에 위임해서 처리하는 디자인 패턴.
- State(상태) : 동일한 동작을 객체의 상태에 따라 다르게 처리해야 할 때 사용
- Memento : undo 기능과 같은 기능을 개발할 때 사용하며, 클래스 설계 관점에서 객체의 정보를 저장할 필요가 있을 때 사용.
디자인 패턴의 장점
- 개발자(설계자) 간의 원활한 의사소통
- 소프트웨어 구조 파악 용이
- 재사용을 통한 개발 시간 단축
- 설계 변경 요청에 대한 유연한 대처
디자인 패턴의 단점
- 객체지향 설계/구현 위주
- 초기 투자 비용 부담
- 애플리케이션 개발에는 적합하지 않음
'Programming Language > JAVA' 카테고리의 다른 글
[JAVA] StringBuffer & StringBuilder 특징 (0) | 2023.10.20 |
---|---|
[JAVA] 정적 & 동적 (1) | 2023.10.20 |
[JAVA] 절차 지향 프로그래밍 (0) | 2023.10.20 |
[JAVA] 최대공약수, 최소공배수 (0) | 2023.10.20 |
[JAVA] 인스턴스 메서드 (0) | 2023.10.19 |