ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [KOTLIN] data class
    KOTLIN 2022. 9. 20. 19:13

    data class를 사용하지 않을 때의 불편함

    코틀린에서 Class를 생성할 때 Java language 스펙에 따라서 아래와 같은 메서드를 재정의해야 한다.

    • toString()
    class Dog(var name: String, var age: Int, var sex: String) {
    	override fun toString(): String {
        	return "Dog(name=$name, age=$age, sex=$sex"
        }
    }
    • equals()
    class Dog(var name: String, var age: Int, var sex: String) {
    	override fun toString(): String {
        	return "Dog(name=$name, age=$age, sex=$sex"
        }
        
        override fun equals(other: Any?): Boolean {
        	if(other == null || otehr !is Dog) return false
            return name == other.name && age == other.age && sex == other.sex
        }
    }
    
    
    // equals를 정의하지 않은 경우
    fun main() {
    	val dog1 = Dog("Brown", 3, "Female")
        val dog2 = Dog("Brown", 3, "Female")
        
        println(dog1 == dog2) // false
    }
    
    // equals를 정의한 경우
    fun main() {
    	val dog1 = Dog("Brown", 3, "Female")
        val dog2 = Dog("Brown", 3, "Female")
        
        println(dog1 == dog2) // true
    }
    • hasCode()
    class Dog(var name: String, var age: Int, var sex: String) {
    	override fun toString(): String {
        	return "Dog(name=$name, age=$age, sex=$sex"
        }
        
        override fun equals(other: Any?): Boolean {
        	if(other == null || otehr !is Dog) return false
            return name == other.name && age == other.age && sex == other.sex
        }
        
        // instance의 hash 값을 정의함.
        // 정의하지 않을 경우 equals 값이 같더라도 다른 객체로 분류함.
        override fun hashCode(): Int {
        	return (name.hashCode() * 31 + age - sex.hashCode()) * 31
        }
        
    }
    
    // hashCode를 정의하지 않은 경우
    fun main() {
    	val dogSet = hashSetOf(Dog("Brwon", 3, "Female")
        println(dogSet.contains(Dog("Brown", 3, "Female") // false
    }
    
    
    // hashCode를 정의한 경우
    fun main() {
    	val dogSet = hashSetOf(Dog("Brwon", 3, "Female")
        println(dogSet.contains(Dog("Brown", 3, "Female") // true
    }

    data class의 이점

    Kotlin에서 Data Class는 위 3개의 메서드를 자동으로 정의해 주기 때문에 단순한 properties만 가지는 클래스들은 data class로 정의하면 편하게 사용할수 있다.

Designed by Tistory.