코틀린 강좌 #24 Data Class 와 Enum Class

Kotlin/기본 문법 · 2020. 12. 24. 14:30

테크과학! DiMo

 

테크과학! DiMo

개발자가 얘기하는 생활 속 IT기술에 대한 과학! 여러분이 몰랐던, 혹은 정확히 알지 못했던 IT 테크놀러지를 파드립니다! 좋은 영상을 위한 채널 후원, 투네이션을 통해서 해주세요! 후원링크 htt

www.youtube.com

 

 

개발 환경: play.kotlinlang.org

 


Data class

 

데이터를 다루는 데에 최적화된 class로 5가지 기능을 내부적으로 자동으로 생생

 


equals()


내용의 동일성을 판단

 


hashcode()


객체의 내용에서 고유한 코드를 생성

 


toString()


포함된 속성을 보기 쉽게 나타냄

 


copy()


객체를 복사하여 똑같은 내용의 새 객체를 만듦. copy()를 통해 새 객체를 생성할 때는  똑같은 내용의 객체를 생성할 수

 

도 있지만 생성자와 똑같은 형태의 파라미터를 부여하여 일부 속성을 변경할 수 있다.

 


componentX()


속성을 순서대로 반환

 

 

 

 

fun main() {
    val a = General("보영", 212)
    
    println(a == General("보영", 212))
    println(a.hashCode())
    println(a)
    
    val b = Data("루다", 306)
    
    println(b == Data("루다", 306))
    println(b.hashCode())
    println(b)
    
    println(b.copy())
    println(b.copy("아린"))
    println(b.copy(id = 618))
}

class General(val name: String, val id: Int)

data class Data(val name: String, val id: Int)

Output:
false
1510467688
General@5a07e868
true
46909878
Data(name=루다, id=306)
Data(name=루다, id=306)
Data(name=아린, id=306)
Data(name=루다, id=618)

 

 

일반 클래스로 만든 a는 equals()나 hashCode(), toString() 함수의 결과가 제대로 구현되지 않은 반면 data 클래스로 만

 

든 b는 3함수 모두 의미 있는 기능으로 자동 구현되어 있음을 알 수 있으며 copy() 함수를 통해 원본을 복사한 새 객체 역

 

시 쉽게 만들 수 있음을 알 수 있다.

 

fun main() {
    val list = listOf(Data("보영", 212),
                     Data("루다", 306),
                     Data("아린", 618))
    
    for ((a, b) in list) {
        println("${a}, ${b}")
    }
}

class General(val name: String, val id: Int)

data class Data(val name: String, val id: Int)

Output:
보영, 212
루다, 306
아린, 618

 

 

enum class


enumerated type 즉, '열거형'의 준말

 

 

 

enum 클래스 안의 객체들은 관행적으로 상수를 나타낼 때 사용하는 대문자로 기술한다.

 

또한 enum의 객체들은 고유한 속성을 가질 수 있다.

 

 

enum에 생성자를 만들어 속성을 받도록하면 객체를 선언할 때 속성도 설정할 수 있다. 또한 일반 클래스처럼 함수도 추

 

가할 수 있다. 이 때는 객체의 선언이 끝나는 위치에 세미콜론을 추가하고 함수를 기술하면 된다.

 

 

fun main() {
    var state = State.SING
    println(state)
    
    state = State.SLEEP
    println(state.isSleeping())
    
    state = State.EAT
    println(state.message)
}

enum class State(val message: String) {
    SING("노래를 부른다"),
    EAT("밥을 먹는다"),
    SLEEP("잠을 잔다");
    
    fun isSleeping() = this == State.SLEEP
}

Output:
SING
true
밥을 먹는다