SOLID 원칙
객체지향 프로그래밍 설계의 기본 원칙
1. SRP (Single Responsibility Principle)
단일 책임의 원칙, 객체는 단 하나의 책임만을 가져야 한다
Example)
학생 클래스의 역할
– 수강 과목을 추가하거나 조회
– 데이터베이스에 학생 정보를 저장
– 학생 정보를 성적표와 출력부에 출력하는 일
-> SRP에 따라 책임을 분리하여 클래스를 생성해야 한다.
2. OCP (Open-Closed Principle)
개방 폐쇄 원칙, 기존의 코드를 변경하지 않으면서 새로운 기능을 추가할 수 있어야 한다.
Example)
SomeClient와 성적표, 출석부가 연관 관계인 상태에서, ‘대여 명부’라는 클래스가 새로 생김
-> SomeClient는 대여 명부와도 관련이 있으므로 SomeClient 코드를 수정해야 됨
-> SomeClient와 성적표, 출석부, 대여명부의 결합도를 낮추는 Encapsulation을 진행한다.
-> (성적표, 대여 명부, 출석부)에서 공통으로 사용하는 printStudent 메소드를 Interface로 제작하고, 실체화 관계를 만든다. SomeClient는 printStudent랑 연관 관계가 되게 한다.
3. LSP (Liskov Substitution Principle)
부모 클래스의 인스턴스 대신에 자식 클래스의 인스턴스로 대체해도 프로그램의 의미는 변화되지 않는다.
Example)
인스턴스를 만들 때, 포유류대신 원숭이 클래스를 사용해도 문제가 되면 안된다.
1. 포유류는 알을 낳지 않고 새끼를 낳아 번식한다.
-> 원숭이는 알을 낳지 않고 새끼를 낳아 번식한다.
2. 포유류는 젖을 먹여서 새끼를 키우고 폐를 통해 호흡한다.
-> 원숭이는 젖을 먹여서 새끼를 키우고 폐를 통해 호흡한다.
3. 포유류는 체온이 일정한 정온 동물이며 털이나 두꺼운 피부로 덮여 있다.
-> 원숭이는 체온이 일정한 정온 동물이며 털이나 두꺼운 피부로 덮여 있다.
LSP를 만족하는 가장 단순한 방법은 재정의를 하지 않는 것이다.
-> 재정의를 하면 같은 메소드가 다른 내용을 수행하기 때문에 문제가 발생할 수 있음
LSP에 대한 코드 예시: setter의 매개변수가 부모 클래스에 대한 참조변수인데, 자식 객체가 인자로 와도 문제가 발생하지 않는다.
4. DIP (Dependency Inversion Principle)
의존 관계를 맺을 때 변화하기 어려운 것에 의존해야 한다. (OCP와 비슷함)
Example)
아이가 로봇, 모형 자동차, 레고를 가지고 논다고 하자.
아이와 로봇, 아이와 모형 자동차, 아이와 레고를 의존 관계로 만들지 말고,
아이와 장난감을 의존 관계로 만들자.
DIP를 따르려면 추상클래스나 인터페이스와 연관 관계를 지녀야 한다.
5. ISP (Interface Segregaion Principle)
인터페이스를 클라이언트에 특화되도록 분리시켜야 한다. (SRP와 비슷함)
Example)
print를 하는 프린터 인터페이스, copy를 하는 복사기 인터페이스, fax를 하는 팩스 인터페이스를 만들자.
그렇지 않고 프린터, 복사기, 팩스 클라이언트가 복합기를 상속받으면 사용하지 않는 기능도 가지게 되니 좋지 않다.