본문 바로가기

Java

[Java] 객체지향 5원칙 SOLID

📌 객체지향 설계 5원칙 SOLID

  • 객체지향을 설계할 때는 5가지 원칙이 존재한다. 이 원칙은 시간이 지나도 유지 보수와 확장이 쉬운 소프트웨어를 만드는데 이 원칙들을 적용할 수 있다.
1. SPR (단일 책임 원칙)
2. OCP (개방-폐쇄 원칙)
3. LSP (리스코프 치환 원칙)
4. DIP (의존 역전 원칙)
5. ISP (인터페이스 분리 원칙)
  • 응집도와 결합도
    • 좋은 소프트웨어 설계를 위해서는 결합도 (coupling)는 낮추고 응집도 (cohesion)는 높여야 한다.
    1. 결합도란?
      • 모듈 (클래스) 간의 상호 의존 정도를 나타내는 지표로써 결합도가 낮으면 모듈 간의 상호 의존성이 줄어들어서 객체의 재사용 및 유지보수가 유리하다.
    2. 응집도란?
      • 하나의 모듈 내부에 존재하는 구성 요소들의 기능적 관련성으로 응집도가 높은 모듈은 하나의 책임에 집중하고 독립성이 높아져, 재사용 및 유지보수가 용이하다.
  1. SPR (Single Responsibility Principle) 단일 책임 원칙
    • 어떠한 클래스를 변경해야 하는 이유는 한 가지뿐 이어야 한다.
    • 소프트웨어의 설계 부품 (클래스, 메소드 등) 은 단 하나의 책임만을 가져야 한다.
    • SPR을 지켜야 하는 이유는 응집도와 결합도 관점에서 접근하면 된다.
  2. OCP (Open Closed Principle) 개방 폐쇄 원칙
    • 기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계해야 한다.
    • 자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
    • 상위 클래스 또는 인터페이스를 중간에 둠으로써, 자신은 변화에 대해서는 폐쇄적이지만, 인터페이스는 외부의 변화에 대해서 확장을 개방해 줄 수 있다.
    • 이러한 부분은 JDBC와 Mybatis, Hibernate 등 Java에서는 Stream(Input, Out)에서 찾아볼 수 있다.
  3. LSP (Liskov Subsitution Principle) 리스 코프 치환 원칙
    • 자식 클래스는 부모 클래스에게 가능한 행위를 수행할 수 있어야 한다.
    • 서브 타입은 언제나 자신의 기반 (상위) 타입으로 교체할 수 있어야 한다.
    • 이 원칙은 리스 코프 교수가 제안한 설계 원칙으로 부모 클래스와 자식 클래스 사이의 행위에는 일관성이 있어야 한다는 원칙이다. 객체 지향 프로그래밍에서 부모 클래스의 인스턴스 대신 자식 클래스의 인스턴스를 사용해도 문제가 없다.
  4. ISP (Interface Segregation Principle) 인터페이스 분리 원칙
    • 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다. 하나의 일반적인 인터페이스보다는, 여러 개의 구체적인 인터페이스가 낫다.
    • 클라이언트는 자신이 사용하지 않는 메소드에 의존 관계를 맺으면 안 된다.
    • 프로젝트 요구 사항과 설계에 따라서 SRP / ISP를 선택한다.
    • 이 원칙은 결국 자신이 사용하지 않는 기능에는 영향을 받지 말아야 한다는 의미이다. 이 원칙은 인터페이스를 클라이언트에 특화되도록 분리시키는 설계 원칙이라고 할 수 있다.
  5. DIP (Dependency Inversion Priniple) 의존 역전 원칙
    • 의존 관계를 맺을 때, 변화하기 쉬운 것보단 변화하기 어려운 것에 의존해야 한다는 원칙이다.
    • 자신보다 변하기 쉬운 것에 의존하지 말아야 한다.
    • 변화하기 쉬운 것이란 구체적인 것을 뜻하고, 변화하기 어려운 것이란 추상적인 것을 의미한다. 객체 지향적인 관점에서 볼 때, 변화하기 쉬운 것은 구체화된 클래스를 의미하고, 변화하기 어려운 것은 추상 클래스나 인터페이스를 의미한다. 즉, DIP를 만족한다는 것은 의존 관계를 맺을 때, 구체적인 클래스보다 인터페이스나 추상 클래스와 관계를 맺는 것을 의미한다.