ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 객체 지향 설계 5원칙
    Book/스프링 입문을 위한 자바 객체지향의 원리와 이해 2022. 1. 2. 23:52

    사실 클린 코드책에서도 언급되었던 내용이었지만 이 책에도 다시 나오는 만큼 중요한 개념이니 정리를 해보려고 한다.

    이미 많은 블로그나 책에서 잘 정리 되어있지만 나의 언어로 다시 정리 해본다.

     

    객체 지향이라는 개념을 어떻게 요리할 수 있지? 라는 의문이 들 수 있다. 일명 SOLID라는 5원칙은 그에 대한 해답을 준다. 

     


    1. SRP - 단일 책임 원칙

    어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다.

     

    본격적으로 설명하기 전에 작성한 코드를 보자

    public class Book {
        final static Boolean korBook = true;
        final static Boolean engBook = false;
        Boolean language;
        
        void translate(){
            if(this.language == korBook){
                //그대로 둔다
            }else{
                //번역한다.
            }
        }
    }

    Book이라는 class가 있고 translate라는 메서드로 korBook일땐 그대로 두고 engBook일땐 번역하는 것을 볼 수 있다.

    여기서 문제는 Book이라는 class의 translate()가 korBook과 engBook의 행위를 모두 구현하려고 하기 때문에 단일 책임(행위) 원칙에 위배가 되고 있다. 

     

    abstract class Book {
        abstract void translate();
    }
    
    class KorBook extends Book{
        void translate(){
            //그대로 둔다
        }
    }
    
    class EngBook extends Book{
        void translate(){
            //번역한다.
        }
    }

    이 코드는 어떤가? 하나의 클래스가 하나의 책임(행위)을/를 수행한다.

     

    => 객체지향의 추상화(모델링)과 밀접한 관련이 있다.

     

    애플리케이션의 경계를 정하고 추상화를 통해 클래스들을 선별하고 속성과 메서드를 설계할 때 단일 책임 원칙을 고려해보자.. 


    2. OCP - 개방 폐쇄 원칙

    자신의 확장에는 열려 있고, 주변의 변화에는 닫혀 있어야 한다.

     

    예를 들어 고객이 물건을 사려고하는데 알바가 물건을 팔수도 있을 것이고 사장님이 팔수도 있을 것이다. 근본적인 판다는 행위는 파는 사람이 아무리 달라져도 바뀌지 않는다. 즉 다양한 Seller가 있다는 것은 파는(인터페이스)입장에서는 확장에 개방돼 있는 것이고, 손님 입장에서는 아무리 Seller가 달라진다고 해도 물건을 정상적으로 살수 있기 때문에 닫혀 있는 것이다.

     

    대표적으로 자바의 경우 JVM이라는 것을 두어 어느 OS에서든 상관없이 실행 할 수 있는 것도 예가 될 수 있겠다.


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

    서브 타입은 언제나 자신의 기반 타입으로 교체할 수 있어야 한다.

     

    객체지향의 상속에서 

    • 하위 클래스 si a kind of 상위 클래스 - 하위 분류(클래스)는 상위 분류의 한 종류이다
    • 구현 클래스 is able to 인터페이스 - 구현 분류(클래스)는 인터페이스할 수 있어야 한다.

    이 조건을 만족한다면 LSP를 이미 만족하고 있다.

     

    예를 들어 Book이라는 상위 클래스 KorBook이라는 하위 클래스가 있다고 하자.

    Book 개발자의글쓰기 = new KorBook();

     

    Book이라는 분류에 KorBook으로써 Book의 역할을 하는데 문제가 없다. 그러나 계층도 조직도의 경우는 이 경우를 만족 시킬 수 없다.


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

    클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다.

     

    단일 책임원칙과 달리 인터페이스로 쪼개는 것을 말한다.

    1번 예제 처럼 KorBook과 EngBook()으로 클래스를 쪼개는 것이 아니라 번역이 필요하다면 EngBook의 역할을 하게 인터페이스를 제한하고 번역이 필요하지 않다면 KorBook의 역할을 하게 인터페이스를 제한하는 것을 말한다.

     

    ISP를 이야기 할 때 따라오는 원칙이 있다 인터페이스 최소주의 원칙 즉 인터페이스를 통해 메서드를 외부에 제공할 때는 최소한의 메서드만 제공하라는 것이다.


    5. DIP - 의존 역전 원칙

    자신보다 변하기 쉬운 것에 의존하지 마라

     

    자신보다 변하기 쉬운 것에 의존하던 것추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운것의 변화에 영향받지 않게 하는 것

     


     

    5대원칙이라고 하지만 사실 객체지향의 4대 특성을 고려하면 자연스럽게 나오는 개념인것을 알 수 있다. 그러니 객체지향의 4대 특성을 제대로 이해할 필요가 있다.

     

    스프링을 앞으로 배워나갈텐테 SOC라는 개념을 사용한다고 한다. SOC(관심사의 분리) 관심이 같은 것끼리는 하나의 객체 안으로 또는 친한 객체로 모으고, 관심이 다른 것은 가능한 한 따로 떨어져 서로 영향을 주지 않도록 분리하라는 것이다. 이 개념을 도입하려면 위에서 배운 5대원칙을 잘 이용해야 한다.

     

    이 5대원칙을 적용하다보면 소스 파일이 많아지지만 이게 논리적이고 이해하기 쉽고 유지보수도 쉽다.

    댓글

Designed by Tistory.