✅ 디자인 패턴은 클래스 라이브러리가 아니다.
- 클래스 라이브러리(특정한 기능을 묘듈화) : 부품이 되는 프로그램
- 디자인 패턴 : 부품이 어떻게 조립되어 있고, 각각의 부품이 어떻게 관련해서 큰 기능을 발휘하는지를 표현
- 즉, 어떤 종류의 클래스나 인터페이스가 서로 어떤 관계에 있는지 가 중요
✅ 클래스 라이브러리 안에서 디자인 패턴이 사용되고 있다.
- Java의 표준 클래스 라이브러리 안에는 디자인 패턴이 많이 활용
- java.util.Iterator : 여러 개를 나열해 갈 때 사용하는 인터페이스 → Iterator 패턴
- java.util.Observer : 오브젝트의 상태변화를 관찰하는 인터페이스 → Observer 패턴
- java.util.Calendar 클래스의 getInstance 메소드, java.security.SecureRandom 클래스의 getInstance 메소드, java.text.NumberFormat 클래스의 getInstance 메소드 → Facotry Method 패턴
- java.awt.Component, java.awt.Container 클래스 → Composite 패턴
✅ 프로그램을 완성품으로 보지 않는다.
- 목표 중 하나는 SW 재상용성!! 즉, 프로그램을 어떻게 "부품"으로써 재사용할 수 있는지 생각하는 것
- 어떤 기능이 확장될 가능성이 있는가?
- 확장기능을 수행할 때 수정이 필요한 클래스는 무엇인가?
- 수정이 불필요한 클래스는 무엇인가?
Single Responsibility Principle (단일 책임 원칙)
하나의 클래스는 하나의 역할만 해야 함
즉, 클래스는 그 책임을 완전히 캡슐화해야 함
Open - Close Principle (개방-폐쇄 원칙)
확장(상속)에는 열려있고, 수정에는 닫혀 있어야 함
기존의 코드를 변경하지 않으면서(Closed), 기능을 추가할 수 있도록(Open) 설계가 되어야 한다는 원칙
EX) Override
Liskov Substitution Principle (리스코프 치환 원칙)
자식이 부모의 자리에 항상 교체될 수 있어야 함.
즉 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 잘 작동해야 한다
자식클래스는 부모 클래스의 책임을 무시하거나 재정의하지 않고 확장만 수행하도록 해야 LSP를 만족한다
Interface Segregation Principle
인터페이스가 잘 분리되어서, 클래스가 꼭 필요한 인터페이스만 구현하도록 해야함
하나의 일반적인 인터페이스보다 여러개의 구체적인 인터페이스가 낫다
Dependency Inversion Principle
상위 모듈이 하위 모듈에 의존하면 안됨. 둘 다 추상화에 의존하며, 추상화는 세부 사항에 의존하면 안됨.
의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는 변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것
한마디로 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺으라는 것이다
DBConnection을 관리하는 Instance를 하나만 만들 수 있도록 제한하여, 불필요한 연결을 막음.
2개의 인터페이스가 서로 호환이 되지 않을 때, 둘을 연결해주기 위해서 새로운 클래스를 만들어서 연결시킬 수 있도록 함.
하위 클래스에서 구현해야 하는 함수 및 알고리즘들을 미리 선언하여, 상속시 이를 필수로 구현하도록 함.
GOF Design Pattern
면접을 위한 CS 전공지식 노트
Java 언어로 배우는 디자인 패턴 입문
Tech Interview for developer
SOLID 원칙
[Design Pattern] GoF(Gang of Four) 디자인 패턴