이전 글에서 객체 지향 프로그래밍은 많은 장점을 가지지만,
설계 시 아주 많은 시간과 노력이 필요하다고 했다.
디자인 패턴에 대해 본격적으로 알아가기 전에 SOLID
라는
객체지향 개발 5대 원칙을 알아보자
미래에 있을 유지보수, 수정, 확장..이 용이한 소프트웨어를 만드는데 사용대는 5대 원칙!
-> 객체 지향적인 소프트웨어를 위한 원칙!
SOLID는 5대 원칙의 앞글자를 딴 것이다. 순서대로 알아보자
Single Responsibility Principle
모든 클래스는 하나의 책임만을 가지며,
그 책임을 완전히 캡슐화해야 한다.
클래스가 하나의 책임만 가진다는 것은,
클래스를 변경해야하는 이유는 오직 하나뿐이어야 한다는 말이다.
이 원칙을 지킨다면
불필요한 상속 및 구현이 줄어서
가독성, 유지보수, 재사용성 측면에서 좋다.
Open-Closed Principle
확장에는 열려 있어야 하고, 변경에는 닫혀 있어야 한다.
즉 기존의 코드를 변경하지 않고 기능을 수정, 확장 가능하도록 한다.
OCP를 위반하게 되면 새로운 기능을 추가하는 것이 어렵고,
기존 코드에 영향을 많이 주기 때문에 변경의 유연함과 관련 있는 원칙이다.
Liskov Substitution Principle
상위 타입의 객체를 하위 타입의 객체로 치환해도 동작에 문제가 없어야 한다.
상속 관계에 대한 원칙인데,
보통 상속 관계가 되면 안되는 것을 상속으로 구현했을 때 위배된다.
대표적인 예시가 직사각형과 정사각형!
자식 객체는 부모 객체로 완전히 치환할 수 있어야 된다는게 포인트 !!
그리고 LSP는 OCP를 따르는 설계를 만들어준다.
이에 대해서는 나중에 다시 정리할 예정
Interface Segregation Principle
클라이언트는 자신이 사용하지 않는 메소드에 의존하면 안된다.
쉽게 말하면,
인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 된다는 것
더 쉽게 말하면,
인터페이스를 구현할 때 인터페이스에 정의되어 있는 메소드를
모두 구현해야하는데,
이 때 불피요한 메소드가 있으면 안된다는 것이다.
딱 쓰는 것들만 모아서 딱딱 분리를 해야함
고수준 모듈은 저수준 모듈에 의존해서는 안되고 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.
예를 들어 설명해보면,
자동차는 타이어에 의존하고
타어이는 윈터 타이어, 썸머 타이어... 이런식으로 구체화되는게 일반적이다.
근데 만약 자동차(고수준 모듈)가 윈터 타이어(저수준 모듈, 구체적인것)에 의존하고 있다면 어떨까?
썸머 타이어나 또 다른 타이어가 추가(확장)될 때마다
자동차가 영향을 받을 것이다.
그래서 자동차는 타이어에 의존하고, 구체적인 타이어들이 타이어에 의존하게 만들면
새로운 종류의 타이어를 추가하더라도 자동차는 영향을 받지 않는다.
DIP또한 LSP와 비슷하게 OCP를 따르도록 하는 기반이다.