본문 바로가기

Programming/JAVA

객체 지향 설계 5원칙, SOLID 원칙

[ ※ 구체적 내용은 스터디 주차에 맞추어 추가할 예정 ]

 

객체 지향 언어 특성을 요리에 비유해보겠다.

 

객체 지향 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 ]

    고차원 모듈은 저차원 모듈에 의존해서는 안되며, 이 둘은 다른 추상화 된 것에 의존해야 함.
    즉, 구체적인 것은 추상화된 것에 의존해야 하며 자주 변경되는 클래스에는 의존하면 안 됨.

    개방 폐쇄 원칙과 유사하게 적용됨.
    왜? 구체적 엔티티 의존 방향을 추상화된 엔티티로 하여, 구체적 엔티티가 변경돼도 영향을 받지 않도록 설계하기 때문임.