ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] 객체 지향 설계 5대 원칙 SOLID
    Java/Spring boot 2022. 2. 22. 17:58
    728x90

    객체 지향 설계 5대 원칙 SOLID

     

    1. SRP 단일 책임 원칙 (Single Responsibility Principle)
    • 하나의 클래스는 하나의 책임만 가져야 함.
    • 응집도는 높고, 결합도는 낮게 설계하라는 원칙.
    • 변경이 있을 때, 파급효과가 적으면 원칙을 잘 따른 것.

    예시 코드

    class B{
    
      main(){
        A a = new A();
        a.getName();
      }
    }
    
    class C{
      main(){
        A a = new A();
        a.getId();
      }
    
    }

    위 코드에서 볼 수 있듯이, A 클래스는 B와 C에서 사용되지만 , B 클래스에선 getName() 메소드를 호출하고, C 클래스에선 getId() 메소드를 호출하는 것을 볼 수 있다. 이 경우에 A 클래스는 B 클래스나 C 클래스에서 추가/변경되는 기능 때문에 수정될 수 있으므로, A 클래스를 나눠 한 가지 역할만을 수행하게 해야한다는 것이 단일 책임 원칙이다.

     

    2. OCP 개방-폐쇄 원칙 (Open/Closed Principle)
    • 소프트웨어의 구성 요소(컴포넌트 , 모듈 , 함수 등)는 확장에는 열려있고, 변경에는 닫혀있어야 함.
    • 다형성을 잘 활용하여 인터페이스를 구현한 새로운 클래스를 만들어 새로운 기능을 만들어야 함.

    예시 코드

    ArrayList list = new ArrayList();
    
    list.add(1);
    
    list.add(2);
    
    
    
    LinkedList list =  new LinkedList();
    
    list.new(1);
    
    list.new(2);

    위에 코드에서 볼 수 있듯이, ArrayList와 LinkedList가 서로 값을 추가하는 방식이 다르면, 해당 List를 교체할 시에 해당 클래스 내부에 고쳐야 할 코드가 늘어난다. 이 때, List 인터페이스를 제공하고 ArrayList와 LinkedList가 List를 구현함으로써 동일한 메소드를 제공하기 때문에, List를 교체할 일이 생기더라도 객체 생성부분만 고쳐주면 된다. 이처럼 사용하는 클래스는 변화에 Closed , 사용되는 클래스는 확장에 Open이 OCP.

     

    3. LSP 리스코프 치환 원칙 (Liskov Substitution Principle)
    • 다형성에서 하위 클래스는 인터페이스 규약을 모두 지켜야 함.
    • 단순히 인터페이스를 하위 클래스에서 구현하여 컴파일 에러를 피하라는 것이 아닌, 부모의 동작 규약을 지키라는 것을 의미.

    예시 코드

    class ArrayList implements List{
    
      @Override
      public void addItem(){}
      public void addList(){}
    }
    
    List list = new ArrayList();

    하위 클래스는 언제나 상위 클래스로 참조가 가능한데, 상속이 되면 될수록 하위 클래스의 메소드들은 늘어가고, 이 때 상위 클래스에서 하위 클래스를 참조하는 데 있어 많은 불편함이 따르게 된다.

    위에 코드에서 볼 수 있듯이, List에서 제공하는 추상메소드를 오버라이딩 하게 되고, 그에 더하여 신규 메소드들을 추가 하게 된다면 상위 클래스인 List로 참조하게 될 시에 신규 메소드를 사용하게 됨에 제약을 받게 된다. 이 경우가 LSP를 위반한 경우이다. 그러므로 신중하게 설계하여 언제든 상위 클래스가 하위 객체를 참조할 수 있도록 만드는 것이 바람직하다.

     

    4. ISP 인터페이스 분리 원칙 (Interface Segregation Principle)
    • 범용 인터페이스 하나보다는 대체 가능성을 생각하여 필수 기능이 잘 구현된 인터페이스 여러 개를 설계해야 함.
    • 인터페이스가 명확해지고 대체 가능성이 높아짐.

    SRP와 비슷하지만, SRP가 다중 역할을 하는 클래스의 분리를 얘기한다면 , ISP는 인터페이스의 분리를 의미함.

     

    5. DIP 의존관계 역전 원칙 (Dependency Inversion Principle)
    • 구현 클래스에 의존하지 말고, 인터페이스에 의존해야 함.
    • 변화하기 쉬운 구현 객체에 의존하게 되면 차후 변경 및 유지보수가 힘들어짐.

     

    728x90

    'Java > Spring boot' 카테고리의 다른 글

    [Spring Boot] Spring boot + GPT 3.5를 활용한 CS 챗봇 앱  (0) 2023.06.15
    [Spring] Restful API란 ?  (0) 2022.02.22
Designed by Tistory.