๐Ÿ’ป ๊ฐœ๋ฐœ/Flutter

[Flutter / Dart] What is Equatable?

2022. 8. 6. 11:32

๋ธ”๋กœ๊ทธ ๋‚ด์˜ ๊ฒŒ์‹œ๋ฌผ์€ PC ๋ฒ„์ „์— ์ตœ์ ํ™” ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ค๋Š˜์€ Equatable์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. BLoC์— ๋Œ€ํ•œ ๊ธ€์„ ์“ฐ๊ธฐ ์ „์— BLoC์—์„œ ์‚ฌ์šฉํ•˜๋Š” Equatable์— ๋Œ€ํ•œ ์ •๋ฆฌ๊ฐ€ ์šฐ์„ ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ๋ณธ๋ก ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ณด์ฃ !

 

์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

class Person {
  final int pid;
  final String name;
  final int age;

  Person(this.pid, this.name, this.age);
}


void main() {
  Person p1 = new Person(20221234, "kodo", 25);
  Person p2 = new Person(20221234, "kodo", 25);
  
 (p1 == p2) ? print("same") : print("diff");
}

Person ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ๋‘ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์›๋ฒˆํ˜ธ, ์ด๋ฆ„, ๋‚˜์ด๊ฐ€ ๊ฐ™์€ ๋‘ ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‘ ์ธ์Šคํ„ด์Šค๋ฅผ ๋น„๊ตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ™๋‹ค๋ฉด same์„ ์ถœ๋ ฅํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด diff๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌด์—‡์ด ์ถœ๋ ฅ๋ ๊นŒ์š”?

 

์ •๋‹ต์€ diff ์ž…๋‹ˆ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ์š”? ๊ฐ™์€ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€์ง€๋งŒ new ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ–ˆ๊ธฐ์— ์„œ๋กœ ๋‹ค๋ฅธ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์–ด๋–ป๊ฒŒํ•˜๋ฉด same์„ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

 

์šฐ์„  ๊ฐ„๋‹จํ•˜๊ฒŒ main์—์„œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๋น„๊ตํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

class Person {
  final int pid;
  final String name;
  final int age;

  Person(this.pid, this.name, this.age);
}


void main() {
  Person p1 = new Person(20221234, "kodo", 25);
  Person p2 = new Person(20221234, "kodo", 25);
  
 (p1.pid == p2.pid) ? print("same") : print("diff");
}

ํ•˜์ง€๋งŒ pid๋ฅผ ์ง์ ‘ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ์š”?

 

== ์—ฐ์‚ฐ์ž๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ๊ฐ™์œผ๋ฉด ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ผ๋Š” ๊ฒƒ์„ ๋‚˜ํƒ€๋‚ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

class Person {
  final int pid;
  final String name;
  final int age;

  Person(this.pid, this.name, this.age);

  @override
  bool operator ==(Object other) {
    return other is Person && other.pid == this.age;
  }
}

void main() {
  Person p1 = new Person(20221234, "kodo", 25);
  Person p2 = new Person(20221234, "kodo", 25);

  (p1.pid == p2.pid) ? print("same") : print("diff");
}

๋๋‚ฌ์Šต๋‹ˆ๋‹ค! ์—ฌ๊ธฐ๊นŒ์ง€ ์ž˜ ๋”ฐ๋ผ์˜ค์…จ๋‹ค๋ฉด Equatable์€ ์™„๋ฒฝํžˆ ์ดํ•ดํ•˜์‹  ๊ฒ๋‹ˆ๋‹ค. ๐Ÿ‘๐Ÿ‘ (๋ฒŒ์จ์š”?)

 

Equatable

์„œ๋ก ์ด ๊ธธ์—ˆ์ง€๋งŒ ์˜ค๋Š˜ ์–˜๊ธฐํ•  Equatable์€ ์ธ์Šคํ„ด์Šค์˜ ๋น„๊ต๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค. ์šฐ์„  Equatable์˜ ์ฝ”๋“œ๋Š” ์ด๋ ‡๊ฒŒ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

@immutable
abstract class Equatable {
  /// {@macro equatable}
  const Equatable();

  /// {@template equatable_props}
  /// The list of properties that will be used to determine whether
  /// two instances are equal.
  /// {@endtemplate}
  List<Object?> get props;

  /// {@template equatable_stringify}
  /// If set to `true`, the [toString] method will be overridden to output
  /// this instance's [props].
  ///
  /// A global default value for [stringify] can be set using
  /// `EquatableConfig.stringify`.
  ///
  /// If this instance's [stringify] is set to null, the value of
  /// `EquatableConfig.stringify` will be used instead. This defaults to
  /// `false`.
  /// {@endtemplate}
  // ignore: avoid_returning_null
  bool? get stringify => null;

  @override
  bool operator ==(Object other) =>
      identical(this, other) ||
      other is Equatable &&
          runtimeType == other.runtimeType &&
          equals(props, other.props);

  @override
  int get hashCode => runtimeType.hashCode ^ mapPropsToHashCode(props);

