Mobile/Dart

[Dart] Equatable 뽀개기

펭귄알 2024. 10. 7. 15:24

이전에 Swift에서는 Equatable 프로토콜을 기본으로 지원해주었는데, Dart에서는 pub으로 제공되어있습니다. 객체를 비교하는 방법에는 Equatable을 사용하는 방법도 있다는것을 소개해보겠습니다.(다른 강의에서도 많이 사용함)

 

 

Equatable을 사용하는 이유?

Dart에서 객체를 비교할 수 있으려면 종종 == 연산자와 hashCode를 재정의해야 합니다.
이 과정은 번거롭고 지루할 뿐만 아니라, 이를 올바르게 수행하지 않으면 코드가 비효율적이거나 예상대로 동작하지 않을 수 있습니다.

 

Equatable의 역할은?

Equatable을 사용하면 == 연산자와 hashCode를 직접 오버라이드할 필요 없이 객체 비교를 간편하게 처리할 수 있습니다. 이 덕분에 보일러플레이트 코드를 많이 작성하는 데 시간을 낭비하지 않아도 됩니다.
물론 보일러플레이트 코드를 생성해주는 다른 패키지도 있지만, 그 역시 이상적이지는 않습니다. 이런 경우 코드 생성 단계를 거쳐야 하므로 여전히 번거로울 수 있습니다.
Equatable은 코드 생성을 필요로 하지 않기 때문에, 지루한 작업을 줄이고 애플리케이션 개발에 더 집중할 수 있게 해줍니다. Equatable을 사용하면 객체 비교 로직에 대해 신경 쓰지 않고 더 나은 애플리케이션 개발에 시간을 쏟을 수 있는 것이 장점입니다.

 

공식문서에서는 위와같이 개요와 역할을 설명해주고 있습니다.

 

Equatable을 사용하지 않을 경우

Dart 언어에서는 기본으로 제공하는 operator 라는 함수에 정의가 되어있고 이를 override 를 함으로서 값의 비교를 자유롭게 할 수 있습니다.

 

equatable을 사용하지않을 경우 ==연산자와 hashcode를 override를 하여 비교하는 로직을 수기로 작성해야합니다.

 

 

 

2. == 연산자 작성

 

hashcode를 override하면 == 연산자를 구현하지않았다며 알려줍니다.

 

구현한 내용

class Book {
  final String id;
  final String name;
  
  Book(this.id, this.name);
  
  @override
  int get hashCode => id.hashCode;

  @override
  bool operator ==(Object other) {
    // TODO: implement ==
    return other is Book && other.id == id;
  }
}

 

Equatable을 사용할 경우

class Book extends Equatable {
  final String id;
  final String name;

  Book(this.id, this.name);

  @override
  List<Object> get props => [id, name];
}

 

props 속성

Equatable은 props라는 속성을 사용하여 객체 비교 시 고려할 필드들을 정의합니다. props는 리스트 형태로 제공되며, 이 리스트에 포함된 값들을 기반으로 두 객체가 동일한지 자동으로 판단합니다.

 

예시)

같은 객체일 경우:

void main() {
  final book1 = Book('1', "Go Home");
  final book2 = Book('1', "Go Home");

  print(book1 == book2); // true
}
 

다른 객체일 경우:

void main() {
  final book1 = Book('1', "Go Home");
  final book2 = Book('2', "Go Home");

  print(book1 == book2); // false
}

 

Equatable의 장점

  • 간편한 객체 비교: 객체의 모든 속성을 일일이 비교할 필요 없이 간단하게 리스트로 지정할 수 있습니다.
  • 코드 간소화: == 연산자와 hashCode를 직접 작성할 필요가 없어 보일러플레이트 코드를 줄일 수 있습니다.
  • 유지보수 용이: 속성만 추가하면 되므로 유지보수가 쉬워집니다.

객체에서 특정값이 같은지 다른지 비교하는 경우에는 Equatable을 채택하면 장점이 많은것 같습니다 . 프로젝트의 특성에 따라 달라지겠지만 단순 비교용이라면 이 패키지를 쓰는것이 도움될 거라고 생각듭니다.

 

오늘도 빡코딩!!