본문 바로가기
코틀린

코틀린(22) - Data 클래스, Enum 클래스

by 왈레 2022. 3. 23.

Data 클래스

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

  1. 내용의 동일성 판단하는 equals( ) 자동구현
  2. 객체의 내용에서 고유한 코드(해쉬코드) 생성하는 hashCode( ) 자동구현
  3. 포함된 속성을 보기쉽게 나타내는 toString( ) 자동구현
  4. 객체를 복사하여 똑같은 내용의 객체를 만드는 copy( ) 자동구현

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. 속성을 순서대로 반환하는 component() 자동구현

Data("A", 7)

component1( ), component2( ) 같은 함수로 속성의 내용을 반환한다

 

사실 함수는 사용자가 직접 호출하기 위한 함수가 아닌 배열이나 리스트등의 데이터 클래스의 객체가 담겨 있을 내용을 자동으로 꺼내 있는 기능을 지원하기 위한 함수들이다.

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

 

equals, hashCode, toString, copy 사용예제

fun main(){
    val a = General("보영", 212)
    println(a == General("보영",212)) //false 비정상 출력
    println(a.hashCode()) // 고유한 코드인지 아닌지 모르나 제대로 출력이 안된다함!
    println(a) //객체의 속성이 제대로 출력되지않고 쓰레기값이 비정상 출력됨

    val b = Data("루다", 306)
    println(b == Data("루다", 306)) //true 정상출력
    println(b.hashCode()) // 고유한 코드인지 아닌지 모르나 제대로 출력이 된다함!
    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)

 

componentX( ) 계열의 함수 사용예제(직접 사용하는건 아님, 내부적으로 사용)

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

    for((a,b) in list){ // for문에서 두 개의 속성을 받을 수 있는 방법!
        //  내부적으로는 component1( ), component2( ) 라는 함수를
        //  사용하여 순서대로 값을 불러오게 된다!
        println("${a}, ${b}")
    }
}

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

 

Enum 클래스 (열거형, enumerated type)

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

 

 

이늄의 기본 사용법

enum class Color{
    RED,
    BLUE,
    GREEN
}

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

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

 

 

Enum의 생성자, 이늄의 객체들의 속성

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

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

이늄의 생성자를 만들어 속성을 받도록 하면 객체를 선언할 속성도 설정할 있다.

 

 

Enum의 함수추가

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

enum class Color(val number: Int){
    RED(1),
    BLUE(2),
    GREEN(3); // 세미콜론을 추가한 후 함수를 기술해야 한다.

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

 

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 // 잠을 자는지 여부를 boolean값으로 반환
    // * 이때 비교할 대상은 State 객체 자기 자신이므로 this로 해주어야 한다
}

 

enum 어떤 상황에서 쓰이는가?

하나의 카테고리에 해당하는 여러개의 분류 객체를 미리 클래스로 만들때 사용한다.

enum 으로 만들면 클래스이름.객체명으로 참조할 있기 때문에 분류내에 어떤 객체가 있는지를 코드를 보는 다른 사람도 명확히 있으며, 영상에서 나온것 처럼 enum으로 상태를 미리 분류해 두면 상태가 바뀔때마다 변수값을 바꾸어두고 if 문이나 when 등의 조건문에서 현재 상태를 편리하게 확인해  있다.

예제는 일반적으로 state machine 형태 코드에서 흔히 쓰이는 방법이다.

 

data class enum class 일반 클래스에서 제공되지 않는 특정한 용도의 기능들을 제공하고 있으므로 여러가지 상황에서 유용하게 사용해보라.

댓글