[Dart/Flutter] bool operator == (Object other)이 뭘까요? (객체 동등성 비교)

2024년 06월 11일
 | 
Info-Geon
Dart_Flutter basic img

Dart에서는 한번씩 bool operator == (object other)과 같은 코드가 보입니다. 이는 과연 무엇을 뜻하는 코드일까요?

이번 글에서는 Dart의 객체 동등성 비교를 알아봅니다!

 

Dart의 객체 동등성 비교

Dart에서 객체의 동등성을 비교하는 것은 중요한 작업입니다. 기본적으로 모든 객체는 == 연산자를 통해 동등성을 비교할 수 있으며, 이는 Object 클래스에 정의된 == 연산자를 오버라이드하여 사용자 정의 객체의 동등성 비교를 할 수 있습니다. 여기서는 Money 클래스를 예로 들어 Dart에서 객체 동등성을 어떻게 비교하는지 알아보겠습니다.

class Money {
  final double amount;
  final String currency;

  const Money(this.amount, this.currency);

  @override
  bool operator ==(Object other) =>
      other is Money && other.amount == amount && other.currency == currency;

  @override
  int get hashCode => Object.hash(amount, currency);
}

Money 클래스는 두 개의 final 필드, amount와 currency를 가지고 있습니다. 이 클래스는 금액과 화폐 단위를 나타내는 데 사용됩니다.

 

동등성 비교

동등성 비교를 위해 == 연산자를 오버라이드합니다. Dart에서는 객체의 동등성을 비교할 때 == 연산자를 사용하며, 이를 통해 객체의 필드 값이 같은지를 확인할 수 있습니다.

 

1. 매개변수 및 반환 타입

bool operator == (Object other) =>
  • bool operator: 이 메서드는 true 또는 false 값을 반환합니다.
  • Object other: 이 메서드가 받아들이는 매개변수로, 비교하려는 대상 객체입니다.
 
 

2. 타입 확인 및 필드 비교

other is Money && other.amount == amount && other.currency == currency
  • 먼저 other 객체가 Money 타입인지 확인합니다. 만약 Money 타입이 아니라면 false를 반환합니다.
  • other 객체가 Money 타입이라면, amount 및 currency 필드의 값이 같은지를 비교합니다.
  • 두 필드의 값이 모두 같으면 true, 하나라도 다르면 false를 반환합니다.
 
 

3. hashCode 오버라이드

hashCode는 객체의 해시 코드(고유값)를 반환합니다. 
@override
int get hashCode => Object.hash(amount, currency);
  • Object.hash 메서드는 여러 필드를 받아 해시 코드를 생성합니다.
  • amount와 currency를 사용하여 고유의 해시 코드를 생성합니다.
 

예시

void main() {
  Money money1 = Money(100.0, 'USD');
  Money money2 = Money(100.0, 'USD');
  Money money3 = Money(200.0, 'EUR');

  print(money1 == money2); // true
  print(money1 == money3); // false
}
  • money1과 money2는 동일한 amount와 currency를 가지므로 == 연산자는 true를 반환합니다.
  • money1과 money3는 다른 값을 가지므로 == 연산자는 false를 반환합니다.

질문) 그럼 도대체 Dart에서 객체 동등성 비교를 쓰는 이유는 무엇일까요? 그냥 == 로 비교하면 안되나요?

답변) ‘==’연산자는 기본적으로 동일성 비교를 합니다. 즉, 두 객체가 메모리 상에서 동일한지 여부를 확인하는 것입니다.(메모리 주소 동일 여부 확인)

하지만 두 객체가 같은 메모리 주소를 가지지 않더라도, 그 객체들이 같은 데이터를 가지고 있으면 동일하다고 간주하고 싶을 때가 있습니다. 이럴 때 사용하는 것이 객체 동등성 비교입니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다