S.O.L.I.D 원칙

객체지향 설계 방법으로 코드의 품질(성능, 유지보수성 등)을 올리는 기본 원칙들. 

 

Single Responsibility Principle 단일 책임 원칙

클래스는 한가지 책임(기능)만을 담당해야 함. 

 

Open-Closed Principle 개방-폐쇠 원칙

확장에는 열려있으며 변경에는 닫혀있어야 함.

 

Liskov subsitution Principle 리스코프 치환 원칙

상위타입을 하위 타입으로 치환할 때 프로그램의 정확성을 깨뜨리지 않으면서 치환 가능해야 함.

 

Interface Segregation Principle 인터페이스 분리 원칙

특정 인터페이스 여러개가 범용 인터페이스 하나 보다 좋음.

 

Dependency Inversion Principle 의존성 역전 원칙

프로그래머는 구체적인 것 보다 추상화에 의존해야 함.


Design Pattern 종류

생성(Creational) 패턴

인스턴스를 만드는 방식은 기존 생성자 방식외에도 객체를 생성하는 방법을 추상화하는 패턴입니다.

 

Builder 패턴

Builder는 인스턴스를 생성하는 클래스를 따로 분리하는 것으로, 인스턴스를 생성할 때 파라미터가 많을 때 장점을 갖습니다.

1. Fluent API와 같이 사용해서 필요한 파라미터를 직접 주입하여 객체를 생성할 수 있습니다.

 

Factory 패턴

Factory은 Builder와 마찬가지로 인스턴스를 생성하는 클래스를 따로 분리하고, 하위 타입의 클래스를 감출때 사용합니다.

1. 특정 상황에 맞도록 하위타입을 결정해서 생성합니다. 여러 생성 메소드를 만들고 각각 상황에 맞는 메소드명을 넣을 수 있습니다.

2. 하위 클래스의 구현을 감추어 두었기 때문에 결합도가 느슨해지는 장점이 있습니다. 확장에 유연합니다.

 

Abstract Factory 패턴

Factory 패턴은 Factory 객체에서 if-else, switch등을 통해 하위 타입 클래스를 결정해 생성했습니다. Abstract Factory 패턴은 이러한 다형성을 이용해서 if-else, switch 문 등을 제거한 Factory패턴입니다. 

1. Abstract Factory는 Factory 패턴보다 더 쉽게 확장할 수 있습니다. 

 

Prototype 패턴

Prototype은 원형 객체의 복사를 통해서 새로운 인스턴스를 만들때 사용합니다. 필요한 객체를 만드는 것이 상당한 비용(네트워크 처리, 혹은 많은 연산)을 필요로 할때 장점이 있습니다.

 

Singleton 패턴

Singleton은 객체를 하나만 생성하여 사용할 때 사용합니다. 여러 객체에서 하나의 인스턴스의 상태를 공유할 때 장점을 갖습니다.

주의 - 여러 객체에서 하나의 인스턴스의 상태를 공유하므로 멀티쓰레드 환경에서 race condition이 발생할 확률이 높고 디버깅 어려움, 버그 발생률이 높습니다. 

1. 객체가 하나만을 보증하므로 메모리적으로 이점이 있습니다.

2. 어디서든 특정 상태를 가진 인스턴스에 접근하기 용이합니다. 

 

구조(Structural) 패턴

구조 패턴이란 클래스들을 상속과 합성을 이용하여 더 큰 클래스를 생성하는 방법을 제공하는 패턴입니다.

 

Adapter 패턴

Adapter는 서로 다른 라이브러리의 인터페이스를 연결할 때 사용합니다. 

1. 호환성이 없는 인터페이스 때문에 함께 동작할 수 없는 클래스들이 함께 작동하도록 할 수 있습니다.

2. 서드파티 라이브러리의 객체를 기존의 인터페이스를 통해 활용할 수 있습니다.

 

Bridge 패턴

Bridge는 구현부에 추상층을 분리하여 각각 독립적으로 구현할 때 사용합니다.

 

Composite 패턴

객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현할 때 사용합니다.

1. 부분과 전체마다 각각 사용할 수 있는 메소드가 다를 수 있다는 점을 주의해야 합니다. 

 

Decorator 패턴

Decorator는 주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때 서브클래스 대신 사용할 수 있습니다.

1. 상속의 문제를 피할 때 용이합니다.

 

Facade 패턴

Facade는 서브시스템에 있는 인터페이스 집합에 통합된 하나의 인터페이스를 제공합니다. 서브시스템을 좀 더 쉽게 사용하기 위해 고수준의 인터페이스를 정의합니다. 서브 시스텤템의 사용법이 복잡할 때 용이합니다.

1. 사용자는 서브시스템을 알 필요없이 Facade만을 이용해서 사용하면 됩니다.

 

Flyweight 패턴

Flyweight는 재활용 가능하며 수 많은 객체를 메모리에 저장하고 공유(Sharing)를 통하여 재활용할 때 사용합니다.

1. 메모리적 이점이 있습니다.

2. 해쉬 혹은 트리 자료구조를 활용하여 특정 객체를 찾아내야 하므로 성능에 어느정도 희생이 있습니다.

 

Proxy 패턴

Proxy는 특정 리소스에 대한 인터페이스로 작동하는 클래스입니다. 해당 리소스는 원격이거나, 구성 비용이 많이 들거나, 로깅 또는 기타 추가 기능이 필요할 때 사용합니다.

1. Spring에서는 AOP기능을 위해서 프록시를 사용합니다.

 

행위(Behavioral) 패턴

객체나 클래스 사이의 알고리즘이나 책임 분배에 관련된 패턴입니다. 한 객체가 혼자 수행할 수 없는 작업을 여러개의 객체로 어떻게 분배하는지, 또 그렇게 하면서도 객체 사이의 결합도를 최소화하는것에 중점을 두는 방식입니다.

 

Chain of Responsibility 패턴

 

 

Command 패턴

 

Interpreter 패턴

 

Iterator 패턴

 

Mediator 패턴

 

Memento 패턴

 

Null Object 패턴

 

Observer 패턴

 

State 패턴

 

Strategy 패턴

 

Template Method 패턴

 

Visitor 패턴