이끌든지 따르든지 비키든지

Software Development/Design Pattern

[Design Pattern] OCP(개방 폐쇄 원칙)

SeongHo5 2023. 11. 12. 20:30

객체지향적인 프로그램을 설계할 때 가장 중요하고, 반드시 지켜야 할 5가지 원칙이 있다.
각 원칙의 앞글자를 따 SOLID 원칙이라 하는데, 오늘은 두 번째인 개방 폐쇄 원칙(Open-Closed Principle)에 대해 알아본다.

 


개방 폐쇄 원칙(Open-Closed Principle)

 

객체는 확장에 대해서는 개방적이고, 수정에 대해서는 폐쇄적이어야 한다는 원칙을 말한다.

 

 

확장에 개방적이다.

여기서 확장이란, 새로운 기능이나 동작의 추가를 말한다.

확장에 개방적이어야한다는 말은 새로운 기능을 추가하거나 기존의 기능을 확장할 때 기존 코드를 수정하지 않고 새로운 코드를 추가할 수 있어야 함을 의미한다.

 

수정에 폐쇄적이다.

기존의 코드는 수정을 피해야 한다.

기존 코드를 수정하면서 새로운 기능을 추가하거나 버그를 수정하면 기존 코드의 안정성이 훼손될 수 있다.

 

정리하자면,  OCP 원칙은 객체 지향 프로그래밍에서 추상화와 다형성을 통해 코드를 유연하게 확장 가능하도록 하는 원칙이다.

 

이 원칙을 적용해 새로운 요구사항에 대응하거나 기능을 확장할 때 기존 코드의 안정성을 유지하면서도 유연하게 대처할 수 있다.

 

코드를 변경하지 않고도 새로운 클래스를 추가하거나 기존 클래스를 확장하여 새로운 동작을 구현할 수 있게 되어, 유지보수성이 향상되고 시스템을 더 쉽게 확장할 수 있게 된다.

 


 

개방-폐쇄 원칙의 구현?

 

일반적인 방법에는 인터페이스를 통한 추상화, Factory, Strategy 패턴 등 디자인 패턴을 활용하는 방법이 있다.

 

 

1. 인터페이스 활용하기

 

// 인터페이스를 통한 추상화
interface Animal {
    void makeSound();
}

// 인터페이스를 구현한 클래스들
class Dog implements Animal {
    @Override
    public void makeSound() {
        System.out.println("멍멍");
    }
}

class Cat implements Animal {
    @Override
    public void makeSound() {
        System.out.println("야옹");
    }
}

class Bird implements Animal {
    @Override
    public void makeSound() {
        System.out.println("짹짹");
    }
}

 

 

새로 Tiger라는 기능을 추가할 경우에도, 아래와 같이 인터페이스를 구현하면 된다.

 

인터페이스로 기존 코드를 건드리지 않고도 쉽게 동물(기능)을 추가할 수 있다.

 

class Tiger implements Animal {
    @Override
    public void makeSound() {
        System.out.println("어흥");
    }
}