기록

[코틀린/Kotlin] Data Class와 Enum Class 본문

[Study]/Kotlin

[코틀린/Kotlin] Data Class와 Enum Class

Dannnnnn 2022. 5. 10. 04:12
반응형

특별한 기능이나 형태를 가진 클래스들을 알아보자.

1. Data Class

Data class는 데이터를 다루는 데 최적화 된 클래스로 '5가지 기능'을 내부적으로 자동으로 생성한다.

1. 내용의 동일성을 판단하는 equals() 자동 구현

2. 객체의 내용에서 고유한 코드를 생성하는 hashcode() 자동 구현

3. 포함된 속성을 보기 쉽게 나타내는 toString() 자동 구현

4. 객체를 복사해 새 객체를 만드는 copy() 자동 구현

    val a = Data("A", 7)
    //파라미터가 없으면 똑같은 내용 객체 생성
    val b = a.copy()
    //생성자와 똑같은 형태의 파라미터를 넘겨 일부 속성 변경
    val c = a.copy("C")

5. 속성을 순서대로 반환하는 component 함수 자동 구현

(사용자가 직접 호출하기 위한 함수가 아닌 배열이나 리스트 등의 데이터 클래스에 객체가 담겨있을 때 내용을 자동으로 꺼내 쓰도록 하는 함수이다.)

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)

일반 클래스로 만든 a는 equal() 이나 hashCode(), toString() 함수의 결과가 제대로 구현되지 않았다.

data 클래스로 만든 b는 세 함수 모두 의미있는 기능으로 자동 구현되어 있음을 알 수 있으며 copy()함수로 원본을 복사한 객체 역시 쉽게 만들 수 있다.

 

이번엔 componentX() 계열 함수의 동작을 확인해보자.

리스트에서 각각의 Data 객체를 참조하여 속성을 모두 출력한다.

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)

리스트에 담긴 Data 객체 내용을 for문에서 모두 순회하려면 두개의 속성을 받을 수 있는 이름을 지정하여 in 앞에 써준다.

이렇게 하면 내부적으로는 component1(), component2() 라는 함수를 사용하여 순서대로 값을 불러오게 된다.

2. Enum Class

enumerated type 즉, '열거형'의 준말이다.

상태를 구분하기 위한 객체들을 이름을 붙여 여러개 생성해두고 그중 하나의 상태를 선택하여 나타내기 위한 클래스이다.

 

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

 

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

enum에 생성자를 만들어 속성을 받도록 하면 객체를 선언할 때 속성도 설정할 수 있다.

 

일반 클래스 처럼 함수도 추가할 수 있다.

이때는 객체의 선언이 끝나는 위치에 세미콜론을 추가한 후 함수를 기술한다.

fun main() {
    
    var color = Color.BLUE
    
    println(color)
    println(color.number)
    println(color.isRed())
    
}

enum class Color(val number: Int){
    RED(1), BLUE(2), GREEN(3);
    
    fun isRed() = this == Color.RED
}

특이한 형태이지만 모두 enum class인 Color 객체를 생성하기 위한 선언이다.

enum은 선언시에 만든 객체를 이름으로 참조하여 그대로 사용한다.

이때 비교할 대상은 State 객체 자기 자신이므로 this로 기재한다.

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
}

 

두 클래스는 특정한 용도의 기능들을 제공하니 유용하게 사용하자.

 

 

 

https://www.youtube.com/watch?v=q7GV68jKLVM&list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN&index=25

위 강의를 보면서 개인적으로 공부한 내용을 정리하였습니다.

반응형