SOLID 원칙이란 객체지향 설계에서 지켜야할 아래의 5가지 소프트웨어 개발원칙이다.
SOLID 원칙을 적용한 소프트웨어는 코드확장, 유지
말 그대로 객체는 단 하나의 책임만 가져야 한다는 것을 뜻한다.
즉, 하나의 클래스는 하나의 기능만을 담당하여 하나의 책임을 수행해야 한다는 의미이다.
하나의 클래스에 기능이 여러개 있다면 기능에 변경사항이 발생했을 때 수정해야할 코드가 늘어난다.
단일 책임 원칙을 따랐을 경우 한 책임의 변경으로부터 다른 책임의 변경되는 것을 방지할 수 있으며, 이는 프로그램의 유지보수성을 향상 시킬수 있다는 것을 의미한다.
클래스는 확장에 열려있어야 하며 수정에는 닫혀있어야 한다는 것을 뜻한다.
개방 폐쇄 원칙을 따르면 클래스의 변경사항이 발생할 경우 유연하게 코드를 추가할 수 있어야 하며 객체를 직접적으로 수정하는 것에는 제한을 두어야한다.
즉, 추상화 사용을 통한 관계 구축을 권장하여 다형성과 확장을 가능케하는 것을 의미한다.
서브 타입은 언제나 기반 타입으로 교체할 수 있어야 한다는 것을 뜻한다.
즉, 자식 클래스는 최소한 자신의 부모 클래스에서 수행 가능한 행위는 수행이 보장되어야 한다는 것을 의미하며,
부모 클래스의 인스턴스를 사용하는 위치에 자식 클래스의 인스턴스를 대신 사용했을 때 코드가 원래 의도대로 작동해야 한다는 의미이다.
말이 좀 복잡하지만 다형성을 활용할 수 있도록 설계해야한다는 의미이다.
ex)
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
Set<Integer> set = new HashSet<>();
addOne(list);
addOne(set);
}
public static void addOne(Collection data){
data.add(1);
}
인터페이스를 각각 사요에 맞게 여러개로 분리해야한다는 것을 뜻한다.
인터페이스를 사용하는 클라이언트를 기준으로 분리하여 클라이언트의 목적과 용도에 적합한 인터페이스만을 제공하는 것을 목표로 가진다.
SRP원칙이 클래스의 단일 책임을 강조한다면 ISP는 인터페이스의 단일책임을 강조한다.
⚠️인터페이스를 한번 분리했다면 변경사항이 발생하더라도 또 인터페이스들을 분리하는 것은 지양해야 한다.
어떤 Class를 참조해야할 때 그 Class를 직접 참조하는 것이 아닌 대상의 상위요소(추상 클래스 or 인터페이스)로 참조해야 한다는 것을 뜻한다.
의존 관계를 맺을 때 수정이 쉽게 발생할 수 있는 구현 클래스에 의존하지 말고 거의 수정이 없는 인터페이스에 의존하라는 것을 의미한다.