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을 채택하면 장점이 많은것 같습니다 . 프로젝트의 특성에 따라 달라지겠지만 단순 비교용이라면 이 패키지를 쓰는것이 도움될 거라고 생각듭니다.
오늘도 빡코딩!!