Flutter로 애플리케이션을 개발할 때, 데이터 모델을 정의하고 이를 기반으로 다양한 기능을 구현하는 일이 많습니다. 이 과정에서, 객체 간의 비교를 올바르게 처리하는 것은 매우 중요한 작업입니다. 특히, 리스트 내에서 특정 객체를 찾거나 비교할 때, 객체의 동일성을 판단하는 기준이 필요합니다. 그렇지 않으면, 동일한 데이터를 가진 객체임에도 불구하고 서로 다른 객체로 인식되는 문제가 발생할 수 있습니다.
이 글에서는 CmmncdInfo 클래스를 예로 들어, Flutter에서 객체 비교를 위한 == 연산자와 hashCode를 재정의하는 방법과 그 중요성에 대해 알아보겠습니다.
기본적으로 Dart의 객체 비교는 두 객체가 동일한 메모리 주소를 가리킬 때만 동일한 객체로 간주합니다. 하지만, 데이터 모델 객체의 경우, 동일한 데이터를 갖고 있다면 같은 객체로 간주하는 것이 더 바람직합니다. 예를 들어, 리스트에서 특정 조건을 만족하는 객체를 찾거나, 두 리스트 간의 중복 요소를 찾을 때, 이러한 객체 비교가 필요합니다.
우선, CmmncdInfo라는 클래스를 정의합니다. 이 클래스는 여러 속성을 가질 수 있지만, 이번 예제에서는 cmmncdNm이라는 하나의 속성만을 포함한 간단한 형태로 정의해 보겠습니다.
class CmmncdInfo {
String? cmmncdNm;
CmmncdInfo({
this.cmmncdNm,
// ... other properties
});
// Implement equality operator
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
return other is CmmncdInfo && other.cmmncdNm == cmmncdNm;
}
// Implement hashCode
@override
int get hashCode => cmmncdNm.hashCode;
}
== 연산자를 재정의함으로써, 동일한 데이터를 가진 객체가 동일한 것으로 인식되도록 할 수 있습니다. 위 코드에서 operator ==를 재정의하여, CmmncdInfo 객체의 cmmncdNm 속성이 같다면 동일한 객체로 간주합니다.
identical(this, other): 두 객체가 동일한 메모리 주소를 가리키는지 확인합니다. 이 경우, 별도의 속성 비교 없이 true를 반환합니다.
other is CmmncdInfo && other.cmmncdNm == cmmncdNm: 만약 두 객체가 서로 다른 메모리 주소를 가지고 있지만, CmmncdInfo 타입이고 cmmncdNm 값이 같다면 동일한 객체로 판단합니다.
hashCode는 Dart의 해시 기반 컬렉션(예: Set이나 Map)에서 객체의 고유 식별자로 사용됩니다. hashCode는 객체를 식별하기 위한 정수값을 반환하며, == 연산자가 true를 반환하는 경우 동일한 hashCode를 반환해야 합니다. 따라서 hashCode를 cmmncdNm의 해시값으로 설정하여, 동일한 이름을 가진 객체들이 같은 hashCode를 가지도록 합니다.
@override
int get hashCode => cmmncdNm.hashCode;
이제 CmmncdInfo 클래스를 사용하여 객체 비교를 올바르게 수행할 수 있습니다. 예를 들어, 리스트 내에서 특정 조건을 만족하는 객체를 찾거나, 리스트 간의 중복된 객체를 쉽게 탐지할 수 있습니다.
void main() {
var info1 = CmmncdInfo(cmmncdNm: "Code1");
var info2 = CmmncdInfo(cmmncdNm: "Code1");
print(info1 == info2); // true
print(info1.hashCode == info2.hashCode); // true
var list = [info1];
print(list.contains(info2)); // true
}
객체 비교는 Flutter 개발에서 매우 중요한 작업입니다. 특히, 동일한 데이터를 가진 객체를 같은 객체로 인식하도록 하기 위해서는 == 연산자와 hashCode를 올바르게 재정의하는 것이 필수적입니다. 이 블로그에서 소개한 방법을 통해, 데이터 모델 클래스 간의 객체 비교를 보다 정확하게 수행하고, 리스트, 세트 등에서의 동작을 보다 신뢰할 수 있게 만들 수 있습니다.
CmmncdInfo와 같은 클래스에서 이러한 연산자들을 재정의하면, 애플리케이션의 데이터 처리 로직이 더욱 견고해지고 예기치 않은 오류를 방지할 수 있습니다. 이 방법을 여러분의 프로젝트에 적용해 보세요!