๐ ๊ฐ๋ฐฉ ํ์์ ์์น (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๋ฅผ ์ง์ผฐ๋์ง ์๋ฐํ๋์ง์ ์งํ! โ
'Language > JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JAVA] ์ปฌ๋ ์ (Collection) (0) | 2024.08.29 |
---|---|
[JAVA] ์ ๋ค๋ฆญ (Generic) (4) | 2024.08.28 |
[JAVA] ๋ฉ๋ชจ๋ฆฌ ์์ญ (0) | 2024.08.25 |
[JAVA] ์ค๋ ๋(Thread) ์๋ฏธ์ ์ฌ์ฉ๋ฒ (4) | 2024.08.24 |
[JAVA] ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค (0) | 2024.08.19 |