  @override
  String toString() {
    switch (stringify) {
      case true:
        return mapPropsToString(runtimeType, props);
      case false:
        return '$runtimeType';
      default:
        return EquatableConfig.stringify == true
            ? mapPropsToString(runtimeType, props)
            : '$runtimeType';
    }
  }
}

props๋ฅผ ๋น„๊ตํ•˜์—ฌ ๋‘ ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ™์€์ง€๋ฅผ ํŒ๋ณ„ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ props๋กœ hashcode๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. hashcode์˜ ๊ฒฝ์šฐ ๋™์ผํ•œ key๋กœ ์ค‘๋ณต ์ €์žฅ๋  ์ˆ˜ ์—†๋Š” Map๊ณผ Set์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

Equatable์„ ์ƒ์†ํ•˜๋Š” Person ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  props์˜ getter๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋ฉด ๋์ž…๋‹ˆ๋‹ค!

import 'package:equatable/equatable.dart';

class Person extends Equatable {
  final int pid;
  final String name;
  final int age;

  Person(this.pid, this.name, this.age);
  
  @override
  List<Object?> get props => [this.pid];
}

void main() {
  Person p1 = new Person(20221234, "kodo", 25);
  Person p2 = new Person(20221234, "kodo", 25);

  (p1.pid == p2.pid) ? print("same") : print("diff");
}

 

๊ทธ๋ ‡๋‹ค๋ฉด ์™œ BLoC์— ํ•„์š”ํ•œ๊ฑฐ์ฃ ?

BLoC์—์„œ๋Š” Event๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด State๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ๋„๋ก Mapping์„ ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ State๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  State์— ๋งž๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๊ฐ๊ฐ์˜ Event์™€ State๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋„๋ก Equatable์„ ์ƒ์†๋ฐ›์•„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'๐Ÿ’ป ๊ฐœ๋ฐœ > Flutter' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Flutter] ModalBottomSheet๊ฐ€ ํ‚ค๋ณด๋“œ์— ์˜ํ•ด ๊ฐ€๋ ค์ง€๋Š” ํ˜„์ƒ  (0) 2022.08.09
[Flutter] BLoC ํŒจํ„ด์œผ๋กœ ์ž๋™ ๋กœ๊ทธ์ธ, Splash Screen ๊ตฌํ˜„ํ•˜๊ธฐ - 1  (0) 2022.07.26
[Flutter / Dart] What is Singleton?  (0) 2022.07.21
[Flutter] SingleChildScrollView, ListView, ListView.bulider  (1) 2021.08.18
4. Column, Row, Expanded  (0) 2021.08.18
'๐Ÿ’ป ๊ฐœ๋ฐœ/Flutter' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Flutter] ModalBottomSheet๊ฐ€ ํ‚ค๋ณด๋“œ์— ์˜ํ•ด ๊ฐ€๋ ค์ง€๋Š” ํ˜„์ƒ
  • [Flutter] BLoC ํŒจํ„ด์œผ๋กœ ์ž๋™ ๋กœ๊ทธ์ธ, Splash Screen ๊ตฌํ˜„ํ•˜๊ธฐ - 1
  • [Flutter / Dart] What is Singleton?
  • [Flutter] SingleChildScrollView, ListView, ListView.bulider
kodo_o
kodo_o
iOS ๊ฟ€์žผ!
kodo_o
๐ŸŽ๐Ÿ
kodo_o
์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (149)
    • ๐Ÿ”จ ํ”„๋กœ์ ํŠธ (0)
      • TP 1 (0)
      • WhiteHCCTV (0)
      • FootPrint (0)
    • ๐Ÿ’ป ๊ฐœ๋ฐœ (63)
      • iOS (30)
      • Android (6)
      • Kotlin (4)
      • Flutter (9)
      • Node.js (5)
      • Architecture (1)
      • ์˜ค๋Š˜์˜ ์‚ฝ์งˆ (7)
      • ์—๋Ÿฌ์™€์˜ ๋™์นจ (1)
    • โœ๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (6)
      • Graph (6)
      • String (0)
      • Sort (0)
    • โœ๏ธ ์ฝ”ํ…Œ ์ค€๋น„ (44)
      • Math (1)
      • Implementation (3)
      • String (3)
      • Brute Force (5)
      • Back Tracking (7)
      • Greedy (0)
      • Dynamic Programming (13)
      • Binary Search (1)
      • DFS, BFS (5)
      • Shortest Path (2)
      • Two Pointer (4)
      • MST (0)
    • ๐Ÿ“š CS (6)
      • Operating System (6)
    • โ›น๏ธ ๋ผ์ดํ”„ (30)
      • 2020 ๊ฒจ์šธ๋ฐฉํ•™ ๋ชจ๊ฐ์ฝ”(๊ฐœ์ธ) (12)
      • 2021 ์—ฌ๋ฆ„๋ฐฉํ•™ ๋ชจ๊ฐ์ฝ”(๊ฐœ์ธ) (6)
      • ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ (1)
      • ํšŒ๊ณ  (10)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ๊นƒํ—ˆ๋ธŒ

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

hELLO ยท Designed By ์ •์ƒ์šฐ.
kodo_o
[Flutter / Dart] What is Equatable?
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.