Object / Any 상속
자바 플랫폼에서 모든 클래스는 ``java Object``(코틀린의 경우는 ``kt Any``) 클래스를 상속하고, 이 최상위 클래스가 ``kt equals()/hashCode()/toString()``를 가지고 있기 때문에 이를 상속하게 된다.
equals() / hashCode()
- [Coding/Kotlin Java] - [Effective Java] 3장 모든 객체의 공통 메서드
- 코틀린에서 ``kt x.equals(y)``는 ``kt x == y``와 같다. (내부적으로 equals를 호출한다.)
- 참조 비교를 위해서는 ``kt x === y`` 를 사용한다.
Data Classes
코틀린에서는 ``kt data`` 키워드를 붙여주면 equals() / hashCode() 같은 메소드를 자동으로 오버라이드해서 작성해준다!
```kt
data class User(val name: String, val age: Int)
```
- ``kt equals()/hashCode()`` pair
- ``kt toString()`` of the form ``kt "User(name=John, age=42)"``
- componentN() functions corresponding to the properties in their order of declaration
- ``kt copy()`` function.
단, ``kt data`` 클래스는 다음 조건을 만족해야만 한다.
- The primary constructor needs to have at least one parameter;
- All primary constructor parameters need to be marked as ``kt val, var``;
- Data classes cannot be ``kt abstract, open, sealed, inner``;
Note ) ``kt toString()/equals()/hashCode()``는 결과를 산출할 때 주 생성자에 나열된 프로퍼티만 사용하기 때문에, 주 생성자 밖에 정의된 프로퍼티는 고려하지 않는다.
Note ) 주 생성자에 ``kt val, var``을 모두 지정할 수 있지만 웬만하면 ``kt val``을 지정해 불변 클래스로 만들어 놓고,
변경이 필요한 프로퍼티가 생기면 ``kt copy()``를 사용해 복사하면서 일부 프로퍼티를 변경하는 것이 더 좋다.
data class와 HashMap (객체 정의 vs 맵에 key-value로 저장)
HashMap이 더 유연하지만, 유연하다는 것은 곧 비싸다는 것을 의미하므로... data class에 비해 메모리를 많이 사용하며 느리고, primitive type의 boxing을 강제한다는 점이 단점이다.
가독성도 당연히 필드를 바로 확인할 수 있는 data class가 좋은 편이나, HashMap도 주석으로 제공할 수 있으니 이건 크게 문제가 되지는 않는다.
아무튼, 대체로 data class를 사용하는게 도움이 되며 유연성이 필요한 경우 HashMap을 고려하면 되겠다.
'Languages & Frameworks > Kotlin' 카테고리의 다른 글
[Kotlin] 싱글턴 object(static) : 객체 선언, 동반 객체, 객체 식 / 익명, 무명 (0) | 2017.12.03 |
---|---|
[Kotlin] by : Decorator & Delegation (0) | 2017.12.02 |
[Kotlin/Java] data : equals, hashCode, ... (0) | 2017.12.02 |
[Kotlin] 프로퍼티, 커스텀 접근자(getter, setter) (0) | 2017.12.02 |
[Kotlin] Class, 생성자 (0) | 2017.12.01 |
[Kotlin] enum / when / sealed (0) | 2017.12.01 |