OOP

[OOP] 객체 지향 설계 5원칙(SOLID) : OCP(Open Closed Principle)-개방, 폐쇄 원칙

2h1824 2025. 1. 8. 23:08

OCP(Open Closed Principle)

객체의 확장에는 개방적이고 객체의 수정에는 폐쇄적이어야 한다는 원칙

기능의 변화, 확장 OK. But, 해당하는 객체만 수정 O, 해당 객체에 의존하는 객체들까지 수정 X

ㅡ> 각 객체의 모듈화, 정보 은닉의 올바른 구현 추구 ㅡ> 객체 간의 의존성 최소화 ㅡ>  코드 변경에 따른 영향력 축소

ㅡ> 결론적으로 코드 유지보수의 효율성 향상

코드 예제

OCP가 적용되지 않은 코드

class PolygonManager {
public:
    void drawPolygon(int shapeType) {
        if (shapeType == 1) {
            // 삼각형 그리기
        } else if (shapeType == 2) {
            // 사각형 그리기
        }
    }
};

코드를 살펴보면 원 그리기와 사각형 그리기가 한 객체 안에 구현되어 있어 기능 수정 및 확장을 위해서는 drawShape() 함수를 수정해야만 합니다. ㅡ> ShapeManager 클래스가 계속해서 영향을 받음

OCP가 적용된 코드

class Polygon {
public:
    virtual void draw() = 0; // 순수 가상 함수
};

class Triangle : public Polygon {
public:
    void draw() {
        // 삼각형 그리기
    }
};

class Square : public Polygon {
public:
    void draw() {
        // 사각형 그리기
    }
};

class PolygonManager {
public:
    void drawPolygon(Polygon& polygon) {
        polygon.draw(); // 다형성 활용
    }
};

OCP가 적용된 코드를 살펴보면 각 도형들의 클래스를 만들고 해당 도형들이 Polygon 클래스를 상속하도록 하여서 다형성을 이용하기 위해 override로 draw()함수를 자식 클래스들마다 구현하여 Polygon 클래스를 관리하는 PolygonManager 객체에서 drawPolygon()이란 함수가 호출되었을 때, 각 도형에 알맞는 draw()함수가 호출되도록 하였습니다. 

ㅡ> 각 도형들마다 수정 사항이 있을 때, 해당하는 도형만을 수정하면 되고 우리가 사용하는 인터페이스에 해당하는 부분은 건드릴 필요가 없습니다. 또한 다른 도형들이 추가된다 하더라도 Polygon 클래스를 직접 수정할 필요 없이 Polygon을 상속 받는 새로운 자식 클래스로 구현하면 됩니다.

정리

아무 원칙 없이 마구잡이로 개발을 하다 보면 여기저기 객체들끼리 연결시키면서 기능을 구현하려다 보니 어떤 기능에 수정사항이 생겼을 때 해당 객체와 연관된 모든 코드들을 찾아 수정해야만 하는 경우가 생겼다. OCP를 준수하여 사용자의 인터페이스에 해당하는 부분과 실질적인 기능을 하는 부분을 나누어 구현하였다면 객체간의 의존성을 낮춤으로써 수정 사항이 생겼을 때도 이전과는 다르게 해당하는 객체만 수정하면 되고, 기능을 확장할 때도 다형성을 이용하여 인터페이스에 알맞은 새로운 객체를 생성함으로써 간단히 대응할 수 있게 된다. 

ㅡ> 코드 유지보수의 효율성 향상

* 확장에는 Open! 수정에는 Closed!


참고자료

https://blog.itcode.dev/posts/2021/08/14/open-closed-principle

 

[OOP] 객체지향 5원칙(SOLID) - 개방-폐쇄 원칙 OCP (Open-Closed Principle) - 𝝅번째 알파카의 개발 낙서장

개방 폐쇄 원칙이란 객체를 다룸에 있어서 객체의 확장은 개방적으로, 객체의 수정은 폐쇄적으로 대하는 원칙이다. 한 마디로, 보여줄 건 보여주고, 숨길 건 숨긴다는 의미. 좀 더 쉽게 말하자면

blog.itcode.dev