Programming/JAVA
객체 지향 설계 5원칙, SOLID 원칙
sky Jeong
2021. 3. 23. 18:24
[ ※ 구체적 내용은 스터디 주차에 맞추어 추가할 예정 ]
객체 지향 언어 특성을 요리에 비유해보겠다.
객체 지향 4대 특성인 [ 상속, 캡슐화, 추상화, 다형성 ]이 요리도구라면, 객체 지향 설계 5원칙은 [ 요리 도구 사용법 ]이며, 디자인 패턴은
[ 레시피 ] 이다. 정리하자면 자바의 4가지 특성을 사용한 SOLID 원칙에 기반해 설계된 것이 디자인 패턴이라고 보면 된다.
SOLID 원칙
- 단일 책임 원칙 [ SRP: Single Responsibility Principle ]
클래스 변경 이유는 오직 하나라는 것.
즉, 하나의 클래스는 하나의 책임 [ = 목적 ]만 가지며, 책임[ = 역할 ]을 분리한다는 것임. - 개방 폐쇄 원칙 [ OCP: Open Closed Principle ]
엔티티의 확장은 열려있으나, 변경에는 폐쇄된 것을 이야기함.
대표적 예시는 JDBC로 DB를 변경하여도 JDBC 인터페이스 덕분에 영향을 받지 않음 - 리스코프 치환 원칙 [ LSP: Liskov Substitution Principle ]
하위 클래스의 인스턴스는 상위형 객체 참조 변수에 대입하여 상위 클래스 인스턴스 역할에 문제가 없어야 함을 이야기 함.
쉽게 이야기하자면, 상속의 조건을 잘 키기고 있다면 LSP를 잘 지킨다고 볼 수 있음.
LSP는 가족 구성원을 나타내는 조직도/계층도 보다 분류도에서 완벽하게 지원하는 경우가 많음 - 인터페이스 분리 원칙 [ LSP: Interface Segregation Principle ]
클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안 됨
이상적 설계는 상위 클래스는 풍부할수록, 인터페이스는 작을수록 좋음
(1) 풍성한 상위 클래스는 불필요한 형변환을 줄여 생산성이 높아짐
(2) 인터페이스가 그 역할을 충실한 최소한의 기능만 공개해 일관성을 유지할 수 있음
만약 '사람' 타입으로 '학생' 인스턴스를 생성한다면, [ 생일 ] 변수에 접근하기 위해서는 명시적 형변환이 필요함
하지만 오른쪽과 같이 상위 클래스에 공통된 속성을 모아둔다면, 형변환을 최소화하여 접근할 수 있음
- 의존 역전 원칙 [ DIP: Dependency Injection Principle ]
고차원 모듈은 저차원 모듈에 의존해서는 안되며, 이 둘은 다른 추상화 된 것에 의존해야 함.
즉, 구체적인 것은 추상화된 것에 의존해야 하며 자주 변경되는 클래스에는 의존하면 안 됨.
개방 폐쇄 원칙과 유사하게 적용됨.
왜? 구체적 엔티티 의존 방향을 추상화된 엔티티로 하여, 구체적 엔티티가 변경돼도 영향을 받지 않도록 설계하기 때문임.