SOLID 원칙(객체지향 5대 원칙)
1) SRP(단일 책임 원칙)
•
클래스나 함수는 단 하나의 책임만을 가져야한다.
•
클래스,함수가 비대해지면 이를 분리시킬 필요가 있다,
◦
하나의 책임이 여러 개의 클래스로 분산되어있는 경우, 요구 사항이 변경될 시, 분산된 책임을 가지고 있는 모든 부분을 살펴야 한다.
2) OCP(Open-Closed Principle, 개방-폐쇄 원칙)
•
기존 코드는 변경에는 닫혀있고, 추가나 확장에는 열려있어야한다.
•
자주 변경될 수 있는 내용은 수정하기 쉽게 설계해야하고, 자주 변경되지 않을 내용은 수정에 영향받지 않게 설계해야한다.
3) LSP(Liskov Substitution Principle, 리스코프 치환 원칙)
•
자식 클래스는 부모 클래스에서 가능한 행위를 수행할 수 있어야한다.
•
파생 클래스를 만들 때, 이게 정말 올바른 상속의 관계를 갖는지 생각해봐야한다.
4) DIP(Dependency Inversion Principle, 의존 역전 원칙)
•
의존 관계를 맺을 때, 변화하기 쉬운 것보단 변화하기 어려운 것에 의존해야한다.
•
변화하기 쉬운 것 = 구체적인 것(클래스, 서브 클래스 인스턴스)
•
변화하기 어려운 것 = 추상적인 것(추상 클래스, 인터페이스)
•
의존성 주입 기술 등
5) ISP(Interface Segregation Principle, 인터페이스 분리 원칙)
디자인 패턴의 종류
생성 패턴
구조 패턴
행동 패턴
합성 관계 ⇒ A객체 안에 B객체가 있는데 A가 사라지면 B도 함께 사라지는 구조
집합 관계 ⇒ A객체와 B객체가 따로따로 있는데, A에서 단지 B의 참조만을 들고 있는 경우
싱글톤(Singleton)
•
단 하나의 인스턴스를 생성해 사용하는 디자인 패턴
장점
단점
활용 상황
팩토리 메쏘드
•
인터페이스로 객체들을 정의하고, 팩토리가 인스턴스를 생성하는 패턴
장점
단점
빌더(Effective Java 기준)
•
빌더 패턴은 생성인자가 많을 시, 빌더 객체를 통해 구체적인 객체를 생성한다.
장점
단점
추상 팩토리 메쏘드
•
추상 팩토리 메소드 기존 팩토리 메쏘드 방식에서 팩토리의 상위 팩토리를 통해 구체적인 팩토리를 생성한다,
장점
단점
활용 상황
•
팩토리 메쏘드를 쓰던 상황에서, 팩토리의 종류를 늘려야할 때
어댑터
•
서로 다른 인터페이스를 가진 두 클래스를 어댑터 클래스로 인터페이스를 통일시켜 사용하는 방법
장점
단점
컴퍼지트
•
단일 객체와 그 객체들을 가지는 집합 객체를 같은 타입으로 취급하며, 트리 구조로 객체들을 엮는 패턴
장점
단점
활용 상황
•
Component
◦
Leaf와 Composite가 구현해야하는 Interface로 Leaf와 Composite는 모두 Component라는 타입으로 다뤄진다.
•
Leaf
◦
단일 객체로 Composite의 부분 객체로 들어가게 된다. 이 때 Component의 형태로 들어간다.
•
Composite
◦
집합 객체로 Leaf 객체나 Composite를 부분으로 둔다. 이 때, Component의 형태로 들어간다.
◦
클라이언트는 이 Composite를 통해 부분 객체들(Leaf나 Composite)를 다룰 수 있다.
데코레이터
•
기본 객체에 추가적인 기능을 동적으로 유연하게 첨가하는 패턴
장점
단점
활용 상황
•
Component
◦
ConcreteComponent와 Decorator가 구현할 인터페이스. 두 객체를 동등하게 다루기 위해 존재
•
ConcreteComponent
◦
Decorate를 받을 객체
◦
기능 추가를 받을 기본 객체
•
Decorator
◦
Decorate를 할 객체의 추상 클래스
◦
즉, 기능 추가를 할 객체는 이 객체를 상속받는다.
•
ConcreteDecorator
◦
Decorator를 상속받아 구현할 다양한 기능 객체이다.
◦
이 기능들은 ConcreteComponent에 추가되기 위해 만들어진다.
구조 패턴, 프록시
•
프록시 객체를 통해 기본 객체에 접근하는 패턴이다.
장점
단점
활용 상황
•
Subject
◦
Proxy와 ReqlSubject가 구현해야하는 인터페이스
◦
두 객체를 동일하게 다루기 위해 존재
•
Proxy
◦
RealSubject와 Client 요청 사이에 존재하는 객체
◦
Subject를 구현함으로써 클라이언트는 RealSubject 사용하는 것과 별 차이가 없어야한다.
•
RealSubjec
◦
실질적으로 요청에 대해 주된 기능을 수행하는 객체
◦
Proxy객체는 내부적으로 이 객체를 로직에 맞게 사용한다.
스트레티지
•
행동,전략 등 동일계열의 알고리즘들을 인터페이스-캡슐화하고, 알고리즘들을 컴포지션(위임 형태로) 가지는 패턴이다.
장점
단점
활용 상황
탬플릿메쏘드
•
상위 클래스가 뼈대가 되는 로직을 구성하고, 하위 클래스들이 이 로직 요소들을 각각 구현하는 패턴
장점
단점
활용 상황