_

Always be tactful

프로그래밍/배웠어, 자바

[Java] OCP (Open-Closed Principle) / 개방-폐쇄 원칙

funczun 2025. 2. 3. 02:03

 좋은 객체 지향 설계 원칙에는 여러 가지가 있지만, 그중 하나가 바로 OCP다.

  • Open for extention
  • Closed for modification

 즉, 기존 코드는 수정하지 않으면서 새로운 기능을 위해 확장할 수 있어야 한다.

 

*기존 코드: 시스템의 핵심 동작 코드

*확장된 부분: 요구사항 추가 구현


Strategy Pattern

 

 전략 패턴이란 다양한 객체 지향 디자인 패턴 중 하나로, 알고리즘을 클래스로 캡슐화하여 동적으로 변경할 수 있게 해주는 패턴이다. 이 패턴은 알고리즘을 사용하는 코드와 알고리즘 자체를 분리하여, 새로 추가된 알고리즘이 기존 코드에 영향을 주지 않도록 한다.


[전략 패턴의 기본 구조]

  1. 클라이언트 코드 (Context)
  2. 전략 인터페이스 (Strategy)
  3. 구체적인 전략 (Concrete Strategy)

// 클라이언트 코드
public class Driver {

    private Car car;

    public void setCar(Car car) {
        System.out.println("차를 선택합니다.\n선택된 차: " + car);
        this.car = car;
    }

    public void drive() {
        System.out.println("차를 운전합니다.");
        car.startEngine();
        car.pressAccelerator();
        car.offEngine();
    }
}

▶ 알고리즘을 사용하는 객체로, 전략 인터페이스를 통해 알고리즘을 호출한다.

// 전략 인터페이스
public interface Car {

    void startEngine();
    void offEngine();
    void pressAccelerator();
}

▶ 알고리즘을 정의하는 인터페이스다.

// 구체적인 전략1
public class CarA implements Car {
    @Override
    public void startEngine() {
        System.out.println("CarA.startEngine");
    }

    @Override
    public void offEngine() {
        System.out.println("CarA.offEngine");
    }

    @Override
    public void pressAccelerator() {
        System.out.println("CarA.pressAccelerator");
    }
}

▶ 전략 인터페이스를 구현한 클래스다. (각기 다른 알고리즘을 제공한다.)

// 구체적인 전략2
public class CarB implements Car {
    @Override
    public void startEngine() {
        System.out.println("CarB.startEngine");
    }

    @Override
    public void offEngine() {
        System.out.println("CarB.offEngine");
    }

    @Override
    public void pressAccelerator() {
        System.out.println("CarB.pressAccelerator");
    }
}

▶ 전략 인터페이스를 구현한 클래스다. (각기 다른 알고리즘을 제공한다.)


 위 예제에서는 새로운 차량이 추가되더라도, 클라이언트 코드인 Driver와 전략 인터페이스 Car의 수정 없이, 추가적인 구현을 통해 확장하고 있다. OCP를 잘 지킨 사례라고 볼 수 있다.

728x90