[꼼꼼한 개발자] 꼼코더

[JAVA] - OCP란?(Open-Closed Principle, 계방 폐쇄 원칙이란?, 계방 폐쇄 원칙 예제) 간단하고 쉽게 이해하기 본문

간단하고 쉽게/JAVA

[JAVA] - OCP란?(Open-Closed Principle, 계방 폐쇄 원칙이란?, 계방 폐쇄 원칙 예제) 간단하고 쉽게 이해하기

꼼코더 2023. 6. 11. 02:07
반응형

🧹 간단 요약

OCP란 확장에는 개방되어 있어야 하고 수정에는 폐쇄되어야 한다는 원칙을 의미

즉 새로운 기능이 추가되더라도 기존 코드를 수정하지 않고 확장할 수 있어야 한다.

 

정말 쉽고 자세히 다시 말하자면

"인터페이스와 추상화 등을 사용하여 다형성을 적용해 기능을 확장하고 코드 변경을 최소화하는 것이 개방 폐쇄의 원칙"

 

(자세한 내용은 아래에)

 

🤷🏻 OCP란?(Open-Closed Principle)

OCP는 소프트웨어 개체(클래스, 모듈, 함수 등)는 확장에 대해서는 개방되어 있어야 하고

수정에 대해서는 폐쇄되어야 한다는 원칙을 의미한다.

 

OCP의 아이디어는 기존의 코드를 변경하지 않고도 새로운 기능을 추가할 수 있어야 한다는 것이다.

즉, 기존의 코드는 확장에 대해서 개방되어야 하며, 새로운 기능이 추가되더라도 기존 코드를 수정하지 않고 확장할 수 있어야 한다.

 

👀  OCP의 장점

변경에 유연하면서도 안정적인 시스템을 구축하는데 도움을 준다.

이는 코드의 재사용성, 유지 보수성 및 확장성을 향상하는 데 도움이 된다.

 

 

👨🏻‍🏫 예시 설명

도형(Shape)을 그리는 프로그램이 있다.

현재는 원(Circle)과 사각형(Rectangle)을 그릴 수 있는 기능만 있고.

삼각형(Triangle) 그리기 기능을 추가하고 싶다고 가정해 보자.

 

🧑🏻‍💻 OCP를 따르지 않는 설계 예시

삼각형(Triangle) 그리기 기능을 추가를 하러면 draw 메서드()를 수정해야 한다.

이는 기존 코드를 수정해야 하므로 OCP를 위반한다.

class Shape {
    private String type;
  
    public Shape(String type) {
        this.type = type;
    }
  
    public void draw() {
        if (type.equals("circle")) {
            drawCircle();
        } else if (type.equals("rectangle")) {
            drawRectangle();
        } 
    }
  
    private void drawCircle() {
        System.out.println("원을 그립니다.");
    }
  
    private void drawRectangle() {
        System.out.println("사각형을 그립니다.");
    }
}

 

 

🧑🏻‍💻 OCP를 따르는 설계 예시

아래 코드는 인터페이스를 사용하여 각각의 도형이 Shape 인터페이스를 구현하고 있고

자신에게 맞는 도형을 그리는 draw 메서드를 구현하고 있다.

 

이제 새로운 도형 그리기(삼각형)을 추가하여도 새로운 클래스를 생성하여(기존 코드 변경 x) Shape 인터페이스를 구현하면 된다.

interface Shape {
    void draw();
}

class Circle implements Shape {
    public void draw() {
        System.out.println("원을 그립니다.");
    }
}

class Rectangle implements Shape {
    public void draw() {
        System.out.println("사각형을 그립니다.");
    }
}

class Triangle implements Shape {
    public void draw() {
        System.out.println("삼각형을 그립니다.");
    }
}

 

 

이제 draw 메서드 호출 시 각 도형 객체의 실제 타입에 따라

해당 도형의 draw 메서드가 실행되어 도형이 그려진다.

 

새로운 도형을 추가하여도 Shape 인터페이스를 구현하는 새로운 클래스를 생성하기만 하면 되어

기존 코드를 수정할 필요가 없다. 따라서 OCP를 따르는 방식이다.

public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle();
        Shape rectangle = new Rectangle();
        Shape triangle = new Triangle();
      
        circle.draw(); // 출력: 원을 그립니다.
        rectangle.draw(); // 출력: 사각형을 그립니다.
        triangle.draw(); // 출력: 삼각형을 그립니다.
    }
}

 

 

 

 

 

 

 

 

 

Comments