본문 바로가기

Language/Kotlin

[Kotlin] Data Class와 Enum Class

728x90
반응형

Data Class

: 데이터를 다루는 데 최적화된 클래스

 

5가지 기능을 내부적으로 자동으로 생성해준다.

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

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

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

4. 객체를 복사하여 똑같은 내용의 새 객체를 만드는 copy()의 자동구현

copy() 함수를 통해 새 객체를 생성할 때는 아무 파라미터가 없으면 똑같은 내용으로 생성함

 val a = Data("A", 7)
 val b = a.copy()

파라미터가 있다면 해당 파라미터를 교체하여 생성함

val a = Data("A", 7)
val b = a.copy("B")  // b는 Data("B", 7)으로 생성됨

5. 속성을 순서대로 반환하는 componentX()의 자동구현

Data(”A”, 7) → “A” : component1() / 7 : component2()

이 함수는 사용자가 직접 호출하기 위한 함수가 아닌 배열이나 리스트 등에 데이터 클래스의 객체가 담겨 있을 때

listOf(Data(”A”, 7), Data(”B”, 1))

이 내용을 자동으로 꺼내 쓸 수 있는 기능을 지원하기 위한 함수들이다.

 

fun main(){
    val a = General("보영", 212)

    println(a == General("보영", 212))  // false
    println(a.hashCode())  // 681842940
    println(a)  // General@28a418fc

    val b = Data("루다", 306))

    println(b == Data("루다", 306))  // true
    println(b.hashCode())  // 46909878
    println(b)  // Data(name=루다, id=306)

    println(b.copy())  // Data(name=루다, id=306) 
    println(b.copy("아린"))  // Data(name=아린, id=306)  
    println(b.copy(id = 618))  // Data(name=루다, id=618) 
}

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

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

일반 클래스로 만든 a는 equls()나 hashCode(), toString() 함수의 결과가 제대로 구현되지 않은 반면 data 클래스로 만든 b는 세 함수 모두 의미있는 기능으로 자동 구현되어 있으며 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)

// 출력 :
// 보영, 212
// 루다, 306
// 아린, 618

 

Enum Class

enumerated type (’열거형’의 준말)

 

선언

enum class Color{
    RED,
    BLUE,
    GREEN
}

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

 

사용

Color.RED

 

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

enum class Color(val number: Int){
    RED(1),
    BLUE(2),
    GREEN(3)
}

 

일반 클래스처럼 함수도 추가할 수 있다. 객체의 선언이 끝나는 위치에 세미콜론을 추가한 후 함수를 기술하면 된다.

enum class Color(val number: Int){
    RED(1),
    BLUE(2),
    GREEN(3);

    fun isRed() = this == Color.RED
}

 

 

fun main(){
    var state = State.SING
    println(state)  // SING

    state = State.SLEEP
    println(state.isSleeping())  // true

    state = State.EAT
    println(state.message)  // 밥을 먹습니다
}

enum class State(val message: String){
    SING("노래를 부릅니다"),
    EAT("밥을 먹습니다"),
    SLEEP("잠을 잡니다");

    fun isSleeping() = this == State.SLEEP
}
728x90
반응형