엔지니어 규의 IT 프로그래밍 다이어리

[Kotlin]24. Data class 와 Enum Class 본문

프로그래밍 언어/코틀린

[Kotlin]24. Data class 와 Enum Class

엔지니어 규 2022. 6. 1. 15:31
728x90

Data class

 

데이터 클래스는 데이터를 다루는 데에 최적화된 클래스로, 5가지 기능을 내부적으로 자동으로 생성해준다.

 

 

첫번째 : 내용의 동일성을 판단하는 equals() 의 자동구현 

 

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

 

세번째 : 포함된 속성을 보기쉽게 나타내는 toString()의 자동구현

 

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

 

다섯째 : 속성을 순서대로 반환하는 componentX()의 자동구현

 

fun main(){

    val a = General("보영",212)

    println(a == General("보영",212)) //false
    println(a.hashCode()) // 980546781
    println(a) //  General@3a71f4dd

    val b= Data("루다",386)
    println( b== Data("루다",386)) //true
    println(b.hashCode()) // 46909958
    println(b) // Data(name=루다, id=386)

    println(b.copy()) //Data(name=루다, id=386)
    println(b.copy("아린")) //Data(name=아린, id=386)
    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 는 equals(), hashCode(),  toString() 함수의 결과가 제대로 구현되지 않는 반면,

data 클래스로 만든 b는 세 함수 모두 의미있는 기능으로 자동 구현되어 있음을 알 수 있으며 

copy 함수를 통해 원본을 복사한 새 객체 역시 쉽게 만들 수 있음을 알 수 있다.

 

copy 함수를 통해 새객체를 형성할 때는 b.copy() 처럼 똑같은 내용의 객체를 생성 할 수도 있지만 b.copy("아린") 처럼

생성자와 똑같은 형태의 파라미터를 주어 일부 속성을 변경할 수 있다.

 

 

 

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

 

componentX() 는 data 클래스 객체의 속성의 내용을 component1(), component2() 같은 함수로 반환한다.

 

이 함수는 사용자가 직접 호출하기 위한 함수가 아닌 listof(Data("A",7), Data("B",3)) 처럼 배열이나 list 등에

Data 클래스 객체가 담겨 있을때 이 내용을 자동으로 꺼내쓸 수 있는 기능을 지원하기 위한 함수이다.

 

fun main(){

    val list = listOf(
        Data("보영",212),
        Data("루다",306),
        Data("아린",618))

    for ((a, b) in list){
        println("${a},${b}")
    }
    /*
    보영,212
    루다,306
    아린,618
    */

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

위의 코드에서 list에 담긴 Data 객체의 내용을 for 문에서 모두 순회하려면

두개의 속성을 받을 수 있는 이름(a,b) 을 지정하여 in 앞에 써주면되고,

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

위 코드를 실행하면 리스트에서 각각의 Data 객체를 참조하여 속성을 모두 출력했음을 알 수 있다.

 

 

Enum Class

 

enumerated type, '열거형' 의 준말로 enum 클래스 내에 상태를 구분하기 위한 객체들을 이름을 붙여 여러개 생성해두고

그중 하나의 객체를 선택하여 나타내기 위한 클래스 이다.

 

enum class 에는 다음과 같은 특징이 있다.

 

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

 

둘째 : enum의 객체들은 고유한 속성을 가질수 잇는데, enum의 생성자를 만들어 속성을 받도록 하면,

객체를 선언할때 속성도 설정할 수 있다.

 

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

 

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
}

위코드를 실행하면

 

enum 변수를 그대로 출력할때는 toString()을 통해 상태 객체의 이름이 출력되고,

같은 객체끼리 비교하였을때는 true 가 반환되었으며

Eat 객체의 메세지가 담긴 "밥을 먹습니다." 가 출력된것을 알 수 있다.

 

 

 

data class 와 enum class 는 일반 클래스에서 제공되지 않는 특정한 용도의 기능을 제공하므로,  여러가지 상황에서 사용할 수 있다. 

728x90
Comments