영호
[OOP] SOLID - OCP(개방-폐쇄 원칙) 본문
들어가며
SOLID의 SRP글에 이어 이번에는 OCP(개발-폐쇄 원칙)에 대해 알아보겠습니다.
OCP(개발-폐쇄 원칙)이란
"Open-Closed Principle"의 약자입니다.
"확장에는 열려있고, 변경에는 닫혀있다."를 의미합니다. 즉, 기존에 동작하는 코드를 수정 없이, 코드를 추가함으로써 기능을 추가하거나 변경할 수 있어야 한다는 말입니다.
해당 원칙은 추상화나 인터페이스의 다형성을 통해 준수할 수 있습니다. 이제 코드를 통해 예시를 들어보겠습니다.
상황 가정
현재 세상에는 기름으로 움직이는 자동차만 존재한다고 가정을 합니다. 차를 소유한 사람이 자동차를 움직이려면 기름만 넣으면 되기 때문에 Driver클래스의 charge() 함수에는 기름을 넣는 로직만 존재합니다.
public class OilCar {
public void charge(){
System.out.println("기름을 넣어주세요.");
}
}
public class Driver {
OilCar myCar;
public Driver(OilCar myCar) {
this.myCar = myCar;
}
public void startToCharging() {
myCar.charge();
System.out.println("기름을 주유합니다.");
}
}
그러나 기술의 발전으로 전기 자동차가 출시되자 전기자동차로 바꿨습니다. 이 상황에서 전기 자동차도 충전을 위해 ElecticCar 클래스를 생성하고, Driver클래스의 charge() 함수에 myCar의 타입을 ElectricCar로 수정하고, 생성자의 parameter 역시 ElectricCar로 수정해야 합니다.
public class ElectricCar {
public void charge(){
System.out.println("전기를 넣어주세요.");
}
}
public class Driver {
ElectricCar myCar;
public Driver(ElectricCar myCar) {
this.myCar = myCar;
}
public void startToCharging() {
myCar.charge();
}
}
이렇게 된다면 기존 코드에 수정이 일어나게 됩니다. OCP원칙을 준수하는 코드는 코드의 확장을 통해 기능 변경이 가능해야 하지, 기존 코드의 변경을 통해 기능 변경이 가능한 구조가 아닙니다. 그래서 위 코드는 기존 코드를 수정함으로써 기능 변경이 가능하기 때문에 OCP원칙을 위배합니다.
이제 인터페이스를 통한 다형성으로 OCP원칙을 준수해보겠습니다.
public interface Car {
public void charge();
}
public class OilCar implements Car{
@Override
public void charge() {
System.out.println("기름을 넣어주세요.");
}
}
public class ElectricCar implements Car{
@Override
public void charge() {
System.out.println("전기를 넣어주세요.");
}
}
public class Driver {
Car myCar;
public Driver(Car myCar) {
this.myCar = myCar;
}
public void startToCharging() {
myCar.charge();
}
}
- Driver클래스에서 Car인터페이스에 의존하면서 어떤 종류의 자동차가 들어와도 기존 코드의 수정이 필요 없어졌습니다.
- 이제 새로운 연료를 사용하는 자동차가 출시되어도 Car인터페이스를 구현하는 클래스를 확장하는 과정을 통해 기존 코드의 변화가 없어졌습니다.
이처럼 코드의 확장에는 열려있고 기존 코드의 수정에는 닫혀있는 것이 OCP원칙입니다. OCP원칙을 준수하면 객체지향의 원리인 추상화와 다형성을 준수하기 때문에 보다 유연한 구조로 개발이 가능합니다.
마무리
추후 기능 변경이 예상되는 클래스에 대해서는 일반화를 잘해둬야 추후 변경사항에 대처하기 좋을 거 같습니다.
'OOP' 카테고리의 다른 글
다형성이란? (4) | 2023.03.11 |
---|---|
[OOP] SOLID - DIP(의존성 역전 원칙) (2) | 2022.12.23 |
[SOLID] ISP(인터페이스 분리 원칙) (0) | 2022.06.07 |
[OOP] SOLID - LSP(리스코프 치환 원칙) (0) | 2022.06.05 |
[OOP] SOLID - SRP(단일책임원칙) (0) | 2022.05.23 |