시배's Android

Kotlin vs Java | Data Class는 어떻게 자바로 구현이 될까? 본문

Kotlin/Kotlin vs Java

Kotlin vs Java | Data Class는 어떻게 자바로 구현이 될까?

si8ae 2024. 1. 25. 22:53
data class Person(
    val age : Int,
    val name : String
)

위 코드는 'Person'이라는 이름의 Data Class를 선언한 것입니다. 이 클래스는 두 개의 프로퍼티를 가지고 있습니다: 'age'와 'name'. 이제 이 코드를 자바로 디컴파일하면 어떤 형태로 변환되는지 살펴보겠습니다.

@Metadata(
   mv = {1, 9, 0},
   k = 1,
   d1 = {"\u0000 \n\u0002\u0018\u0002\n\u0002\u0010\u0000\n\u0000\n\u0002\u0010\b\n\u0000\n\u0002\u0010\u000e\n\u0002\b\u000b\n\u0002\u0010\u000b\n\u0002\b\u0004\b\u0086\b\u0018\u00002\u00020\u0001B\u0019\u0012\n\b\u0002\u0010\u0002\u001a\u0004\u0018\u00010\u0003\u0012\u0006\u0010\u0004\u001a\u00020\u0005¢\u0006\u0002\u0010\u0006J\u0010\u0010\f\u001a\u0004\u0018\u00010\u0003HÆ\u0003¢\u0006\u0002\u0010\bJ\t\u0010\r\u001a\u00020\u0005HÆ\u0003J$\u0010\u000e\u001a\u00020\u00002\n\b\u0002\u0010\u0002\u001a\u0004\u0018\u00010\u00032\b\b\u0002\u0010\u0004\u001a\u00020\u0005HÆ\u0001¢\u0006\u0002\u0010\u000fJ\u0013\u0010\u0010\u001a\u00020\u00112\b\u0010\u0012\u001a\u0004\u0018\u00010\u0001HÖ\u0003J\t\u0010\u0013\u001a\u00020\u0003HÖ\u0001J\t\u0010\u0014\u001a\u00020\u0005HÖ\u0001R\u0015\u0010\u0002\u001a\u0004\u0018\u00010\u0003¢\u0006\n\n\u0002\u0010\t\u001a\u0004\b\u0007\u0010\bR\u0011\u0010\u0004\u001a\u00020\u0005¢\u0006\b\n\u0000\u001a\u0004\b\n\u0010\u000b¨\u0006\u0015"},
   d2 = {"LPerson;", "", "age", "", "name", "", "(Ljava/lang/Integer;Ljava/lang/String;)V", "getAge", "()Ljava/lang/Integer;", "Ljava/lang/Integer;", "getName", "()Ljava/lang/String;", "component1", "component2", "copy", "(Ljava/lang/Integer;Ljava/lang/String;)LPerson;", "equals", "", "other", "hashCode", "toString", "compareJava"}
)
public final class Person {
   @Nullable
   private final Integer age;
   @NotNull
   private final String name;

   @Nullable
   public final Integer getAge() {
      return this.age;
   }

   @NotNull
   public final String getName() {
      return this.name;
   }

   public Person(@Nullable Integer age, @NotNull String name) {
      Intrinsics.checkNotNullParameter(name, "name");
      super();
      this.age = age;
      this.name = name;
   }

   // $FF: synthetic method
   public Person(Integer var1, String var2, int var3, DefaultConstructorMarker var4) {
      if ((var3 & 1) != 0) {
         var1 = null;
      }

      this(var1, var2);
   }

   @Nullable
   public final Integer component1() {
      return this.age;
   }

   @NotNull
   public final String component2() {
      return this.name;
   }

   @NotNull
   public final Person copy(@Nullable Integer age, @NotNull String name) {
      Intrinsics.checkNotNullParameter(name, "name");
      return new Person(age, name);
   }

   // $FF: synthetic method
   public static Person copy$default(Person var0, Integer var1, String var2, int var3, Object var4) {
      if ((var3 & 1) != 0) {
         var1 = var0.age;
      }

      if ((var3 & 2) != 0) {
         var2 = var0.name;
      }

      return var0.copy(var1, var2);
   }

   @NotNull
   public String toString() {
      return "Person(age=" + this.age + ", name=" + this.name + ")";
   }

   public int hashCode() {
      Integer var10000 = this.age;
      int var1 = (var10000 != null ? var10000.hashCode() : 0) * 31;
      String var10001 = this.name;
      return var1 + (var10001 != null ? var10001.hashCode() : 0);
   }

   public boolean equals(@Nullable Object var1) {
      if (this != var1) {
         if (var1 instanceof Person) {
            Person var2 = (Person)var1;
            if (Intrinsics.areEqual(this.age, var2.age) && Intrinsics.areEqual(this.name, var2.name)) {
               return true;
            }
         }

         return false;
      } else {
         return true;
      }
   }
}

첫번째로, 클래스 선언 부분을 보면 public final class Person으로 선언되어 있습니다. 이 부분에서 final 키워드는 코틀린의 class가 기본적으로 final이라는 것을 보여줍니다.

 

private final Integer ageprivate final String name는 각각 age와 name 필드를 정의합니다. 이는 코틀린의 val 키워드가 자바에서는 final로 변환된다는 것을 보여줍니다.

 

그 다음으로, getAge()getName() 메소드는 각각 age와 name 필드의 getter 메소드에 해당합니다.

생성자 역시 존재하는데, 이 부분에서는 Intrinsics.checkNotNullParameter(name, "name") 코드를 통해 name 필드가 null이 아님을 확인하고 있습니다.

 

그리고 component1()component2() 메소드는 각각 age와 name 필드를 반환합니다. 이 메소드들은 코틀린의 데이터 클래스에 자동으로 생성되며, 이를 통해 순서대로 필드를 반환할 수 있습니다.

 

copy() 메소드는 새로운 Person 객체를 생성하고 반환합니다. 이 메소드는 코틀린의 데이터 클래스에 자동으로 생성되며, 이를 통해 기존 객체의 필드 값을 복사하여 새로운 객체를 생성할 수 있습니다.

 

마지막으로 toString(), hashCode(), equals() 메소드는 객체의 문자열 표현, 해시 코드, 동일성을 각각 반환합니다. 이 메소드들 역시 코틀린의 데이터 클래스에 자동으로 생성됩니다.

 

이렇게코틀린의데이터클래스는간결하지만, 자바로디컴파일하면많은메소드들이자동으로생성되는것을확인할수있습니다. 이로인해데이터클래스를사용하면간편하게데이터를다루는클래스를생성할수있으며, 이는코틀린을사용하는많은개발자들이이를선호하는이유중하나입니다.