Language/JAVA

[JAVA] OCP (Open Closed Principle) 개방 νμ‡„μ˜ 원칙

κ΅ λ―Ό 2024. 8. 26. 12:36

πŸ“Œ 개방 νμ‡„μ˜ 원칙 (OCP) ?

: 객체 μ§€ν–₯ 섀계 원칙 쀑 ν•˜λ‚˜λ‘œ Open for extention + Closed for modification 즉, μƒˆλ‘œμš΄ κΈ°λŠ₯의 μΆ”κ°€λ‚˜ λ³€κ²½ 사항이 생겼을 λ•Œ κΈ°μ‘΄ μ½”λ“œλŠ” ν™•μž₯ν•  수 μžˆμ–΄μ•Ό ν•˜μ§€λ§Œ 기쑴의 μ½”λ“œλŠ” μˆ˜μ •λ˜μ§€ μ•Šμ•„μ•Ό ν•˜λŠ” 원칙이닀. ν™•μž₯μ—λŠ” μ—΄λ €μžˆκ³  λ³€κ²½μ—λŠ” λ‹«ν˜€μžˆμ–΄μ•Ό ν•œλ‹€λŠ” μ˜λ―Έμ΄λ‹€. 

  • Open for extention : ν™•μž₯은 μ—΄λ €μžˆλ‹€λŠ” 뜻으둜, ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ μˆ˜μ •μ„ μ œμ™Έν•œ κΈ°λŠ₯ μΆ”κ°€ κ°€λŠ₯을 의미.
  • Closed for modification : μ½”λ“œ μˆ˜μ •μ€ λ‹«ν˜€μžˆλ‹€λŠ” 의미둜, ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œ μˆ˜μ • κΈˆμ§€λ₯Ό 의미. 

 

μž₯점

  • μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ„±μ„ 높이고 λ³€κ²½μœΌλ‘œ μΈν•œ 였λ₯˜λ₯Ό 쀄일 수 μžˆλ‹€.
  • λ‹€ν˜•μ„±μ„ ν™œμš©ν•˜κ³  μ—­ν• κ³Ό κ΅¬ν˜„μ„ 잘 λΆ„λ¦¬ν•˜μ˜€κΈ°μ— 핡심 μ½”λ“œλ“€μ„ μœ μ§€ν•  수 μžˆλ‹€.
  • ν…ŒμŠ€νŠΈ μš©μ΄μ„± : 각 ν΄λž˜μŠ€κ°€ λ…λ¦½μ μœΌλ‘œ ν…ŒμŠ€νŠΈλ  수 μžˆλ‹€.
  • ν˜‘μ—… μš©μ΄μ„± : μ„œλ‘œμ˜ μ½”λ“œλ₯Ό κ±΄λ“œλ¦¬μ§€ μ•Šκ³  κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆκΈ°μ—, μΆ©λŒμ„ 쀄이고 개발 속도가 λ†’μ•„μ§„λ‹€.

 

πŸ“„  ocpλ₯Ό μœ„λ°˜ν•œ 경우 μ½”λ“œ μ˜ˆμ‹œ

class Shape {
    public String type;
    
    public Shape(String type) {
        this.type = type;
    }
}

class AreaCalculator {
    public double calculateArea(Shape shape) {
        if (shape.type.equals("circle")) {
            return Math.PI * 5 * 5; // λ°˜μ§€λ¦„μ΄ 5인 μ›μ˜ 넓이
        } else if (shape.type.equals("rectangle")) {
            return 10 * 5; // κ°€λ‘œ 10, μ„Έλ‘œ 5인 μ‚¬κ°ν˜•μ˜ 넓이
        }
        return 0;
    }
}

public class Main {
    public static void main(String[] args) {
        Shape circle = new Shape("circle");
        Shape rectangle = new Shape("rectangle");

        AreaCalculator calculator = new AreaCalculator();
        System.out.println("Circle Area: " + calculator.calculateArea(circle));
        System.out.println("Rectangle Area: " + calculator.calculateArea(rectangle));
    }
}

 

문제점

:  AreaCalculator ν΄λž˜μŠ€κ°€ μƒˆλ‘œμš΄ λ„ν˜•μ΄ 좔가될 λ•Œλ§ˆλ‹€ ν΄λΌμ΄μ–ΈνŠΈ μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ•Ό ν•œλ‹€.

 → μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆλŠ” ꡬ쑰둜, OCP 원칙 μœ„λ°˜

 

 

πŸ“„  ocpλ₯Ό μ€€μˆ˜ν•œ 경우 μ½”λ“œ μ˜ˆμ‹œ

// 좔상 클래슀 λ˜λŠ” μΈν„°νŽ˜μ΄μŠ€λ‘œ ν˜•νƒœ μ •μ˜
abstract class Shape {
    abstract double calculateArea();
}

class Circle extends Shape {
    private double radius;

    public Circle(double radius) {
        this.radius = radius;
    }

    @Override
    double calculateArea() {
        return Math.PI * radius * radius;
    }
}

class Rectangle extends Shape {
    private double width;
    private double height;

    public Rectangle(double width, double height) {
        this.width = width;
        this.height = height;
    }

    @Override
    double calculateArea() {
        return width * height;
    }
}

public class Main {
    public static void main(String[] args) {
        Shape circle = new Circle(5);
        Shape rectangle = new Rectangle(10, 5);

        System.out.println("Circle Area: " + circle.calculateArea());
        System.out.println("Rectangle Area: " + rectangle.calculateArea());
    }
}

 

: μƒˆλ‘œμš΄ λ„ν˜•μ΄ 생겼을 경우 AreaCalculator 클래슀λ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šκ³  Shape 클래슀λ₯Ό 상속받아 μƒˆλ‘œμš΄ λ„ν˜• 클래슀λ₯Ό λ§Œλ“€κ³  calculateAreaλ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜λ©΄ λ˜λŠ” ꡬ쑰.

→ κΈ°μ‘΄ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ§€ μ•Šμ•„λ„ λ˜κΈ°μ— OCP μ€€μˆ˜

 

β–Ά μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜κ²Œ 되면 κΈ°μ‘΄ μ½”λ“œμ˜ μˆ˜μ •μ€ λΆˆκ°€ν”Όν•˜λ‹€. μ΄λ•Œ, μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μ½”λ“œ ( μœ„ μ½”λ“œμ—μ„œλŠ” AreaCalculator)λ₯Ό μˆ˜μ •ν–ˆλŠ”μ§€κ°€ OCPλ₯Ό μ§€μΌ°λŠ”μ§€ μœ„λ°˜ν–ˆλŠ”μ§€μ˜ μ§€ν‘œ! β—€