728x90
Operator ==
oop라는 명칭이 생겨난 이유는 모든 클래스가 기본적으로 object를 extend 하기 때문이다.
Object라는 최상위 클래스가 제공해주는 모든 파라미터들을 모든 클래스들이 사용할 수 있다는 의미다.
대부분의 언어에서는 이 Object라는 클래스에 A 인스턴스와 B 인스턴스를 비교하는 알고리즘이 정의되어 있다.
Dart 에서는 operator라는 함수에 정의 되어있고, 이를 override 함으로써 값 비교 알고리즘을 자유롭게 변경할 수 있다.
Hash Code
hashcode 함수는 Map 또는 Set에서 키의 역할을 하게 된다.
Map이나 Set은 키가 중복으로 저장될 수 없기 떄문에 Set, Map의 키로 Object가 저장되었을 때 어떻게 키값을 정의할지가 중요하다.
프로퍼티(변수)가 늘어나면 늘어날수록 operator와 hashcode를 작성하는것이 귀찮아진다.
dart에서는 equatable클래스를 상속받아 이 문제를 해결하고 있다.
Equatable 클래스를 상속받고 props 라는 메소드를 override 해주면 된다.
import 'package:equatable/equatable.dart';
class A extends Equatable {
// Equatable 패키지는 불변 객체를 전제로 설계되었다.
final int a;
final int b;
const A({
required this.a,
required this.b,
});
@override
List<Object?> get props => [this.a, this.b];
// Equatable 클래스를 상속을 받고
// props 라는 메소드를 override 해주면 된다.
// props는 비교시 사용하고 싶은 속성을 배열로 반환해주면 된다.
}
void main() {
final a1 = A(a:88, b:53);
final a2 = A(a:88, b:53);
print(a1 == a2); // true
print(a1); // A(88,53)
}
/***
* Dart 기본적으로 참조 비교(Reference Equality)를 사용하기 때문에,
* 가변 객체인 A 인스턴스는 생성할 때 마다 다른 메모리에 할당되어 false를 반환
* Equatable 패키지를 이용하면 보다 손쉽게 값 비교를 구현할 수 있다.
*/
|
equatable 패키지 설치는 https://pub.dev/packages/equatable 를 참조하면 된다.
728x90
'Flutter 앱 > Dart 언어' 카테고리의 다른 글
Dart 얕은 복사(shallow copy), 깊은 복사(deep copy) (0) | 2024.01.17 |
---|---|
Dart cascade notation (0) | 2024.01.16 |
Dart List.where (0) | 2024.01.16 |
[Dart 고급] Dart asMap, entries (0) | 2024.01.16 |
Dart fold 함수 (2) | 2023.12.15 |