[Design Pattern] OCP(개방 폐쇄 원칙)
객체지향적인 프로그램을 설계할 때 가장 중요하고, 반드시 지켜야 할 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("어흥");
}
}