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

2025. 2. 3. 02:03·Engineering Notes/Java & Spring

 좋은 객체 지향 설계 원칙에는 여러 가지가 있지만, 그중 하나가 바로 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를 잘 지킨 사례라고 볼 수 있다.

'Engineering Notes > Java & Spring' 카테고리의 다른 글

[Java] BOJ 11723: 비트마스크 (BitMask)  (1) 2025.02.10
[Java] BOJ 1654: 이진 탐색, 이분 탐색 (Binary Search)  (1) 2025.02.07
[Java] 인터페이스의 다중 구현  (3) 2025.01.30
[Java] abstract, interface / 추상 클래스와 인터페이스  (4) 2025.01.29
[Java] 객체 지향 프로그램과 다형성  (2) 2025.01.27
'Engineering Notes/Java & Spring' 카테고리의 다른 글
  • [Java] BOJ 11723: 비트마스크 (BitMask)
  • [Java] BOJ 1654: 이진 탐색, 이분 탐색 (Binary Search)
  • [Java] 인터페이스의 다중 구현
  • [Java] abstract, interface / 추상 클래스와 인터페이스
UTACT
UTACT
시작은 가볍게 이유는 무겁게
  • UTACT
    Software Engineer
    UTACT
    • GitHub
  • 전체
    오늘
    어제
  • 공지사항

    • README
  • 최근 글

    • 분류 전체보기 (126)
      • Project Logs (2)
        • DashHub (2)
        • Re:Act (0)
        • Samsung NW (0)
      • Engineering Notes (76)
        • Java & Spring (44)
        • Database & Persistence (1)
        • DevOps & Infra (4)
        • CS & Algorithms (26)
        • Security (1)
      • Reflections (5)
        • Retrospectives (1)
        • Feedback Received (3)
        • Challenges (1)
      • Tips (24)
      • Archive (19)
  • 태그

    도커
    VS Code
    데이터 영속성
    BFS
    IntelliJ
    JPA
    Python
    @CreatedDate
    .prettierrc
    토스페이먼츠
    BOJ
    Data Type
    Reallocation
    vite
    팀 정렬
    CS
    OOP
    heapify
    Array
    iamdefinitelyabackenddeveloper
    타입 소거
    cherry-pick
    where-was-i
    듀얼 피봇 퀵 정렬
    REST
    heap
    버프 슈트
    인접 노드 리스트
    DS
    hate-cnu
  • hELLO· Designed By정상우.v4.10.6
UTACT
[Java] OCP (Open-Closed Principle) / 개방-폐쇄 원칙
상단으로

티스토리툴바