ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 객체지향 설계원칙, SOLID 알아보기
    Language/Java 2024. 1. 11. 17:26

    1. 개요

     SOLID 원칙은 로버트 C. 마틴이 발표한 5가지 객체지향 설계원칙의 약자다. 각 글자는 다음과 같은 원칙을 의미한다.

    • SRP(Single Responsibility Principle): 단일 책임 원칙
    • OCP(Open-Closed Principle): 개방 폐쇄 원칙
    • LSP(Liskov Substitution Principle): 리스코프 치환 원칙
    • ISP(Interface Segregation Principle): 인터페이스 분리 원칙
    • DIP(Dependency Inversion Principle): 의존 역전 원칙

    이 원칙들의 목표는 응집도는 높이고 결합도를 낮추자는 고전 원칙을 객체지향 관점에서 재정의 한 것이다.

     

    2. 응집도와 결합도

    응집도를 높이고 결합도를 낮추면 유연하고 유지보수하기 용이한 코드를 작성할 수 있다. 그렇다면 응집도와 결합도가 무엇인지 알아보자.

    2.1. 응집도

     응집도가 높으면 변경 대상과 범위가 명확해지는 장점이 있어 코드를 수정하기 쉬워진다.

     

    예를 들어 응집도가 낮은 쇼핑몰 프로그램이 있다고 가정해보자. 결제 책임을 갖는 코드가 여러 모듈에 분산되어있을 경우, 결제 기능을 수정할 때 결제 책임을 갖는 코드의 위치를 파악하기 위해 많은 에너지를 쏟아야 할 것이다. 반대로 하나의 모듈에 모여 결제 기능이 모여있고, 결제 코드끼리 서로 잘 협력하고 있다면 수정해야 할 범위를 쉽게 파악할 수 있을 것이다.

    2.2. 결합도

    결합도는 다른 모듈과의 의존성 정도이다. 많은 모듈을 의존하고 있거나, 변경이 자주 일어나는 모듈을 의존할 경우 강하게 결합되어 있다고 한다. 결합도가 낮을수록 변경이 발생했을 때, 변경이 전파되는 소스의 수가 적어서 코드를 수정하기 쉬워진다.

     

    결합도가 높다면 하나의 기능이 변경될 경우, 해당 기능을 의존하고 있는 다른 모듈들도 수정이 필요하게 될 것이다. 하지만 최소한의 모듈을 참조하거나, 잘 변경되지 않는 모듈을 의존하여 모듈간 느슨하게 연결할 경우, 기능을 수정하고 유지보수하기 쉬울 것이다.

    3. SRP - 단일 책임 원칙

    단일 책임 원칙은 하나의 메소드, 클래스, 모듈은 하나의 책임만을 가져야 한다는 원칙이다. 하나의 클래스가 여러 개의 책임을 갖게 됐을 때 가독성이 떨어지고, 유지보수하기 어려운 코드가 된다.

    4. OCP - 개방 폐쇄 원칙

    개방 폐쇄 원칙은 '클래스, 모듈, 메소드 등은 확장에는 열려있지만 변경에는 닫혀 있어야 한다'는 원칙이다. 쉽게 말해 다른 오브젝트를 의존할 때, 직접 의존하는 것이 아닌 중간에 추상 계층을 둬, 유연한 코드를 작성하라는 원칙이다.

    5. LSP - 리스코프 치환 원칙

    리스코프 치환 원칙은 서브 클래스가 부모 클래스의 역할을 수행할 수 있어야 한다는 원칙이다.

    만약 "서브 클래스 is kind of 슈퍼 클래스" 또는 "구현 클래스 is able to 인터페이스" 문장을 잘 지키고 있다면 리스코프 치환 원칙을 잘 지키고 있는 것이다.

    6. ISP - 인터페이스 분리 원칙

    인터페이스 분리 원칙은 인터페이스를 최소한의 크기로 유지하여, 인터페이스를 구현할 클래스가 사용하지 않을 불필요한 메소드를 구현하지 않게 하라는 원칙이다. 단일 책임 원칙이 클래스의 단일 책임에 집중한다면, 인터페이스 분리 원칙은 인터페이스의 단일 책임에 집중하는 것이다.

     

    인터페이스는 다중 상속을 지원하기 때문에, 최소한의 크기로 설계하여도 필요에 따라 조합하여 사용할 수 있다.

    7. DIP - 의존 역전 원칙

    의존 역전 원칙은 구체가 아닌 추상에 의존하라는 원칙이다. 어떤 객체가 다른 객체에 직접적으로 의존하는 것이 아닌, 구체를 추상화한 계층을 의존해야 한다는 의미이다.

     

    그렇다면 왜 구체가 아닌 추상에 의존해야 할까? 구체가 추상보다 변경이 잦기 때문이다. 변경이 잦은 구체에 의존하게 되면 클라이언트 객체도 함께 변경되어야 한다. 하지만 변경이 잘 일어나지 않는 추상에 의존할 경우, 구체가 변경되더라도 클라이언트 객체는 변경되지 않는다.

     

    이렇듯 역전 원칙을 지키면 개방에는 열려있고 변경에는 닫혀 있어야 한다는 개방 폐쇄 원칙을 자연스럽게 지킬 수 있게 된다.

    8. 참조

     

     

     

Designed by Tistory.