Kotlin
[Kotlin] data class & enum class
자랄수있다
2022. 9. 21. 19:38
data class
dㅎta class는 데이터 보관 목적으로 만든 클래스이다.
데이터 클래스는 프로퍼티에 대한 toString(), hashCode(), equals(), copy(), componentN() 메소드를 자동으로 만들어 준다.
바로 예시를 통해 일반 클래스와 비교해 보자
타입만 다르고 생성자는 같은 일반 클래스와 데이터클래스를 생성하였다.
class General(val name: String, val id : Int)
data class Data(val name: String, val id : Int)
fun main() {
val a = General("유리", 111)
println(a == General("유리", 111))
println(a.hashCode())
println(a)
println("-------------")
val b = Data("원빈", 222)
println(b == Data("원빈", 222))
println(a.hashCode())
println(b)
println("-------------")
println(b.copy())
println(b.copy("새벽"))
println(b.copy(id = 333))
}
<결과>
보이다시피 일반 class로 만든 인스턴스는 equals(), hashCode(), toString() 함수가 제대로 구현되지 않았다...
(왜 a와 b의 hashCode 값이 같은 거지.. 안드로이드 스튜디오로 돌려봐도 마찬가지다.. 일단 넘어가겠습니다)
copy()도 따로 만들지 않으면 이용할 수 없다. (a.copy()하면 에러남)
그리고 마지막으로 데이터 클래스는
프로퍼티 선언 순서에 따라 생성되는 componentN() 함수를 가지고 있다.
fun main() {
val list = listOf(Data("제니", 111),
Data("지환", 222),
Data("소미",333)
)
for((a,b) in list){
println("$a, $b")
}
}
// 결과
// 제니, 111
// 지환, 222
// 소미, 333
선언한 name, id 순서대로 a,b가 적용된 것
enum class
상태를 구분하기 위한 객체들을 이름을 붙여 여러개 생성해두고, 그 중 하나의 상태를 선택하여 나타내기 위한 클래스이다
Comparable 인터페이스를 구현하는 Abstract Class이다
관행적으로 enum 클래스의 객체들은 상수를 나타낼 때 사용하는 대문자로 기술한다.
객체와 객체 사이엔 쉼표를, 끝나는 위치엔 세미콜론을 추가한다
fun main() {
var mood = Mood.ANGRY
println(mood) // ANGRY
println(mood.ordinal) // 1 두 번째이므로 인덱스로[1]
mood = Mood.HAPPY
println(mood.isHappy()) // true
println(mood.ordinal) // 0
mood = Mood.LONELY
println(mood.text) // 외로운 기분
println(mood.ordinal) // 2
}
enum class Mood(val text : String){
HAPPY("행복한 기분"),
ANGRY("화난 기분"),
LONELY("외로운 기분");
fun isHappy() = this == Mood.HAPPY
}