Dart Data Class

샤워실의 바보·2024년 3월 24일
0
post-thumbnail
import 'dart:convert';

// 사람 관련 정보를 모델링하기 위한 'Person'이라는 데이터 클래스를 정의합니다.
class Person {
  // Person 클래스의 속성들을 final로 선언합니다.
  final String name;
  final int age;
  final int id;
  final String email;

  // 모든 속성이 초기화될 것을 요구하는 Person 클래스의 생성자입니다.
  Person({
    required this.name,
    required this.age,
    required this.id,
    required this.email,
  });

  // copyWith 메서드: 기존 값으로 지정되지 않은 필드를 사용하여 새로운 Person 객체를 생성할 수 있게 합니다.
  // 수정된 필드를 사용하여 새 Person 객체를 생성합니다.
  Person copyWith({
    String? name,
    int? age,
    int? id,
    String? email,
  }) {
    return Person(
      name: name ?? this.name,
      age: age ?? this.age,
      id: id ?? this.id,
      email: email ?? this.email,
    );
  }

  // toMap 메서드: Person 객체를 Map<String, dynamic>으로 변환합니다.
  // 객체를 저장하거나 전송할 수 있는 형식으로 인코딩하는 데 유용합니다.
  Map<String, dynamic> toMap() {
    return {
      'name': name,
      'age': age,
      'id': id,
      'email': email,
    };
  }

  // fromMap 팩토리 생성자: Map<String, dynamic>에서 Person 객체를 생성합니다.
  // 맵 형식으로 받은 객체 데이터를 디코딩하는 데 유용합니다.
  factory Person.fromMap(Map<String, dynamic> map) {
    return Person(
      name: map['name'] ?? '',
      age: map['age']?.toInt() ?? 0,
      id: map['id']?.toInt() ?? 0,
      email: map['email'] ?? '',
    );
  }

  // toJson 메서드: Person 객체를 JSON 문자열로 변환합니다.
  String toJson() => json.encode(toMap());

  // fromJson 팩토리 생성자: JSON 문자열에서 Person 객체를 생성합니다.
  // JSON 형식으로 받은 데이터에서 객체를 재구성하는 데 도움을 줍니다.
  factory Person.fromJson(String source) => Person.fromMap(json.decode(source));

  // toString 메서드: Person 객체의 문자열 표현을 제공합니다.
  // 디버깅 목적으로 유용합니다.
  
  String toString() {
    return 'Person(name: $name, age: $age, id: $id, email: $email)';
  }

  // 동등성 연산자를 오버라이드하여 Person 객체를 그들의 속성을 기반으로 비교합니다.
  
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
  
    return other is Person &&
        other.name == name &&
        other.age == age &&
        other.id == id &&
        other.email == email;
  }

  // 객체의 속성을 기반으로 해시 코드를 생성하기 위해 hashCode를 오버라이드합니다.
  // 동등성 연산자와 일관성을 유지합니다.
  
  int get hashCode {
    return name.hashCode ^ age.hashCode ^ id.hashCode ^ email.hashCode;
  }
}

제공된 Dart 코드는 Person이라는 데이터 클래스를 정의합니다. 이 클래스는 사람에 대한 정보를 나타내며, name(이름), age(나이), id(식별자), email(이메일)과 같은 속성들을 포함합니다. 각 속성은 final로 선언되어 있어서 인스턴스가 생성된 후에는 변경할 수 없습니다. 클래스의 주요 기능과 특징은 다음과 같습니다:

  1. 생성자: Person 객체를 생성할 때 모든 속성을 필수(required)로 받습니다. 이는 객체가 일관된 상태를 유지하도록 보장합니다.

  2. copyWith 메서드: 객체의 일부만을 변경하여 새로운 Person 객체를 생성할 수 있게 해줍니다. 변경하고자 하는 속성만 인자로 전달하며, 나머지 속성은 기존 객체의 값을 사용합니다.

  3. toMap 메서드: Person 객체를 Map<String, dynamic>으로 변환합니다. 이는 데이터를 NoSQL 데이터베이스에 저장하거나, JSON으로 직렬화하는 과정에서 유용하게 사용될 수 있습니다.

  4. fromMap 팩토리 생성자: Map<String, dynamic>을 받아 Person 객체를 생성합니다. 이는 데이터베이스로부터 데이터를 읽어온 후 객체로 변환할 때 사용됩니다.

  5. toJson 메서드: 객체를 JSON 문자열로 직렬화합니다. toMap 메서드를 이용하여 먼저 Map으로 변환한 뒤, JSON으로 인코딩합니다.

  6. fromJson 팩토리 생성자: JSON 문자열을 받아 이를 디코딩하고, fromMap을 통해 Person 객체를 생성합니다. 이는 네트워크 통신을 통해 받은 JSON 데이터를 객체로 변환할 때 사용됩니다.

  7. toString 메서드: 객체를 문자열로 표현하는 메서드로, 객체의 상태를 쉽게 확인할 수 있게 해줍니다.

  8. 동등성 비교: == 연산자를 오버라이드하여 Person 객체 간에 속성 값이 모두 같을 경우 true를 반환하도록 합니다. hashCode도 오버라이드하여 객체의 동등성 비교 시에 일관된 동작을 보장합니다.

이 클래스는 Dart와 Flutter에서 모델 클래스를 작성할 때 일반적으로 사용되는 패턴을 잘 보여줍니다. 데이터 캡슐화, 객체 불변성, 그리고 JSON 직렬화 및 역직렬화 기능을 제공하여 애플리케이션에서 데이터를 효율적으로 관리할 수 있도록 돕습니다.

profile
공부하는 개발자

0개의 댓글