๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค์ ๋ฏธ๋ฌํ ์ฐจ์ด๋ฅผ ํ๊ตฌํฉ๋๋ค. ๊ฒฌ๊ณ ํ ๋์์ธ ํจํด ๊ตฌํ์ ์ํด ๊ฐ์์ ์ฐจ์ด์ , ์ ์ฌ์ , ๊ทธ๋ฆฌ๊ณ ์ธ์ ์ฌ์ฉํด์ผ ํ๋์ง ์ดํดํด ๋ณด์ธ์.
์ถ์ ํด๋์ค vs ์ธํฐํ์ด์ค: ๋์์ธ ํจํด ๊ตฌํ์ ์ํ ์ข ํฉ ๊ฐ์ด๋
๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ(OOP) ์์ญ์์ ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ ์ถ์ํ, ๋คํ์ฑ, ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ๋ฌ์ฑํ๊ธฐ ์ํ ๊ธฐ๋ณธ์ ์ธ ๋๊ตฌ์ ๋๋ค. ์ด๋ค์ ์ ์ฐํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์ํํธ์จ์ด ์์คํ ์ ์ค๊ณํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด ๊ฐ์ด๋๋ ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ธต์ ์ผ๋ก ๋น๊ตํ๋ฉฐ, ์ด๋ค์ ์ ์ฌ์ , ์ฐจ์ด์ , ๊ทธ๋ฆฌ๊ณ ๋์์ธ ํจํด ๊ตฌํ์์ ํจ๊ณผ์ ์ธ ํ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ํ๊ตฌํฉ๋๋ค.
์ถ์ํ ๋ฐ ๋์์ธ ํจํด ์ดํด
์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค์ ์ธ๋ถ ์ฌํญ์ ๋ค์ด๊ฐ๊ธฐ ์ ์, ์ถ์ํ ๋ฐ ๋์์ธ ํจํด์ ๊ธฐ๋ณธ ๊ฐ๋ ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
์ถ์ํ
์ถ์ํ๋ ๋ถํ์ํ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์จ๊ธฐ๋ฉด์ ํ์์ ์ธ ํน์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ํด๋์ค๋ฅผ ๋ชจ๋ธ๋งํ์ฌ ๋ณต์กํ ์์คํ ์ ๋จ์ํํ๋ ๊ณผ์ ์ ๋๋ค. ์ด๋ฅผ ํตํด ํ๋ก๊ทธ๋๋จธ๋ ๊ฐ์ฒด๊ฐ ๋ฌด์์ ํ๋์ง์ ์ง์คํ๊ณ ์ด๋ป๊ฒ ํ๋์ง์๋ ๋ ์ ๊ฒฝ ์ธ ์ ์์ต๋๋ค. ์ด๋ ๋ณต์ก์ฑ์ ์ค์ด๊ณ ์ฝ๋ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํต๋๋ค.
์๋ฅผ ๋ค์ด, `Vehicle` ํด๋์ค๋ฅผ ๊ณ ๋ คํด ๋ณด์ธ์. ์ฐ๋ฆฌ๋ ์์ง ์ ํ์ด๋ ๋ณ์๊ธฐ ์ธ๋ถ ์ฌํญ๊ณผ ๊ฐ์ ์ธ๋ถ ์ ๋ณด๋ฅผ ์ถ์ํํ๊ณ , `start()`, `stop()`, `accelerate()`์ ๊ฐ์ ๊ณตํต ๋์์ ์ง์คํ ์ ์์ต๋๋ค. `Car`, `Truck`, `Motorcycle`๊ณผ ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ํด๋์ค๋ `Vehicle` ํด๋์ค๋ก๋ถํฐ ์์๋ฐ์ ์ด๋ฌํ ๋์์ ๊ฐ์์ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ๊ฒ์ ๋๋ค.
๋์์ธ ํจํด
๋์์ธ ํจํด์ ์ํํธ์จ์ด ์ค๊ณ์์ ํํ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ํ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ฃจ์ ์ ๋๋ค. ์ด๋ค์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ํจ๊ณผ์ ์์ด ์ ์ฆ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ํ๋ ๋๋ค. ๋์์ธ ํจํด์ ํ์ฉํ๋ฉด ๋์ฑ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ์ดํดํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ธ ๋์์ธ ํจํด์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฑ๊ธํด(Singleton): ํด๋์ค๊ฐ ํ๋์ ์ธ์คํด์ค๋ง ๊ฐ๋๋ก ๋ณด์ฅํ๊ณ ์ด์ ๋ํ ์ ์ญ ์ ๊ทผ ์ง์ ์ ์ ๊ณตํฉ๋๋ค.
- ํฉํ ๋ฆฌ(Factory): ๊ฐ์ฒด ์์ฑ์ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ง๋ง, ์ธ์คํด์คํ๋ฅผ ์๋ธํด๋์ค์ ์์ํฉ๋๋ค.
- ์ ๋ต(Strategy): ์ผ๋ จ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํ๊ณ , ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ์บก์ํํ๋ฉฐ, ์ด๋ค์ ์ํธ ๊ตํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
- ์ต์ ๋ฒ(Observer): ๊ฐ์ฒด๋ค ๊ฐ์ ์ผ๋๋ค ์ข ์์ฑ์ ์ ์ํ์ฌ, ํ ๊ฐ์ฒด์ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ชจ๋ ์ข ์ ๊ฐ์ฒด์ ์๋์ผ๋ก ์๋ฆผ์ด ๊ฐ๊ณ ์ ๋ฐ์ดํธ๋๋๋ก ํฉ๋๋ค.
์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ ๋ง์ ๋์์ธ ํจํด์ ๊ตฌํํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ๋ฉฐ, ์ ์ฐํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์๋ฃจ์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ถ์ ํด๋์ค: ๊ณตํต ๋์ ์ ์
์ถ์ ํด๋์ค๋ ์ง์ ์ธ์คํด์คํํ ์ ์๋ ํด๋์ค์ ๋๋ค. ์ด๋ ๋ค๋ฅธ ํด๋์ค์ ๋ํ ์ฒญ์ฌ์ง ์ญํ ์ ํ๋ฉฐ, ๊ณตํต ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๊ณ ๋ถ๋ถ์ ์ธ ๊ตฌํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ถ์ ํด๋์ค๋ ์ถ์ ๋ฉ์๋(๊ตฌํ์ด ์๋ ๋ฉ์๋)์ ๊ตฌ์ฒด์ ์ธ ๋ฉ์๋(๊ตฌํ์ด ์๋ ๋ฉ์๋)๋ฅผ ๋ชจ๋ ํฌํจํ ์ ์์ต๋๋ค.
์ถ์ ํด๋์ค์ ์ฃผ์ ํน์ง:
- ์ง์ ์ธ์คํด์คํํ ์ ์์ต๋๋ค.
- ์ถ์ ๋ฉ์๋์ ๊ตฌ์ฒด์ ์ธ ๋ฉ์๋๋ฅผ ๋ชจ๋ ํฌํจํ ์ ์์ต๋๋ค.
- ์ถ์ ๋ฉ์๋๋ ์๋ธํด๋์ค์ ์ํด ๊ตฌํ๋์ด์ผ ํฉ๋๋ค.
- ํด๋์ค๋ ํ๋์ ์ถ์ ํด๋์ค๋ง ์์๋ฐ์ ์ ์์ต๋๋ค (๋จ์ผ ์์).
์์ (Java):
// Abstract class representing a shape
abstract class Shape {
// Abstract method to calculate area
public abstract double calculateArea();
// Concrete method to display the shape's color
public void displayColor(String color) {
System.out.println("The shape's color is: " + color);
}
}
// Concrete class representing a circle, inheriting from Shape
class Circle extends Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double calculateArea() {
return Math.PI * radius * radius;
}
}
์ด ์์์ `Shape`๋ ์ถ์ ๋ฉ์๋ `calculateArea()`์ ๊ตฌ์ฒด์ ์ธ ๋ฉ์๋ `displayColor()`๋ฅผ ๊ฐ์ง ์ถ์ ํด๋์ค์ ๋๋ค. `Circle` ํด๋์ค๋ `Shape`๋ฅผ ์์๋ฐ์ `calculateArea()`์ ๋ํ ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค. `Shape`์ ์ธ์คํด์ค๋ฅผ ์ง์ ์์ฑํ ์๋ ์์ผ๋ฉฐ, `Circle`๊ณผ ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ์๋ธํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ:
- ๊ด๋ จ๋ ํด๋์ค ๊ทธ๋ฃน์ ๋ํ ๊ณตํต ํ ํ๋ฆฟ์ ์ ์ํ๊ณ ์ถ์ ๋.
- ์๋ธํด๋์ค๊ฐ ์์๋ฐ์ ์ ์๋ ์ผ๋ถ ๊ธฐ๋ณธ ๊ตฌํ์ ์ ๊ณตํ๊ณ ์ถ์ ๋.
- ์๋ธํด๋์ค์ ํน์ ๊ตฌ์กฐ๋ ๋์์ ๊ฐ์ ํด์ผ ํ ๋.
์ธํฐํ์ด์ค: ๊ณ์ฝ ์ ์
์ธํฐํ์ด์ค๋ ํด๋์ค๊ฐ ๊ตฌํํด์ผ ํ ๊ณ์ฝ์ ์ ์ํ๋ ์์ ํ ์ถ์์ ์ธ ํ์ ์ ๋๋ค. ์ด๋ ๊ตฌํํ๋ ํด๋์ค๊ฐ ์ ๊ณตํด์ผ ํ๋ ๋ฉ์๋ ์งํฉ์ ์ง์ ํฉ๋๋ค. ์ถ์ ํด๋์ค์ ๋ฌ๋ฆฌ ์ธํฐํ์ด์ค๋ ์ด๋ค ๊ตฌํ ์ธ๋ถ ์ฌํญ๋ ํฌํจํ ์ ์์ต๋๋ค (Java 8 ์ด์๊ณผ ๊ฐ์ ์ผ๋ถ ์ธ์ด์ default ๋ฉ์๋๋ ์ ์ธ).
์ธํฐํ์ด์ค์ ์ฃผ์ ํน์ง:
- ์ง์ ์ธ์คํด์คํํ ์ ์์ต๋๋ค.
- ์ถ์ ๋ฉ์๋๋ง ํฌํจํ ์ ์์ต๋๋ค (๋๋ ์ผ๋ถ ์ธ์ด์ default ๋ฉ์๋).
- ๋ชจ๋ ๋ฉ์๋๋ ์๋ฌต์ ์ผ๋ก public ๋ฐ abstract์ ๋๋ค.
- ํด๋์ค๋ ์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค (๋ค์ค ์์).
์์ (Java):
// Interface defining a printable object
interface Printable {
void print();
}
// Class implementing the Printable interface
class Document implements Printable {
private String content;
public Document(String content) {
this.content = content;
}
@Override
public void print() {
System.out.println("Printing document: " + content);
}
}
// Another class implementing the Printable interface
class Image implements Printable {
private String filename;
public Image(String filename) {
this.filename = filename;
}
@Override
public void print() {
System.out.println("Printing image: " + filename);
}
}
์ด ์์์ `Printable`์ `print()` ๋ฉ์๋ ํ๋๋ฅผ ๊ฐ์ง ์ธํฐํ์ด์ค์ ๋๋ค. `Document`์ `Image` ํด๋์ค ๋ชจ๋ `Printable` ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ `print()` ๋ฉ์๋์ ์์ฒด์ ์ธ ํน์ ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด `Document`์ `Image` ๊ฐ์ฒด ๋ชจ๋ `Printable` ๊ฐ์ฒด๋ก ์ทจ๊ธํ ์ ์์ด ๋คํ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ:
- ์ฌ๋ฌ ๊ด๋ จ ์๋ ํด๋์ค๊ฐ ๊ตฌํํ ์ ์๋ ๊ณ์ฝ์ ์ ์ํ๊ณ ์ถ์ ๋.
- ๋ค์ค ์์์ ๋ฌ์ฑํ๊ณ ์ถ์ ๋ (์ง์ ์ง์ํ์ง ์๋ ์ธ์ด์์ ์๋ฎฌ๋ ์ด์ ).
- ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํ๊ณ ๋์จํ ๊ฒฐํฉ์ ์ด์งํ๊ณ ์ถ์ ๋.
์ถ์ ํด๋์ค vs ์ธํฐํ์ด์ค: ์์ธ ๋น๊ต
์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค ๋ชจ๋ ์ถ์ํ๋ฅผ ์ํด ์ฌ์ฉ๋์ง๋ง, ์๋ก ๋ค๋ฅธ ์๋๋ฆฌ์ค์ ์ ํฉํ๋๋ก ๋ง๋๋ ํต์ฌ์ ์ธ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
| ํน์ง | ์ถ์ ํด๋์ค | ์ธํฐํ์ด์ค |
|---|---|---|
| ์ธ์คํด์คํ | ์ธ์คํด์คํํ ์ ์์ | ์ธ์คํด์คํํ ์ ์์ |
| ๋ฉ์๋ | ์ถ์ ๋ฉ์๋์ ๊ตฌ์ฒด์ ์ธ ๋ฉ์๋ ๋ชจ๋ ๊ฐ์ง ์ ์์ | ์ถ์ ๋ฉ์๋๋ง ๊ฐ์ง ์ ์์ (๋๋ ์ผ๋ถ ์ธ์ด์ default ๋ฉ์๋) |
| ๊ตฌํ | ๋ถ๋ถ์ ์ธ ๊ตฌํ์ ์ ๊ณตํ ์ ์์ | ๊ตฌํ์ ์ ๊ณตํ ์ ์์ (default ๋ฉ์๋ ์ ์ธ) |
| ์์ | ๋จ์ผ ์์ (ํ๋์ ์ถ์ ํด๋์ค๋ง ์์๋ฐ์ ์ ์์) | ๋ค์ค ์์ (์ฌ๋ฌ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์ ์์) |
| ์ ๊ทผ ์ ์ด์ | ๋ชจ๋ ์ ๊ทผ ์ ์ด์(public, protected, private)๋ฅผ ๊ฐ์ง ์ ์์ | ๋ชจ๋ ๋ฉ์๋๋ ์๋ฌต์ ์ผ๋ก public์ |
| ์ํ (ํ๋) | ์ํ(์ธ์คํด์ค ๋ณ์)๋ฅผ ๊ฐ์ง ์ ์์ | ์ํ(์ธ์คํด์ค ๋ณ์)๋ฅผ ๊ฐ์ง ์ ์์ - ์์(final static)๋ง ํ์ฉ๋จ |
๋์์ธ ํจํด ๊ตฌํ ์์
์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค๊ฐ ์ผ๋ฐ์ ์ธ ๋์์ธ ํจํด์ ๊ตฌํํ๋ ๋ฐ ์ด๋ป๊ฒ ์ฌ์ฉ๋ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1. ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด
ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์ถ์ ํด๋์ค์ ์๊ณ ๋ฆฌ์ฆ์ ๊ณจ๊ฒฉ์ ์ ์ํ์ง๋ง, ์๋ธํด๋์ค๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ํน์ ๋จ๊ณ๋ฅผ ์ ์ํ๋๋ก ํฉ๋๋ค. ์ถ์ ํด๋์ค๋ ์ด ํจํด์ ์ด์์ ์ผ๋ก ์ ํฉํฉ๋๋ค.
์์ (Python):
from abc import ABC, abstractmethod
class DataProcessor(ABC):
def process_data(self):
self.read_data()
self.validate_data()
self.transform_data()
self.save_data()
@abstractmethod
def read_data(self):
pass
@abstractmethod
def validate_data(self):
pass
@abstractmethod
def transform_data(self):
pass
@abstractmethod
def save_data(self):
pass
class CSVDataProcessor(DataProcessor):
def read_data(self):
print("Reading data from CSV file...")
def validate_data(self):
print("Validating CSV data...")
def transform_data(self):
print("Transforming CSV data...")
def save_data(self):
print("Saving CSV data to database...")
processor = CSVDataProcessor()
processor.process_data()
์ด ์์์์ `DataProcessor`๋ ํ ํ๋ฆฟ์ ๋ํ๋ด๋ `process_data()` ๋ฉ์๋๋ฅผ ์ ์ํ๋ ์ถ์ ํด๋์ค์ ๋๋ค. `CSVDataProcessor`์ ๊ฐ์ ์๋ธํด๋์ค๋ ์ถ์ ๋ฉ์๋์ธ `read_data()`, `validate_data()`, `transform_data()`, `save_data()`๋ฅผ ๊ตฌํํ์ฌ CSV ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ํน์ ๋จ๊ณ๋ฅผ ์ ์ํฉ๋๋ค.
2. ์ ๋ต ํจํด
์ ๋ต ํจํด์ ์ผ๋ จ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ํ๊ณ , ๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ์บก์ํํ๋ฉฐ, ์ด๋ค์ ์ํธ ๊ตํ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค. ์ด๋ ์๊ณ ๋ฆฌ์ฆ์ด ์ด๋ฅผ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋ณ๊ฒฝ๋ ์ ์๋๋ก ํฉ๋๋ค. ์ธํฐํ์ด์ค๋ ์ด ํจํด์ ์ ์ด์ธ๋ฆฝ๋๋ค.
์์ (C++):
#include
// Interface for different payment strategies
class PaymentStrategy {
public:
virtual void pay(int amount) = 0;
virtual ~PaymentStrategy() {}
};
// Concrete payment strategy: Credit Card
class CreditCardPayment : public PaymentStrategy {
private:
std::string cardNumber;
std::string expiryDate;
std::string cvv;
public:
CreditCardPayment(std::string cardNumber, std::string expiryDate, std::string cvv) :
cardNumber(cardNumber), expiryDate(expiryDate), cvv(cvv) {}
void pay(int amount) override {
std::cout << "Paying " << amount << " using Credit Card: " << cardNumber << std::endl;
}
};
// Concrete payment strategy: PayPal
class PayPalPayment : public PaymentStrategy {
private:
std::string email;
public:
PayPalPayment(std::string email) : email(email) {}
void pay(int amount) override {
std::cout << "Paying " << amount << " using PayPal: " << email << std::endl;
}
};
// Context class that uses the payment strategy
class ShoppingCart {
private:
PaymentStrategy* paymentStrategy;
public:
void setPaymentStrategy(PaymentStrategy* paymentStrategy) {
this->paymentStrategy = paymentStrategy;
}
void checkout(int amount) {
paymentStrategy->pay(amount);
}
};
int main() {
ShoppingCart cart;
CreditCardPayment creditCard("1234-5678-9012-3456", "12/25", "123");
PayPalPayment paypal("user@example.com");
cart.setPaymentStrategy(&creditCard);
cart.checkout(100);
cart.setPaymentStrategy(&paypal);
cart.checkout(50);
return 0;
}
์ด ์์์์ `PaymentStrategy`๋ `pay()` ๋ฉ์๋๋ฅผ ์ ์ํ๋ ์ธํฐํ์ด์ค์ ๋๋ค. `CreditCardPayment` ๋ฐ `PayPalPayment`์ ๊ฐ์ ๊ตฌ์ฒด์ ์ธ ์ ๋ต์ `PaymentStrategy` ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํฉ๋๋ค. `ShoppingCart` ํด๋์ค๋ `PaymentStrategy` ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ์ ๋ฅผ ์ํํ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ค์ํ ๊ฒฐ์ ๋ฐฉ๋ฒ์ ์ฝ๊ฒ ์ ํํ ์ ์์ต๋๋ค.
3. ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ๊ฐ์ฒด ์์ฑ์ ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ์ง๋ง, ์๋ธํด๋์ค๊ฐ ์ด๋ค ํด๋์ค๋ฅผ ์ธ์คํด์คํํ ์ง ๊ฒฐ์ ํ๋๋ก ํฉ๋๋ค. ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ํตํด ํด๋์ค๋ ์ธ์คํด์คํ๋ฅผ ์๋ธํด๋์ค์ ์์ํ ์ ์์ต๋๋ค. ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค ๋ชจ๋ ์ฌ์ฉ๋ ์ ์์ง๋ง, ๊ณตํต์ ์ธ ์ค์ ์์ ์ด ์๋ค๋ฉด ์ถ์ ํด๋์ค๊ฐ ๋ ์ ํฉํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์์ (TypeScript):
// Abstract Product
interface Button {
render(): string;
onClick(callback: () => void): void;
}
// Concrete Products
class WindowsButton implements Button {
render(): string {
return "";
}
onClick(callback: () => void): void {
// Windows specific click handler
}
}
class HTMLButton implements Button {
render(): string {
return "";
}
onClick(callback: () => void): void {
// HTML specific click handler
}
}
// Abstract Creator
abstract class Dialog {
abstract createButton(): Button;
render(): string {
const okButton = this.createButton();
return `${okButton.render()}`;
}
}
// Concrete Creators
class WindowsDialog extends Dialog {
createButton(): Button {
return new WindowsButton();
}
}
class WebDialog extends Dialog {
createButton(): Button {
return new HTMLButton();
}
}
// Usage
const windowsDialog = new WindowsDialog();
console.log(windowsDialog.render());
const webDialog = new WebDialog();
console.log(webDialog.render());
์ด TypeScript ์์์์ `Button`์ ์ถ์ ์ ํ(์ธํฐํ์ด์ค)์ ๋๋ค. `WindowsButton`๊ณผ `HTMLButton`์ ๊ตฌ์ฒด์ ์ธ ์ ํ์ ๋๋ค. `Dialog`๋ `createButton` ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์ ์ํ๋ ์ถ์ ์์ฑ์(์ถ์ ํด๋์ค)์ ๋๋ค. `WindowsDialog`์ `WebDialog`๋ ์ด๋ค ๋ฒํผ ํ์ ์ ์์ฑํ ์ง ์ ์ํ๋ ๊ตฌ์ฒด์ ์ธ ์์ฑ์์ ๋๋ค. ์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๋ค์ํ ์ ํ์ ๋ฒํผ์ ์์ฑํ ์ ์์ต๋๋ค.
์ถ์ ํด๋์ค ๋ฐ ์ธํฐํ์ด์ค ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค:
- ์์๋ณด๋ค ๊ตฌ์ฑ(Composition)์ ์ ํธํฉ๋๋ค: ์์์ด ์ ์ฉํ ์ ์์ง๋ง, ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ๊ธด๋ฐํ๊ฒ ๊ฒฐํฉ๋๊ณ ์ ์ฐํ์ง ์์ ์ฝ๋๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ง์ ๊ฒฝ์ฐ์ ์์์ ๋์์ผ๋ก ๊ตฌ์ฑ(๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ํฌํจํ๋ ๋ฐฉ์)์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
- ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น์ ์ค์ํฉ๋๋ค: ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ์ง ์๋ ๋ฉ์๋์ ์์กดํ๋๋ก ๊ฐ์ ํด์๋ ์ ๋ฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์๊ตฌ ์ฌํญ์ ํนํ๋ ์ธํฐํ์ด์ค๋ฅผ ์ค๊ณํ์ญ์์ค.
- ๊ณตํต ํ ํ๋ฆฟ ์ ์ ๋ฐ ๋ถ๋ถ ๊ตฌํ ์ ๊ณต์ ์ํด ์ถ์ ํด๋์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ์ฌ๋ฌ ๊ด๋ จ ์๋ ํด๋์ค๊ฐ ๊ตฌํํ ์ ์๋ ๊ณ์ฝ ์ ์๋ฅผ ์ํด ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- ๊น์ ์์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํผํ์ญ์์ค: ๊น์ ๊ณ์ธต ๊ตฌ์กฐ๋ ์ดํดํ๊ณ ์ ์ง๋ณด์ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์๊ณ ์ ์ ์๋ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋ชฉํ๋ก ํ์ญ์์ค.
- ์ถ์ ํด๋์ค ๋ฐ ์ธํฐํ์ด์ค๋ฅผ ๋ฌธ์ํํ์ญ์์ค: ๊ฐ ์ถ์ ํด๋์ค ๋ฐ ์ธํฐํ์ด์ค์ ๋ชฉ์ ๊ณผ ์ฌ์ฉ๋ฒ์ ๋ช ํํ๊ฒ ์ค๋ช ํ์ฌ ์ฝ๋ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํค์ญ์์ค.
๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ
์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ์ํํธ์จ์ด๋ฅผ ์ค๊ณํ ๋๋ ํ์งํ, ๊ตญ์ ํ, ๋ฌธํ์ ์ฐจ์ด์ ๊ฐ์ ์์๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ ์ด๋ฌํ ๊ณ ๋ ค ์ฌํญ์์ ์ญํ ์ ํ ์ ์์ต๋๋ค:
- ํ์งํ (Localization): ์ธํฐํ์ด์ค๋ ์ธ์ด๋ณ ๋์์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ซ์ ํ์, ๋ ์ง ํ์, ํ ์คํธ ๋ฐฉํฅ ๋ฑ์ ์ฒ๋ฆฌํ๋ ๋ค์ํ ์ธ์ด๋ณ ๊ตฌํ์ ๊ฐ์ง `ILanguageFormatter` ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- ๊ตญ์ ํ (Internationalization): ์ถ์ ํด๋์ค๋ ๋ก์ผ์ผ ์ธ์(locale-aware) ์ปดํฌ๋ํธ๋ฅผ ์ํ ๊ณตํต ๊ธฐ๋ฐ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค๋ฅธ ํตํ์ ๋ํ ์๋ธํด๋์ค๋ฅผ ๊ฐ์ง ์ถ์ `Currency` ํด๋์ค๋ฅผ ๊ฐ์ง ์ ์์ผ๋ฉฐ, ๊ฐ ์๋ธํด๋์ค๋ ์์ฒด ํ์ ์ง์ ๋ฐ ๋ณํ ๊ท์น์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ฌธํ์ ์ฐจ์ด: ํน์ ๋์์ธ ์ ํ์ด ๋ฌธํ์ ์ผ๋ก ๋ฏผ๊ฐํ ์ ์๋ค๋ ์ ์ ์ธ์งํ์ญ์์ค. ์ํํธ์จ์ด๊ฐ ๋ค์ํ ๋ฌธํ์ ๊ท๋ฒ๊ณผ ์ ํธ๋์ ๋ง์ถฐ ์กฐ์ ๋ ์ ์๋๋ก ๋ณด์ฅํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ๋ ์ง ํ์, ์ฃผ์ ํ์, ์ฌ์ง์ด ์ ๊ตฌ์ฑํ๋ ๋ฌธํ๋ง๋ค ๋ค๋ฅผ ์ ์์ต๋๋ค.
๊ตญ์ ํ์์ ์์ ํ ๋๋ ๋ช ํํ ์์ฌ์ํต๊ณผ ๋ฌธ์ํ๊ฐ ํ์์ ์ ๋๋ค. ๋ชจ๋ ํ์์ด ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค์ ๋ชฉ์ ๊ณผ ์ฌ์ฉ๋ฒ์ ์ดํดํ๊ณ , ๋ค์ํ ๋ฐฐ๊ฒฝ์ ๊ฐ๋ฐ์๋ค์ด ์ฝ๊ฒ ์ดํดํ๊ณ ์ ์ง๋ณด์ํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๊ฐ ์์ฑ๋์๋์ง ํ์ธํ์ญ์์ค.
๊ฒฐ๋ก
์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ์ถ์ํ, ๋คํ์ฑ, ์ฝ๋ ์ฌ์ฌ์ฉ์ฑ์ ๋ฌ์ฑํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. ์ด๋ค์ ์ฐจ์ด์ , ์ ์ฌ์ , ๊ทธ๋ฆฌ๊ณ ํ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ดํดํ๋ ๊ฒ์ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ์ํํธ์จ์ด ์์คํ ์ ์ค๊ณํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ์ด ๊ฐ์ด๋์ ์ค๋ช ๋ ์์น์ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ ์ฌํญ์ ์ ์คํ๊ฒ ๊ณ ๋ คํ๊ณ ์ ์ฉํจ์ผ๋ก์จ, ์ถ์ ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ฌ ๋์์ธ ํจํด์ ๊ตฌํํ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์๋ฅผ ์ํ ๊ณ ํ์ง ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์์๋ณด๋ค ๊ตฌ์ฑ์ ์ ํธํ๊ณ , ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น์ ์ค์ํ๋ฉฐ, ํญ์ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ์ํด ๋ ธ๋ ฅํ์ญ์์ค.