단일 책임의 원칙 (SRP, Single Responsibility Principle)
- 모든 클래스는 각각 하나의 기능만을 가진다는 원칙
- 클래스나 모듈을 바꿔야 할 이유가 하나여야 한다는 원칙 (-클린코드)
- 책임을 적절히 분배하여 관리보수에 용이함
- 다른 클래스들이 서로 연쇄적으로 영향을 미치는 것을 방지
개방-폐쇄 원칙 (OCP, Open-Closed Principle)
- 클래스, 모듈, 함수 등이 확장에는 열려있고, 변경에는 닫혀있어야 한다는 원칙
- 쉽게 확장이 가능해야 함
- 요구사항의 변경이나 추가사항이 발생하더라도, 기존 구성요소는 변해서는 안 됨
- OCP를 가능하게 하는 중요한 매커니즘 : 추상화, 다형성
- 변할 수 있는 부분을 추상화하여, 상속하는 클래스가 의존할 수 있게 코드 작성
리스코프 치환 원칙 (LSP, Liscov Substitution Principle)
- 상위 클래스를 가리키는 포인터에 해당 클래스를 상속하는 하위 클래스를 할당하더라도 모든 기능이 정상적으로 작동해야한다는 원칙
- 하위 클래스의 상세한 내용은 상위 클래스가 알 필요가 없다는 의미
- 하위 클래스가 확장에 대한 인터페이스를 준수해야함을 뜻함 (하위 클래스는 상의 클래스의 역할을 해내야 함)
- override를 하지 않거나, 하되 기능의 추가만을 허용하면 준수할 수 있음
인터페이스 분리의 원칙 (ISP, Interface Segregation Principle)
- 자신이 사용하지 않는 인터페이스는 구현해서는 안 된다는 원칙
- 하나의 큰 인터페이스를 상속받기보다, 인터페이스를 구체적이고 작은 단위들로 분리
- 꼭 필요한 인터페이스만 상속하자는 의미
의존관계 역전의 원칙 (DIP, Dependency Inversion Principle)
- 클래스 사이에 의존관계가 존재하되, 구체적인 클래스에 의존하지 말고 최대한 추상화한 클래스에 의존해야 한다는 원칙
- 어떤 클래스를 참조할 때, 그 클래스를 직접 참조하지 말고 그 상위 요소를 참조하라는 것
- interface를 적극적으로 활용하라는 의미
- 인터페이스/추상 클래스일수록 변할 가능성이 적기 때문
문제는 우리들 대다수가 프로그램이 돌아가면 일이 끝났다고 여기는 데 있다. - 로버트 c 마틴, 클린코드
solid => 소스코드를 읽고, 확장하기에 좋은 원칙들