학습
Dart 고급 디자인 패턴
Dart 고급 디자인 패턴 — 고급
고급 디자인 패턴
1. 도입 (왜 배워야 하는가)
디자인 패턴은 소프트웨어 개발에서 자주 발생하는 문제를 해결하기 위한 재사용 가능한 솔루션입니다. 고급 디자인 패턴은 복잡한 시스템을 효율적으로 관리하고 유지보수할 수 있는 방법을 제공합니다. 실무에서는 대규모 애플리케이션을 개발할 때 코드의 재사용성과 가독성을 높이며, 팀원 간의 협업을 원활하게 합니다. 이러한 패턴을 모르면 코드가 복잡해지고, 유지보수가 어려워져 버그가 발생할 확률이 높아지며, 개발 속도가 느려질 수 있습니다.
2. 핵심 개념 설명
디자인 패턴 정의
디자인 패턴은 특정 문제를 해결하기 위한 일반적인 해결책을 제공하는 템플릿입니다. 고급 디자인 패턴은 복잡한 소프트웨어 아키텍처에서 유용하게 사용됩니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| 객체지향 프로그래밍 | 객체를 사용하여 프로그램을 설계하는 방법 |
| 캡슐화 | 객체의 상태를 숨기고, 메소드를 통해 접근하는 원칙 |
| 상속 | 기존 클래스의 속성과 메소드를 재사용하여 새로운 클래스를 만드는 방법 |
| 다형성 | 같은 인터페이스를 통해 서로 다른 객체를 처리할 수 있는 기능 |
3. 기본 코드 예제
아래는 싱글톤 패턴의 기본적인 사용법을 보여주는 코드입니다. 싱글톤 패턴은 클래스의 인스턴스가 오직 하나만 존재해야 할 때 사용됩니다.
class Singleton {
static final Singleton _instance = Singleton._internal();
factory Singleton() {
return _instance;
}
Singleton._internal();
void showMessage() {
print("Hello from Singleton!");
}
}
void main() {
var singleton1 = Singleton();
var singleton2 = Singleton();
singleton1.showMessage();
print(identical(singleton1, singleton2)); // true
}
실행 결과:
Hello from Singleton!
true
코드 설명:
Singleton클래스는 정적 변수를 통해 하나의 인스턴스만 생성합니다.factory생성자를 사용하여 인스턴스를 반환합니다.showMessage메소드를 호출하여 메시지를 출력합니다.identical함수를 사용해 두 인스턴스가 같은지를 확인합니다.- 디자인 패턴은 소프트웨어의 재사용성과 유지보수를 높입니다.
- 싱글톤, 팩토리 메소드, 옵저버 패턴이 자주 사용되는 패턴입니다.
- 인스턴스 관리와 적절한 알림을 주의해야 합니다.
- 다음에 학습하면 좋은 주제는 "전략 패턴"과 "데코레이터 패턴"입니다.
4. 실전 활용 예제
1. 팩토리 메소드 패턴
쇼핑몰에서 상품 객체를 생성할 때, 상품 종류에 따라 다르게 생성되도록 할 수 있습니다.
abstract class Product {
void use();
}
class ConcreteProductA implements Product {
@override
void use() {
print("Using Product A");
}
}
class ConcreteProductB implements Product {
@override
void use() {
print("Using Product B");
}
}
abstract class Creator {
Product factoryMethod();
}
class ConcreteCreatorA extends Creator {
@override
Product factoryMethod() {
return ConcreteProductA();
}
}
class ConcreteCreatorB extends Creator {
@override
Product factoryMethod() {
return ConcreteProductB();
}
}
void main() {
Creator creatorA = ConcreteCreatorA();
Product productA = creatorA.factoryMethod();
productA.use(); // Using Product A
Creator creatorB = ConcreteCreatorB();
Product productB = creatorB.factoryMethod();
productB.use(); // Using Product B
}
2. 옵저버 패턴
주식 시장에서 여러 투자자가 주식 가격 변화를 실시간으로 알림 받을 때 사용됩니다.
class Stock {
String _name;
double _price;
List<Observer> _observers = [];
Stock(this._name, this._price);
void addObserver(Observer observer) {
_observers.add(observer);
}
void removeObserver(Observer observer) {
_observers.remove(observer);
}
void notifyObservers() {
for (var observer in _observers) {
observer.update(_name, _price);
}
}
void setPrice(double price) {
_price = price;
notifyObservers();
}
}
abstract class Observer {
void update(String stockName, double price);
}
class Investor implements Observer {
String name;
Investor(this.name);
@override
void update(String stockName, double price) {
print("$name: $stockName price updated to $price");
}
}
void main() {
Stock google = Stock("Google", 1000);
Investor investor1 = Investor("Alice");
Investor investor2 = Investor("Bob");
google.addObserver(investor1);
google.addObserver(investor2);
google.setPrice(1050); // Alice: Google price updated to 1050
// Bob: Google price updated to 1050
}
5. 흔한 실수와 주의사항
1. 제대로 된 인스턴스 관리 실패
잘못된 코드:
var instance1 = Singleton();
var instance2 = Singleton();
올바른 코드:
var instance1 = Singleton();
주의사항: 싱글톤 패턴은 인스턴스를 여러 번 생성하지 않도록 주의해야 합니다.
2. 옵저버 패턴에서 누락된 알림
잘못된 코드:
void setPrice(double price) {
_price = price;
// notifyObservers()가 누락됨
}
올바른 코드:
void setPrice(double price) {
_price = price;
notifyObservers();
}
주의사항: 상태가 변경될 때, 반드시 옵저버에게 알림을 보내야 합니다.