[Kotlin] Data, Nested classes

래림·2022년 11월 17일

Kotlin

목록 보기
2/3

Data클래스

-용도 : 데이터는 보유하지만 아무것도 하지 않는 클래스

data class User(val name:String, val age:Int)

기본 생성자에서 선언된 속성을 통해, 아래의 기능들을 컴파일러가 자동으로 생성해준다.
equals()
hashCode()
copy()
toString() of the form "User(name=John, age=42)"
componentN() functions
명시적으로 정의해주는 경우, 컴파일러가 자동으로 생성해주지 않는다.

의미있는 Data클래스의 조건

  • 기본생성자에 1개 이상의 파라미터
  • 기본생성자의 파라미터가 var, val로 선언
  • Data 클래스는 abstract, open,inner가 안됨

기본 값

-Jvm에서 기본 파라미터가 없는 생성자가 필요한 경우, 모든 프로퍼티에 기본 값을 설정해주면 된다.

data class User(val name:String = "", val age:Int = 0)
val exam_0 = User()
val exam_1 = User("Kotlin")
val exam_2 = User("Kotlin", 113)
val exam_3 = User(age = 113)
val exam_4 = User(name = "Kotlin", age= 113)

Data클래스와 그냥 클래스의 차이점

print했을 때 결과가 다르게 나온다. Data클래스를 출력하면, 주소가 아니라 안의 값이 출력된다. 이는 디버깅할 때 도움이 된다.

fun main(args:Array<String>){
    val obj = NoData("Kotlin",113)
    println(obj) //NoData@7c30a502

    val obj2 = User("Kotlin",113)
    println(obj2) //User(name=Kotlin, age=113)
}

class NoData(var name:String, var age:Int)

data class User(var name:String,var age: Int)//data클래스는 var, val 이어야 된다. 프로퍼티만 된다.

//name:String은 프로퍼티가 아니라 그냥 변수이다.

위의 기능이 어떻게 가능했을까?

컴파일러가 자동으로 함수를 생성해 주었기 때문에 가능하다.
위의 코드를 java로 변환하면 다음과 같다.

data클래스 한 줄이, 자바에선 이렇게 길어진다.

public final class User {
   @NotNull
   private String name;
   private int age;

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

   public final void setName(@NotNull String var1) {
      Intrinsics.checkNotNullParameter(var1, "<set-?>");
      this.name = var1;
   }

   public final int getAge() {
      return this.age;
   }

   public final void setAge(int var1) {
      this.age = var1;
   }

   public User(@NotNull String name, int age) {
      Intrinsics.checkNotNullParameter(name, "name");
      super();
      this.name = name;
      this.age = age;
   }

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

   public final int component2() {
      return this.age;
   }

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

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

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

      return var0.copy(var1, var2);
   }

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

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

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

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

참고영상

0개의 댓글