Equatable
Equatable 플러그인은 한 인스턴스와 다른 인스턴스가 같은 인스턴스인지 판단을 쉽게 할 수 있게 해주는 라이브러리이다. 자바, 루비와 같은 객체 지향 언어를 사용해본 사람은 알겠지만, 객체의 비교는 기본적으로 메모리 베이스다. 같은 필드 값들을 가진 객체라도 할당된 메모리 값이 다르기 때문에 == 연산자로 비교하면 False가 나온다. 그렇기 때문에 객체 지향 언어에서는 비교를 할 때 비교의 기준을 제공해주는 함수를 override하고 hashMap을 정의해 각 객체 키의 해시 방법을 정한다.
Operator 함수 override 하기
class Person {
final int id;
final String name;
final int age;
Person({
required this.id,
required this.name,
required this.age,
});
@override
bool operator ==(Object other) {
return other is Person && other.id == this.id;
}
@override
int get hashCode {
return this.id;
}
}
위와같이 Person 클래스를 제작하면 id 를 기반으로 Person 클래스의 인스턴스들을 비교할 수 있다.
final person1 = Person(id: 1, name: 'Code Factory', age: 99);
final person2 = Person(id: 1, name: 'Code Factory 2', age: 99);
print(person1 == person2);
위 코드에서 person1 과 person2 는 같다는 결과가 나온다. name 이나 age 파라미터를 어떻게 바꿔도 Person 클래스는 id 값으로만 비교하게 operator == 함수를 정의했기 때문이다.
hashcode 함수
Hashcode 는 Map 또는 Set 에서 객체의 키를 정의한다. Map 이나 Set 은 키가 중복으로 저장될 수 없기 때문에 Set 이나 Map 의 키로 객체가 저장되었을 때 이 키에 의해서 각 객체를 식별한다. 아래 Person 클래스에서는 id 를 기반으로 키값을 정의하였기 때문에 person1 과 person2 를 map 에 넣어도 map 의 길이는 1로 나오게 된다.
final person1 = Person(id: 1, name: 'Code Factory', age: 99);
final person2 = Person(id: 1, name: 'Code Factory 2', age: 99);
final map = {
person1: true,
person2: true,
};
print(map.length);
Equatable 이 필요한 이유
지금 Person 클래스는 id 만을 사용해서 operator == 과 hashcode 메소드를 정의하고 있습니다. 하지만 만약에 모든 값들을 비교 범위에 포함시키고싶으면 어떻게 해야 할까?
class Person {
final int id;
final String name;
final int age;
Person({
required this.id,
required this.name,
required this.age,
});
@override
bool operator ==(Object other) {
return other is Person && other.id == this.id
&& other.name == this.name
&& other.age == this.age;
}
@override
int get hashCode {
return this.id;
}
}
이런식으로 operator == 메소드를 변경해야한다. 파라미터가 많아질수록 코드도 길어진다. 게다가 String 같은 int 로 환산되기 어려운 값들은 정확하게 정의하기에 모호하다.
이 문제를 해결해주는게 바로 Equatable 라이브러리다.
사용법
Equatable 이 왜 필요한지 이해만 하고나면 Equatable 함수의 사용법은 상당히 쉽다. Equatable 클래스를 상속을 받고 props 라는 메소드를 override 하면 된다. props 메소드는 리스트를 받게되는데 이 리스트에 들어가는 모든 값들의 조합이 operator == 과 hashcode 함수를 생성하는데 사용된다.
class Person extends Equatable{
final int id;
final String name;
final int age;
Person({
required this.id,
required this.name,
required this.age,
});
@override
List<Object> get props => [this.id, this.name, this.age];
}
코드가 굉장히 간소화 됐다. 이제 아래를 보면 예상하는 값들이 나오는걸 볼 수 있다.
final person1 = Person(id: 1, name: 'Code Factory', age: 99);
final person2 = Person(id: 1, name: 'Code Factory 2', age: 99);
final person3 = Person(id: 1, name: 'Code Factory', age: 99);
/// False
print(person1 == person2);
/// True
print(person1 == person3);
'App > Flutter' 카테고리의 다른 글
Flutter로 어떤 UI든 구현하는 방법 (0) | 2024.03.21 |
---|---|
Flutter Bloc과 Cubit (0) | 2024.03.21 |
Flutter TypeAdapter로 Hive DataBase 사용하기 (1) | 2024.03.18 |
Flutter ensureInitialized() 언제, 왜 호출해야 하는가? (0) | 2024.03.18 |
Flutter 개발 환경 설정 (vscode) (0) | 2024.03.17 |