안녕하세요. 이번 포스팅에서는 디자인 패턴에 대해서 공부한 내용을 적어보려고 합니다.
Design Pattern
- 객체 지향 프로그래밍 설계 시, 자주 발생하는 문제들을 예방하기 위해 사용하는 일종의 설계 방법
- SW 재사용성, 호환성, 유지보수성을 보장
- 디자인 패턴은 구현이 아니라 설계하는 방법을 의미함.
- 개발 시에 꼭 적용해야하는 것은 아님.
- 하지만, 추후에 재사용, 호환성, 유지보수 시에 발생하는 문제를 예방하기 위해 디자인 패턴을 이용하는 것
객체지향 설계 원칙(SOLID)
- Single Responsibility Principle(단일 책임 원칙)
- 하나의 클래스는 하나의 역할만 해야 함
- Open - Close Principle(개방-폐쇄 원칙)
- 확장(상속)에는 열려있고, 수정에는 닫혀있어야 함
- Liskov Substitution Principle(리스코프 치환 원칙)
- 자식이 부모의 자리에 항상 교체될 수 있어야 함
- Interface Segregation Principle(인터페이스 분리 원칙)
- 인터페이스가 잘 분리되어서 클래스가 필요한 인터페이스만 구현하도록 해야 함
- Dependency Inversion Property(의존관계 역전 원칙)
- 상위 모듈이 하위 모듈에 의존하면 안됨
디자인 패턴의 종류 3가지
- 생성 패턴 : 객체의 생성 방식을 결정
- 싱글톤 패턴, 팩토리 패턴 등
- ex) DB Connection을 관리하는 인스턴스를 하나만 만들 수 있도록 제한하여, 불필요한 연결을 막음
- 구조 패턴 : 객체간의 관계를 조직
- 어댑터 패턴 등
- ex) 2개의 인터페이스가 서로 호환되지 않을 때, 둘을 연결해주기 위해 새로운 클래스를 만들어 연결
- 행위 패턴 : 객체의 행위를 조직, 관리, 연합
- 옵저버 패턴, 전략 패턴, 템플릿 메소드 패턴등
- ex) 하위 클래스에서 구현해야 하는 함수 및 알고리즘을 미리 선언하여, 상속 시 이를 필수로 구현하도록 함
생성 패턴
1. 싱글톤 패턴
개요
- 하나의 인스턴스만 생성하여 사용하는 디자인 패턴
- 인스턴스가 필요할 때, 같은 인스턴스를 생성하지 않고 기존에 만들었던 인스턴스를 사용하는 패턴
- 인스턴스가 절대적으로 한 개만 존재하는 것을 필요로 할 때 사용
장점
- 객체를 생성할 때마다 메모리를 할당받는데, 하나의 객체만 이용하여 메모리 낭비를 방지할 수 있음
- 싱글톤으로 구현한 인스턴스는 '전역' 이므로, 데이터를 공유하는 것이 가능
단점
- 싱글톤 인스턴스가 혼자서 너무 많은 일을 하거나, 많은 데이터를 공유시키면 다른 클래스들 간의 결합도가 높아지는데, 이 때 개방-폐쇄 원칙이 위배됨
- 결합도가 높아지면, 유지보수와 테스트가 어려워짐
주로 사용하는 경우
- DB에서의 커넥션풀, 스레드풀, 캐시, 로그 기록 객체 등
멀티스레드 환경에서 안전한 싱글톤 만드는 법
- 클래스 안에 클래스(holder)를 두어 JVM의 클래스 로더 매커니즘과 클래스가 로드되는 시점을 이용
2. 팩토리 메소드 패턴
- 객체를 만드는 부분을 하위 클래스에서 구현한 패턴
구조 패턴
1. 어댑터 패턴
- 클래스를 바로 사용할 수 없을 때, 사용할 수 있게 중간에서 변환해주는 역할
- ex) 아이폰의 이어폰 잭을 생각해보면, 일반적인 이어폰 잭은 아이폰과 맞지 않는다. → 어댑터를 이용해서 이용 가능
행위 패턴
1. 옵저버 패턴
- 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들에게 연락이 가고, 자동으로 정보가 갱신되는 1:N 관계(혹은 1대1)를 정의
- 상태를 가지고 있는 주체 객체와 상태의 변경을 알아야 하는 관찰 객체
- 서로의 정보를 주고받는 과정에서 정보의 단위가 크고 객체들의 규모가 클수록 복잡성이 증가 → 옵저버 패턴이 가이드라인을 제시
2. 전략 패턴
- 어떤 동작을 하는 로직을 정의하고, 이것들을 캡슐화하여 관리하는 패턴
3. 템플릿 메소드 패턴
- 로직을 단계 별로 나눠야 하는 상황에서 적용하며, 이 로직들이 수정될 가능성이 있으면 더욱 효율적
Reference
'etc' 카테고리의 다른 글
Connection Pool 간단 정리 (0) | 2022.04.01 |
---|---|
[메모] 로그 이벤트 뷰어 종류 (0) | 2022.03.31 |
API vs Library vs Framework (0) | 2022.03.28 |
OSI 7 Layer와 TCP/IP Model (0) | 2022.03.27 |
[개인 메모] packer (0) | 2022.03.25 |