객체 지향 프로그래밍 개념 – 객체 지향 설계 원칙 (SOLID 원칙) – 1 – OCP (Open-Closed Principle)

객체 지향 프로그래밍 개념 - 객체 지향 설계 원칙 (SOLID 원칙) - 1 - OCP (Open-Closed Principle)
객체 지향 프로그래밍 개념 – 객체 지향 설계 원칙 (SOLID 원칙) – 1 – OCP (Open-Closed Principle)

객체 지향 프로그래밍 개념 – 객체 지향 설계 원칙 (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 객체를 주문받아 요리하고, 완성된 음식의 정보를 출력합니다.

이제 새로운 요구사항으로 샐러드와 스테이크를 추가해야 한다고 가정해봅시다. 이를 위해 새로운 클래스인 SaladSteak을 작성하고, OrderSystem 클래스의 placeOrder() 메서드에서도 새로운 음식을 주문받을 수 있도록 수정했습니다. 그리고 Main 클래스에서도 샐러드와 스테이크를 주문하도록 추가했습니다.

이렇게 코드를 수정하지 않고도 새로운 음식을 추가할 수 있었던 이유는 OCP를 준수했기 때문입니다. Food 클래스를 상속받아 새로운 음식을 추가함으로써 기존 코드를 변경하지 않고도 기능을 확장할 수 있었습니다.

OCP 주의해야 할 점

OCP를 지키기 위해서는 몇 가지 주의해야 할 점이 있습니다.

  1. 추상화와 다형성 활용: 추상 클래스나 인터페이스를 활용하여 공통적인 기능을 추상화하고 다형성을 이용해 확장성 있는 코드를 작성해야 합니다.
  2. 변경 가능한 요소의 분리: 변화할 수 있는 부분과 변하지 않는 부분을 분리하여, 변화가 필요한 부분만 수정하고 확장할 수 있도록 해야 합니다.
  3. 상속보다는 구성 사용: 상속보다는 객체를 구성하는 방식을 사용하여 의존성을 낮추고 유연성을 높일 수 있습니다.

OCP는 소프트웨어 설계의 원칙 중 하나로, 유지보수성과 확장성을 고려한 코드를 작성하는데 큰 도움이 됩니다. OCP를 준수하면 새로운 요구사항이나 기능 추가에도 기존 코드를 수정하지 않고도 코드의 확장이 가능하며, 유연하고 재사용 가능한 소프트웨어를 개발할 수 있습니다.

이상으로 OCP에 대한 소개를 마치도록 하겠습니다. 다음 포스트에서는 SOLID 원칙의 다른 원칙에 대해 알아보도록 하겠습니다.

감사합니다!

키워드: 객체, 지향, 프로그래밍, 개념, 객체, 지향, 설계, 원칙, (SOLID, 원칙), 1, OCP, (Open-Closed, Principle)

주의해야 할 점 요약

  • OCP를 지키기 위해 추상화와 다형성을 활용하세요.
  • 변경 가능한 요소와 변하지 않는 요소를 분리하세요.
  • 상속보다는 구성을 사용하여 의존성을 낮추고 유연성을 높이세요.

답글 남기기