[JAVA] OCP (Open Closed Principle) κ°λ°© νμμ μμΉ
π κ°λ°© νμμ μμΉ (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λ₯Ό μ§μΌ°λμ§ μλ°νλμ§μ μ§ν! β