[Flutter]Equatable

한상욱·2023년 10월 28일
0

Flutter

목록 보기
1/26
post-thumbnail

들어가며

OOP에서 기본적으로 객체는 가장 기본적인 요소입니다. 이러한 객체의 == 여부를 아주 쉽게 판단할 수 있는 Equatable 플러그인에 대해서 알아보겠습니다.

객체의 동일성 판단

Equatable은 Flutter 외에도 많은 곳에 존재합니다. kotlin에서는 data class를 이용하여 손쉽게 해결하나, Dart는 그러한 class는 존재하지 않아요. 그래서 Equatable 플러그인을 상속하여 사용합니다

그전에, Equatable은 왜 사용해야 하며 왜 사용하면 편리한지 예제를 통해 알아보겠습니다.

void main() {

}

class Todo {
  final int id;
  final String todo;
  final bool isDone;

  Todo({
    required this.id,
    required this.todo,
    required this.isDone,
  });
}

여기에 Todo 클래스가 있습니다. 이 클래스를 통해서 두개의 객체를 생성하겠습니다. 각각 todo1, todo2라고 명명지을것이고 프로퍼티는 동일하게 부여하겠습니다.

void main() {
  Todo todo1 = Todo(id: 1, todo: "축구", isDone: false);
  Todo todo2 = Todo(id: 1, todo: "축구", isDone: false);
  print(todo1 == todo2);
}

class Todo {
  final int id;
  final String todo;
  final bool isDone;

  Todo({
    required this.id,
    required this.todo,
    required this.isDone,
  });
}

>> false

이러한 경우 두 객체는 서로 동일한 프로퍼티를 가지고 있지만, 컴퓨터는 두개의 객체를 비교하면 false를 출력하게 됩니다. 왜냐면 객체는 기본적으로 할당된 메모리 위치에 기반하여 비교를 수행하기 때문이죠. 두 객체는 서로 동일한 프로퍼티를 가지고 있더라도, 할당된 메모리공간이 다르기 때문에 다르다는 결과가 나타납니다. 그렇다면 프로퍼티가 같으면 같다고 판단할 수 있는 방법이 있을까요?

네, 그렇습니다. operator 함수와 hashCode 함수를 오버라이딩하여 재정의하면 그렇게할 수 있습니다.

void main() {
  Todo todo1 = Todo(id: 1, todo: "축구", isDone: false);
  Todo todo2 = Todo(id: 1, todo: "축구", isDone: false);
  print(todo1 == todo2);
}

class Todo {
  final int id;
  final String todo;
  final bool isDone;

  Todo({
    required this.id,
    required this.todo,
    required this.isDone,
  });

  
  bool operator ==(Object other) {
    return other is Todo && other.id == this.id;
  }

  
  int get hashCode {
    return this.id;
  }
}

>> true

operator == 은 기본적으로 메모리위치를 비교하는 방식입니다. 여기에 id가 같으면 같다는 조건을 덧붙이고, 이렇게 operator를 재정의하면 hashCode도 재정의해야합니다.

근데, 만약 프로퍼티가 3개가 아니라 20개, 30개가 된다면 어떨까요? 속성하나하나 비교하기엔 굉장히 힘들겠죠. 그것을 간편하게 해주는 플러그인이 바로 Equatable입니다.

Eqautable

Eqautable은 pub.dev사이트에서 굉장히 있기있는 플러그인 중 하나입니다.

그러면 Equatable로 어떻게 동일성을 판별하는지 알아보겠습니다.

void main() {
  Todo todo1 = Todo(id: 1, todo: "축구", isDone: false);
  Todo todo2 = Todo(id: 1, todo: "축구", isDone: false);
  print(todo1 == todo2);
}

class Todo extends Equatable{
  final int id;
  final String todo;
  final bool isDone;

  Todo({
    required this.id,
    required this.todo,
    required this.isDone,
  });
  
  
  List<Object> get props => [this.id];
}

>> true

Equatable을 사용하기 위해서 적용할 class에 상속시켜줍니다. 그렇게 되면 에러가 표시되는데요. props를 반드시 오버라이딩해줘야 합니다. props는 비교를 수행할 프로퍼티를 입력받는 배열이 있어요. 해당 배열에 비교를 수행할 프로퍼티를 적용시키면 됩니다. 위에서는 id가 같으면 동일하게 취급하게끔 작성했습니다. 되게 간단하죠?

profile
자기주도적, 지속 성장하는 모바일앱 개발자가 되기 위해

0개의 댓글