좋은 객체 지향 설계 원칙에는 여러 가지가 있지만, 그중 하나가 바로 OCP다.
- Open for extention
- Closed for modification
즉, 기존 코드는 수정하지 않으면서 새로운 기능을 위해 확장할 수 있어야 한다.
*기존 코드: 시스템의 핵심 동작 코드
*확장된 부분: 요구사항 추가 구현
Strategy Pattern
전략 패턴이란 다양한 객체 지향 디자인 패턴 중 하나로, 알고리즘을 클래스로 캡슐화하여 동적으로 변경할 수 있게 해주는 패턴이다. 이 패턴은 알고리즘을 사용하는 코드와 알고리즘 자체를 분리하여, 새로 추가된 알고리즘이 기존 코드에 영향을 주지 않도록 한다.
[전략 패턴의 기본 구조]
- 클라이언트 코드 (Context)
- 전략 인터페이스 (Strategy)
- 구체적인 전략 (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
'프로그래밍 > 배웠어, 자바' 카테고리의 다른 글
[Java] 인터페이스의 다중 구현 (1) | 2025.01.30 |
---|---|
[Java] abstract, interface / 추상 클래스와 인터페이스 (2) | 2025.01.29 |
[Java] 객체 지향 프로그램과 다형성 (1) | 2025.01.27 |
[Java] Getter, Setter 메서드 / 접근 제어자 (1) | 2025.01.24 |
[Java] super 키워드 / 상속과 메모리 구조 (2) | 2025.01.23 |