
객체 지향 프로그래밍 개념 – 객체 지향 설계 원칙 (SOLID 원칙) – 1 – OCP (Open-Closed Principle)
소개
객체 지향 프로그래밍은 객체들의 상호작용을 기반으로 하는 프로그래밍 패러다임입니다. 이를 효과적으로 구현하기 위해 SOLID 원칙이라는 객체 지향 설계 원칙들이 고안되었습니다. SOLID 원칙은 객체 지향 소프트웨어를 설계할 때 유연성, 재사용성, 확장성 등을 고려하여 안정적이고 유지보수가 쉬운 코드를 작성하는데 도움을 줍니다. 이 글에서는 SOLID 원칙 중 첫 번째인 OCP (Open-Closed Principle)에 대해 알아보겠습니다.
OCP (Open-Closed Principle)
OCP (Open-Closed Principle)는 개방-폐쇄 원칙을 의미하며, “확장에는 열려있고, 수정에는 닫혀있어야 한다”는 의미를 가지고 있습니다. 이 원칙은 새로운 기능이나 요구사항이 추가될 때 기존의 코드를 수정하지 않고 확장할 수 있도록 설계해야 한다는 것을 강조합니다.
소제목: OCP 이해하기
예를 들어, 한 식당이 있을 때 메뉴판에 새로운 메뉴를 추가해야 한다고 가정해봅시다. OCP를 지키지 않는다면, 메뉴판을 수정하는 과정에서 기존 코드를 변경해야 할 수도 있습니다. 그러나 OCP를 준수한다면, 새로운 메뉴를 추가하기 위해 기존 코드를 수정하지 않고도 확장할 수 있습니다.
예시: 음식 주문 시스템
음식 주문 시스템을 개발한다고 가정해봅시다. 초기에는 피자와 햄버거만 주문할 수 있는 기능이 있었습니다. 그런데 새로운 요구사항으로 샐러드와 스테이크를 주문할 수 있는 기능이 추가되어야 합니다. 이때 OCP를 적용한 설계를 해보겠습니다.
public abstract class Food {
private String name;
private int price;
public Food(String name, int price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public int getPrice() {
return price;
}
public abstract void cook();
}
public class Pizza extends Food {
public Pizza() {
super("피자", 10000);
}
@Override
public void cook() {
System.out.println("피자를 굽습니다.");
}
}
public class Hamburger extends Food {
public Hamburger() {
super("햄버거", 8000);
}
@Override
public void cook() {
System.out.println("햄버거를 조리합니다.");
}
}
public class Salad extends Food {
public Salad() {
super("샐러드", 6000);
}
@Override
public void cook() {
System.out.println("샐러드를 준비합니다.");
}
}
public class Steak extends Food {
public Steak() {
super("스테이크", 15000);
}
@Override
public void cook() {
System.out.println("스테이크를 구웁니다.");
}
}
public class OrderSystem {
public void placeOrder(Food food) {
System.out.println(food.getName() + "를 주문합니다.");
food.cook();
System.out.println(food.getName() + "가 완성되었습니다.");
System.out.println("가격: " + food.getPrice() + "원");
}
}
public class Main {
public static void main(String[] args) {
OrderSystem orderSystem = new OrderSystem();
orderSystem.placeOrder(new Pizza());
orderSystem.placeOrder(new Hamburger());
orderSystem.placeOrder(new Salad());
orderSystem.placeOrder(new Steak());
}
}
위 예시 코드에서는 Food
라는 추상 클래스를 만들고, Pizza
, Hamburger
, Salad
, Steak
클래스가 이를 상속받아 각각의 음식을 구현합니다. OrderSystem
클래스에서는 Food
객체를 주문받아 요리하고, 완성된 음식의 정보를 출력합니다.
이제 새로운 요구사항으로 샐러드와 스테이크를 추가해야 한다고 가정해봅시다. 이를 위해 새로운 클래스인 Salad
과 Steak
을 작성하고, OrderSystem
클래스의 placeOrder()
메서드에서도 새로운 음식을 주문받을 수 있도록 수정했습니다. 그리고 Main
클래스에서도 샐러드와 스테이크를 주문하도록 추가했습니다.
이렇게 코드를 수정하지 않고도 새로운 음식을 추가할 수 있었던 이유는 OCP를 준수했기 때문입니다. Food
클래스를 상속받아 새로운 음식을 추가함으로써 기존 코드를 변경하지 않고도 기능을 확장할 수 있었습니다.
OCP 주의해야 할 점
OCP를 지키기 위해서는 몇 가지 주의해야 할 점이 있습니다.
- 추상화와 다형성 활용: 추상 클래스나 인터페이스를 활용하여 공통적인 기능을 추상화하고 다형성을 이용해 확장성 있는 코드를 작성해야 합니다.
- 변경 가능한 요소의 분리: 변화할 수 있는 부분과 변하지 않는 부분을 분리하여, 변화가 필요한 부분만 수정하고 확장할 수 있도록 해야 합니다.
- 상속보다는 구성 사용: 상속보다는 객체를 구성하는 방식을 사용하여 의존성을 낮추고 유연성을 높일 수 있습니다.
OCP는 소프트웨어 설계의 원칙 중 하나로, 유지보수성과 확장성을 고려한 코드를 작성하는데 큰 도움이 됩니다. OCP를 준수하면 새로운 요구사항이나 기능 추가에도 기존 코드를 수정하지 않고도 코드의 확장이 가능하며, 유연하고 재사용 가능한 소프트웨어를 개발할 수 있습니다.
이상으로 OCP에 대한 소개를 마치도록 하겠습니다. 다음 포스트에서는 SOLID 원칙의 다른 원칙에 대해 알아보도록 하겠습니다.
감사합니다!
키워드: 객체, 지향, 프로그래밍, 개념, 객체, 지향, 설계, 원칙, (SOLID, 원칙), 1, OCP, (Open-Closed, Principle)
주의해야 할 점 요약
- OCP를 지키기 위해 추상화와 다형성을 활용하세요.
- 변경 가능한 요소와 변하지 않는 요소를 분리하세요.
- 상속보다는 구성을 사용하여 의존성을 낮추고 유연성을 높이세요.