개방-폐쇄 원칙(Open/Closed Principle, OCP)은 소프트웨어 설계의 핵심 원칙 중 하나로, 로버트 C. 마틴과 버트란드 마이어가 제안한 원칙입니다. 이 원칙은 소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하고, 변경에는 폐쇄적이어야 한다는 것을 강조합니다. 즉, 기존의 코드를 수정하지 않고도 새로운 기능을 추가할 수 있도록 설계해야 한다는 것입니다.
유연성을 확보합니다:
OCP를 준수하는 코드는 새로운 요구사항이나 기능 추가에 유연하게 대응할 수 있습니다. 기존 코드를 변경하지 않고도 새로운 기능을 확장할 수 있기 때문에 시스템의 유연성이 향상됩니다.
코드의 안정성을 보장합니다:
기존의 코드를 수정하지 않고 새로운 기능을 추가하기 때문에, 기존의 기능에 문제가 발생하지 않도록 안정성을 보장할 수 있습니다.
재사용성을 증가시킵니다:
OCP를 준수하는 코드는 모듈화되어 있어서 새로운 기능을 추가할 때 쉽게 재사용할 수 있습니다.
추상화를 활용합니다:
추상화를 통해 변경될 수 있는 부분을 추상화하여 독립적으로 관리할 수 있도록 합니다.
상속이나 인터페이스를 활용합니다:
상속이나 인터페이스를 사용하여 기존 코드의 수정 없이 새로운 기능을 추가할 수 있도록 합니다.
의존성 주입(Dependency Injection)을 사용합니다:
의존성 주입을 통해 객체 간의 의존성을 낮추고, 기존 객체의 변경 없이 새로운 구현체를 주입하여 기능을 확장할 수 있습니다.
예를 들어, 여러 종류의 도형을 그리는 프로그램이 있다고 가정해봅시다. 이 프로그램은 처음에는 원과 사각형만 지원했지만, 이후 삼각형을 추가로 지원해야 할 필요가 생겼습니다. OCP를 준수하여 이 기능을 확장하는 방법은 다음과 같습니다:
// 도형을 나타내는 인터페이스
interface Shape {
void draw();
}
// 원 클래스
class Circle implements Shape {
@Override
public void draw() {
System.out.println("원을 그립니다.");
}
}
// 사각형 클래스
class Rectangle implements Shape {
@Override
public void draw() {
System.out.println("사각형을 그립니다.");
}
}
// 삼각형 클래스 (추가로 확장되는 클래스)
class Triangle implements Shape {
@Override
public void draw() {
System.out.println("삼각형을 그립니다.");
}
}
이와 같이 인터페이스를 통해 다양한 도형을 그리는 클래스를 추상화하여 확장에 열려 있게끔 설계합니다. 새로운 도형이 추가되어도 기존의 코드를 수정할 필요 없이 새로운 도형 클래스를 추가하면 됩니다. 이는 개방-폐쇄 원칙을 준수한 예시입니다.