IMCAT.DEV
로그인 가입
Dart 고급 디자인패턴

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

코드 설명:

  1. Singleton 클래스는 정적 변수를 통해 하나의 인스턴스만 생성합니다.
  2. factory 생성자를 사용하여 인스턴스를 반환합니다.
  3. showMessage 메소드를 호출하여 메시지를 출력합니다.
  4. identical 함수를 사용해 두 인스턴스가 같은지를 확인합니다.
  5. 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();
    }

    주의사항: 상태가 변경될 때, 반드시 옵저버에게 알림을 보내야 합니다.

    6. 정리

  6. 디자인 패턴은 소프트웨어의 재사용성과 유지보수를 높입니다.
  7. 싱글톤, 팩토리 메소드, 옵저버 패턴이 자주 사용되는 패턴입니다.
  8. 인스턴스 관리와 적절한 알림을 주의해야 합니다.
  9. 다음에 학습하면 좋은 주제는 "전략 패턴"과 "데코레이터 패턴"입니다.