본문 바로가기
카테고리 없음

객체 지향 설계의 5가지 원칙(SOLID)

by 개미가되고싶은사람 2024. 3. 23.

좋은 객체 지향 설계의 5가지 원칙(SOLID)

 SOLID 원칙을 적용하면 코드를 확장하고 유지 보수 관리하기가 더 쉬워지며, 불필요한 복잡성을 제거해 리팩토링에 소요되는 시간을 줄임으로써 프로젝트 개발의 생산성을 높일 수 있다.

 

 

좋은 객체 지향 설계의 5가지 원칙(SOLID)

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

SRP 단일 책임 원칙

한 클래스는 하나의 책임만 가져야 한다.

SRP를 준수함으로써 무언가 변경이 있을 때 파급 효과가 적으며, 코드의 응집성(cohesion)을 높이며, 유지보수를 용이하게 만든다.

 

 

OCP 개방 폐쇄 원칙

기존의 코드를 변경하지 않으면서, 기능 확장에는 열려 있어야 하지만 수정에 대해서는 닫혀 있어야 한다

즉 확장에는 열려 있으나 변경에는 닫혀 있게 설정하는 것이다

interface Shape {
    double area();
}

class Rectangle implements Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    public double area() {
        return width * height;
    }
}

class Circle implements Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    public double area() {
        return Math.PI * radius * radius;
    }
}

추상화를 통해 변하지 않는 부분만 남김으로써 기능을 구체화하고 확장할 수 있다. 변하지 않는 부분은 고정하고 변하는 부분을 생략하여 추상화함으로써 변경이 필요한 경우에 생략된 부분을 수정하여 개방-폐쇄의 원칙을 지킨 코드라고 볼 수 있다.

 

 

 

 

LSP 리스코프 치환 원칙

프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 상위 타입 인스턴스를 하위 타입의 인스턴스로 대체할 수 있어야 한다. 다형성에서 하위 클래스는 인터페이스 규약을 다 지켜야 한다는 것, 다형성을 지원하기 위한 원칙, 코드의 재사용성과 유연성을 높이는 데 도움이 된다.

 

가장 대표적인 사례는 직사각형을 상속한 정사각형이다. 정사각형은 높이와 너비가 동일해야한다는 제약사항이 있다. 직사각형의 setHeight(); 를 활용하는 순간, 정사각형은 스스로의 제약사항으로 인해 정사각형이 아니게 된다. 직사각형의 구현체로 정사각형을 사용하면 버그가 생길 수 있는 가능성을 만들게 된다.
직사각형의 setHeight와 setWidth를 없앤다면 어떨까? 불변하게 만듦으로써 정사각형의 제약사항이 무너질 가능성이 사라졌다. getHeight()와 getWidth()는 정사각형이 직사각형을 완벽하게 대체할 수 있다. 이러면 LSP를 충족하게 된다.

 

ISP 인터페이스 분리 원칙

클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공하는 것이다. 인터페이스 분리 원칙을 준수함으로써 모든 클라이언트가 자신의 관심에 맞는 퍼블릭 인터페이스(외부에서 접근 가능한 메세지)만을 접근하여 불필요한 간섭을 최소화할 수 있으며, 기존 클라이언트에 영향을 주지 않은 채로 유연하게 객체의 기능을 확장하거나 수정할 수 있다.

 

 

DIP 의존관계 역전 원칙

구현 클래스에 의존하지 말고, 인터페이스및 추상 클래스에 의존해야 된다.

이 원칙은 유연성과 확장성을 높이고, 테스트와 유지보수를 용이하게 만든다