티스토리 뷰

Java를 사용해본 개발자라면 equals 와 hashCode 메소드를 override해보았을 것이다.
이 두함수는 객체가 같은지를 비교하고, HashMap이나 HashSet등에서 hash된 값을 사용하기 위해 접근하는 함수이다.

hashCode를 이용해서 동일한 객체가 있는 지를 비교하고, 적당한 위치에 데이타를 저장하게 된다.
특히 data클래스들은 이 함수들을 잘 override해주어야 한다.

 

kotlin에는 data class가 equals와 hashCode를 별도의 추가 작업 쉽게 사용할 수 있도록 자동화 되어 있는데,
dart에서 kotlin의 data class에 해당하는 기능을 제공하는 라이브러리가 Equatable이다.

아래 java, kotlin, dart의 코드를 비교해보자

java에서의 equals와 hashCode

아래는 java에서 equals와 hashCode를 부분을 확인해보자.
Post객체를 비교 하기 위해서는 아래와 같은 코드가 필요하다. 실제 프로젝트에서는 거의 모든 Data클래스에 이런 코드가 들어 가야한다.

// Java
public class Post {
  private String id;
  private String title;
  private String body;

  Post(String id, String title, String body){
    this.id = id;
    this.title = title;
    this.body = body
  }

  public String getId(){
      return id;
  }
  public String getTitle(){
      return title;
  }
  puiblic String getBody(){
        return body;
  }

  @override
  public bool equals(Post others) {
      if(!this.id.equals(others.getId())) return false;
      if(!this.title.equals(others.getTitle())) return false;
      if(!this.body.equals(others.getBody())) return false;
      return true;
  }

  @override
  public int hashCode() {
    return Objects.hash(id, String, body);
  }
}

kotlin에서 equals와 hashCode

최근 android는 kotlin으로 개발을 많이 하는 추세이다. 개인 적으로 kotlin은 java에서 보다 동일한 기능을 많이 간소화 해서 사용 할수 있어 좋다.
kotlin에서 data class라는 별도의 클래스가 존재한다. data class는 toString(), hashCode(), equals(), copy() 함수들을 자동으로 만들어 준다. 그래서 java에서 직접 구현하던 기능을 따로 구현하지 않고도 쉽게 사용할 수 있다.

// kotlin
data class Post(val id: String, val title: String, val body:String)

dart에서 equals(==) 와 hashCode

이번에는 dart에서 equals와 hashCode에 대해서 알아보자.
기본적으로 dart에서도 java에서 처럼 equals와 hashCode를 직접 override해서 구현해야 한다.
하지만 이런 작업을 먼저 구현해둔 편리한 클래스가 있는데 그 클래스가 Equaltable이다.

아래와 같이 Post를 Equatable를 상속받아 만들고, props를 override해 자신이 가진 값들을 List로 반환해 주면, Equatable에 구현된 equals (==) 와 hashCode가 처리해주는 구조이다.
(dart에는 equals함수가 없고 operator == 함수가 동일한 역할을 한다)

// dart
class Post extends Equatable {
   final String id;
   final String title;
   final String body;
   Post({required this.id, required this.title, required this.body});

   @override
   List<Object> get props => [id, title, body]
}

 

 kotlin이 언어차원에서 지원하는 클래스가 있어 가장 간단하게 equals와 hashCode부분을 해결하고 있고, dart에서는 equatable클래스를 상속받아 조금 간편한 방법으로 해결하고 있다.

 

https://pub.dev/packages/equatable

 

equatable | Dart Package

A Dart package that helps to implement value based equality without needing to explicitly override == and hashCode.

pub.dev

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함