본문 바로가기

Personal Posting/Flutter

Dart/Flutter 프로토타입 디자인 패턴

DALL·E 2025-01-05 00.02.45 생성형 이미지

프로토타입 디자인 패턴이란?
프로토타입 디자인 패턴은 생성(Creational) 디자인 패턴 중 하나로, 기존 객체를 복제(clone) 하여 새로운 객체를 생성하는 방식이다. 이 패턴은 다음과 같은 상황에서 주로 사용된다.

  • 객체 생성 비용이 높은 경우
    네트워크 호출이나 복잡한 초기화 과정이 필요한 객체를 새로 생성하는 대신 복제하여 효율성을 높일 수 있다.
  • 객체의 내부 구조를 보호해야 하는 경우
    외부 코드가 객체의 내부 구현에 의존하지 않고 복제를 수행할 수 있다.
  • 불변 객체(Immutable Object)
    속성이 변경되지 않는 객체를 복제하여 새로운 값을 가진 객체를 생성할 때 유용하다.


프로토타입 디자인 패턴의 장점

  1. 런타임 시 객체 추가 및 제거
    새로운 객체 클래스를 시스템에 추가하려면 프로토타입을 등록하면 된다. 이는 다른 생성 패턴보다 유연하다.
  2. 값 변경으로 새로운 객체 정의
    클래스 정의 없이 속성 값을 변경해 새로운 동작을 정의할 수 있다.
  3. 구조 변경으로 새로운 객체 정의
    복잡한 구조의 객체(예: 부품으로 구성된 객체)를 재사용 가능하게 만들어 효율적으로 관리할 수 있다.
  4. 서브클래싱 감소
    팩토리 메서드 패턴은 클래스 계층 구조를 생성하지만, 프로토타입 패턴은 클론을 통해 이를 대체하여 계층 구조를 단순화할 수 있다.

Dart에서 프로토타입 패턴 구현

1) 가변 객체(Mutable Object) 복제

class Point {
  int y;
  int z;

  Point([this.y, this.z]);
}

final p1 = Point(4, 9);
final p2 = Point(p1.y, p1.z);
final p3 = Point()
  ..y = p1.y
  ..z = p1.z;

 

위 코드처럼 가변 객체를 복제하는 방식은 아래와 같은 단점이 있다.

  • 외부 코드가 Point 클래스의 내부 구조에 강하게 의존한다.
  • Point 클래스가 변경되면 관련된 모든 코드도 수정해야 한다.

이를 개선하기 위해 클래스 자체에서 클론 메서드(clone)를 제공하는 방식이 권장된다.

class Point {
  int y;
  int z;

  Point([this.y, this.z]);

  Point clone() => Point(y, z);
}

final p1 = Point(4, 9);
final p2 = p1.clone();

이 방식은 더 깔끔하며, Point 클래스가 변경되더라도 클론 메서드만 수정하면 되므로 유지보수가 용이하다.

 

2) 불변 객체(Immutable Object) 복제
불변 객체는 속성을 변경할 수 없지만, 복제를 통해 새로운 값을 가진 객체를 생성할 수 있다.

class Point {
  final int y;
  final int z;

  const Point(this.y, this.z);

  Point clone() => Point(y, z);
}

final p1 = Point(4, 9);
final p2 = p1.clone();

하지만 불변 객체에서 특정 속성만 변경하고 싶다면 copyWith() 메서드를 활용할 수 있다.

class Point {
  final int y;
  final int z;

  const Point(this.y, this.z);

  Point copyWith({int? y, int? z}) {
    return Point(
      y ?? this.y,
      z ?? this.z,
    );
  }

  Point clone() => copyWith(y: y, z: z);
}

final p1 = Point(4, 9);
final p2 = p1.copyWith(y: 10); // y만 변경된 새 객체 생성

copyWith() 메서드는 불변 객체를 다룰 때 매우 유용하며, Flutter에서도 자주 사용된다. (예: ThemeData.copyWith()).

 

결론

프로토타입 디자인 패턴은 Dart와 Flutter에서 효율적으로 객체를 생성하고 관리하는 데 중요한 도구이다. 특히 Flutter에서는 테마나 상태 관리 등 다양한 상황에서 활용된다. 이 패턴을 이해하면 다음과 같은 이점이 있다.

 

  • 객체의 내부 구현에 대한 의존도를 줄일 수 있다.
  • 코드 유지 보수가 용이해진다.
  • 불변 데이터 구조와 함께 사용할 때 유연성이 더 높아진다.

 

따라서 Dart와 Flutter 프로젝트에서 프로토타입 디자인 패턴을 적절히 활용하면 더 나은 성능과 코드 품질을 기대할 수 있다.


아래 링크의 포스팅을 참고하여 정리한 내용입니다. 원문을 확인하고 싶으시면 아래 링크를 확인해주세요.
출처 - https://flutterexperts.com/prototype-design-patterns-for-dart-flutter/