Til. kotlin Data class와 보일러 플레이트

Devback·2021년 2월 22일
0
post-thumbnail

1. Data class란?

데이터를 보관하는 목적으로 사용하는 클래스이다. 클래스가 Data를 보유하면서 특별한 기능을 하지 않는다.

2. 일반 클래스와 차이는 ?

3. 데이터 클래스 (Data class)의 특징

  • 상속 받을 수 없다.
  • val 또는 var으로 선언해야 한다.
  • abstract, open, sealed, inner를 붙일 수 없다.
  • 1개 이상의 프로퍼티를 가지고 있어야 한다.

4. Data class의 장점

data 클래스의 장점은 보일러 플레이트 코드를 줄여준다는 것이다.
위의 코드는 자바 코드이고 아래의 코드는 코틀린 코드이다. 같은 기능을 하지만 data class 클래스는 많은 보일러플레이트 코드를 줄여준다.

  • toString(), hashCode(), equals(), copy(), componentN functions 메소드를 자동으로 만들어준다.
// getter 와 setter 를 작성한 Java POJO class 의 형태

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(String int) {
        this.age = age;
    }
    
}
// 위의 POJO 클래스와 같은 기능을 하지만, boilerplate code 가 사라졌다
data class person(
    val name: String, 
    val age: Int
)

Kotlin data class 사용 방법

1. data class의 property 접근

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

fun main(args: Array){
	val jun = Person("준", 4)
    val junName = jun.name // name 프로퍼티에 접근 
    val junAge = jun.age // age 프로퍼티에 접근 
    
    jun.age = 5 // Error: val cannot be assigned
}

2. data class의 copy() 함수

코틀린 컴파일러는 데이터 클래스의 인스턴스를 더 쉽게 불변 객체로 활용할 수 있게 메소드를 제공한다. 이것이 copy()함수이다. copy()함수는 객체를 복사하면서 일부 프로퍼티를 바꿀 수 있게 해준다.

원본 객체를 메모리상에서 직접 바꾸는 대신 복사본을 만드는 것이 낫다고 한다. 복사본은 원본과 다른 생명주기를 가지며, 복사본의 프로퍼티 값을 바꾸거나 복사본을 제거해도 프로그램에서 원본을 참조하는 다른 부분에 전혀 영향을 주지 않기 때문이다.

fun main() {
	val jun = Person("jun", 24)
    
   	val anotherJun = jun.copy(age=211)
   	println(jun)
   	println(anotherJun)
}

data class Person(var name: String, val age: Int)

3. data class의 toString(), hashCode(), equals()

fun main() {
	val jun = Person("준", 24)
	
	// toString() - 결과 : Person(name=준, age=24)
    println(jun.toString())
    
    // hashCode() - 결과 : 1595160
    println(jun.hashCode())
    
    // equals() - 결과 : true
    val jun1 = Person("준", 24)
    println(jun.equals(jun1))    
    
    // equals() - 결과 : false
    val jun2 = Person("짭준", 25)
    println(jun.equals(jun2))

}

data class Person(var name: String, val age: Int)
  • toString()

"ClassName(field1=value1, field2=value)" 형태의 String 으로 객체를 convert 하여 반환한다

  • hashCode()

hashCode 란, 객체를 구별하는 정수값을 말한다. 동일한 값을 가졌다고 해서 동일 객체인것이 아니다. 동일 객체는 서로 같은 참조를 바라본다.

JVM 언어에서는 equals() 가 true 를 반환하는 두 객체는 반드시 같은 hashCode() 를 반환해야한다는 제약이 있다.

  • equals()

참조 동일성이 아닌 객체의 동등성을 검사한다.

kotlin 의 구조적 동등 연산자 (Structural equality operator) "==" 을 호출하여 사용할 수 있다. kotlin 에서의 "==" 연산자는 내부적으로 equals() 함수를 호출하는 방식으로 컴파일된다.

Java 에서 참조 동일성을 비교하는 "==" 연산자는 kotlin 에서는 "===" 연산자로 사용된다.

kotlin 의 is 검사는 Java 의 instanceOf 와 같다

4. data class의 데이터 분해 및 대입(Destructuring Declarations): ComponentN()

fun main() {
	val jun = Person("준", 124)  
    
    // Destructuring Declaration 구문을 통해 객체를 여러 변수로 구조화
    val (name, age) = jun
    
    
    println(name) // 결과 - 준
    println(age) // 결과 - 124

}

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

kotlin은 데이터 클래스의 기본 생성자에 선언된 모든 property에 해당하는 componentN()함수를 생성한다.

componentN() 을 통해 Destructuring Declarations 를 사용할 수 있다. Destructuring Declarations 는 객체를 여러 변수로 구조화하기 위해 사용한다.


실제 컴파일시에는 아래와 같이 해석된다. 

  val name = olaf.component1()
  val age = olaf.component2()
profile
나랑 같이 개발할 사람🖐

0개의 댓글