연습장/이론

클래스 1-1. Data Class

아이른 2024. 3. 11. 17:55

1. Data class(데이터 클래스)

  • 매개체의 데이터를 관리하는 용도로 사용
  • abstract, open, sealed, inner 클래스로 정의할 수 없음
  • 반드시 주 생성자를 가지고 있어야 함

 

1-1. 자동으로 구현되는 5가지 기능

  • equals() : 내용의 동일성을 판단하여 true 또는 false 리턴
  • hashcode() : 객체의 구분하기 위한 고유한 코드를 생성
  • toString() : 현재 객체의 모든 프로퍼티를 문자로 리턴
  • copy() : 객체를 복사하여 똑같은 내용의 새 객체 생성
  • componentX() : 속성을 순서대로 반환 (객체 분해)
fun main(){
    val a = General("란",159)
    println(a == General("란",159))
    println(a.hashCode())
    println(a)
    //toString()의 결과값을 보기 위해 a를 그대로 출력
}

class General(val name:String, val id:Int)
fun main(){
    val b = Data("라니",951)
    println(b == Data("라니",951))
    println(b.hashCode())
    println(b)
    
    println(b.copy())
    println(b.copy("아이른"))
    println(b.copy(id=555))
}

data class Data(val name:String, val id:Int) 
<print>
false
885284298
General@34c45dca
//일반 클래스로 만든 a는 equals(), hashCode(), toString()함수의 결과가 제대로 구현되지 않음
<print>
true
46559851
Data(name=라니, id=951)
Data(name=라니, id=951)
Data(name=아이른, id=951)
Data(name=라니, id=555)

 

- componentX()계열의 동작 확인 (X : 1,2,3 .. 숫자)

fun main(){
   //Data class의 객체들이 담긴 list 작성
   val list = listOf(Data("란",111), Data("라니",222), Data("아이른",333)) 
    
   //리스트에 담긴 Data객체의 내용을 for문에서 모두 순회 
   //두 개의 속성을 받을 수 있는 이름을 지정 : (a,b)
   for((a,b) in list){
       println("${a},${b}")
   }
   //내부적으로는 component1():a , component2():b 라는 함수를 사용하여 순서대로 값을 불러오게 됨 
}

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

<print>
란,111
라니,222
아이른,333

//===========비교===========

data class Test(
    val id: Int = 0,
    val name: String = "hello"
)

fun main() {
    val list = listOf(
        Test(1, "a"),
        Test(id = 2, name = "b")
    )

    for((id, name) in list){
        println("$id $name")
    }
/*
    for(i in 0 until list.size){
        println("${list[i].id} ${list[i].name}")   
    }
*/    
}

<print>
1 a
2 b

 


2. 열거 클래스(Enum class)  

  • enumerated type, 열거형의 준말로 enum class 내에 상태를 구분하기 위한 객체들에 이름을 붙여 여러개 생성해두고 
    그 중 하나의 상태를 선택하여 나타내기 위한 클래스
enum class Color{
    RED,
    BLUE,
    GREEN
} 
//특이한 형태이지만 모두 enum class인 Color의 객체를 생성하기 위한 선언

 

  • enum class 객체들은 관행적으로 상수를 나타낼 때 사용하는 대문자로 기술하고, 고유한 속성을 가질 수 있음
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 == Colot.RED
}
//이때는 객체의 선언이 끝나는 위치에 :을 추가한 후 함수를 기술하면 된다
  • enum class 동작 확인
fun main() {
    println(클래스1.C.toString()) // 출력: C
    println(클래스2.KOTLIN.code) // 출력: 30
    println(클래스2.KOTLIN.name) // 출력: KOTLIN
}

enum class 클래스1 {
    C, JAVA, KOTLIN
}

enum class 클래스2(val code: Int) {
    C(10),
    JAVA(20),
    KOTLIN(30)
}
fun main(){
    //초기값 설정
    var state = State.SING
    println(state)
    //선언시에 만든 객체를 이름으로 참조하여 그대로 사용
    
    //state 값을 State.SLEEP으로 바꿈 
    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
}

<print>
SING//enum변수를 그대로 출력할 때는 toString()을 통해 상태 객체의 이름이 출력
true//같은 객체끼리 비료했기 때문에 true가 반환
밥을 먹습니다//EAT객체의 message 속성이 담긴 밥을 먹습니다가 출력