Home Data Class와 Enum Class
Post
Cancel

Data Class와 Enum Class

  • 특별한 기능을 가진 Class 2개

Data Class

정의

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

5가지 기능

  1. equals(): 내용의 동일성 판단
  2. hashcode(): 객체의 내용에서 고유한 코드 생성
  3. toString(): 포함된 속성을 보기쉽게 나타내줌
  4. copy(): 객체를 복사하여 똑같은 내용의 새 객체 생성
    • parameter가 없다면 똑같은 내용으로 생성, parameter가 있다면 해당 parameter를 교체하여 생성
    • ex) val a = Data(“A”, 7)
      • a.copy(“B”): Data(“B”, 7)로 생성
      • a.copy()하면 Data(“A”, 7)로 생성
  5. componentX(): 속성을 순서대로 반환
    • 리스트에 담긴 Data 객체의 내용을 for문에서 모두 순회: 내부적으로 component1(), component2() 라는 함수를 사용하여 순서대로 값 불러옴

참고사항

  • 위 함수들은 사용자가 직접 호출하기 위한 함수가 아닌, 배열이나 리스트 등의 Data class 객체가 담겨 있을 때 이 내용을 자동으로 꺼내 쓸 수 있는 기능을 지원하기 위한 함수들

사용법

  • data class 클래스 이름

아래 코드는 일반적인 클래스와 데이터 클래스의 기능을 비교한 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class General(val name: String, val id: Int)
data class Data(val name: String, val id: Int)

fun main(){
    val a = General("Kotlin", 111)
    
    println(a == General("Kotlin", 111)) // false
    println(a.hashCode()) // 835648992
    println(a) // General@31cefde0
    
    val b = Data("Java", 100)
    println(b == Data("Java", 100)) // true
    println(b.hashCode()) // 71346786
    println(b) // Data(name=Java, id=100)
    
    println(b.copy()) // Data(name=Java, id=100)
    println(b.copy("C++")) // Data(name=C++, id=100)
    println(b.copy(id = 50)) // Data(name=Java, id=50)
    
    // componentX() 계열 함수의 동작 확인 
    val list = listOf(Data("a", 1), Data("b", 2), Data("c",3)) 
    for((a,b) in list){
        println("${a}, ${b}") // 리스트에서 각각의 Data 객체를 참조하여 속성 모두 출력
    }
}
  • 위 결과를 보면 일반적인 클래스는 결과가 잘 나오지 않고, Data class는 결과가 잘 나옴을 확인할 수 있다.

Enum Class

정의

  • enumerated type, ‘열거형’의 준말로 enum 클래스의 상태를 구분하기 위한 객체들을 이름을 붙여 여러개 생성하고, 그 중 하나의 상태를 선택하여 나타내기 위한 클래스

사용법

  • enum 클래스 안의 객체들은 관행적으로 상수를 나타낼 때 사용하는 대문자로 기술
  • enum은 선언시에 만든 객체를 이름으로 참조하여 그대로 사용

성질

  1. Enum 객체들은 고유한 속성을 가질 수 있다.
    • Enum의 생성자를 만들어 속성을 받도록 하면 객체를 선언할 때 속성도 설정할 수 있다.
    • enum class Color(val number: Int){ RED(1), BLUE(2), GREEN(3) }
  2. 일반 클래스처럼 함수도 추가 가능
    • 객체 선언이 끝나는 위치에 ; 을 추가한 후 함수 기술
    • enum class Color(val number: Int){ RED(1), BLUE(2), GREEN(3); fun isRed() = this == Color.RED }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
enum class State(val message: String){
    SING("노래를 부른다."),
    EAT("밥을 먹는다."),
    SLEEP("잠을 잔다.");
    
    fun isSleeping() = this == State.SLEEP // 비교 대상은 State 객체 자기 자신이므로 this 
}

fun main(){
    var state = State.SING 
    println(state) // SING
    
    state = State.SLEEP
    println(state.isSleeping()) // true
    
    state = State.EAT
    println(state.message) // 밥을 먹는다.
    println(state.toString()) // enum 변수를 그대로 출력, 상태 객체의 이름 출력 (EAT)
}