본문 바로가기
코틀린 문법

17. Data Class와 Enum Class

by 농농씨 2023. 5. 14.

참조: 유튜브 디모의 코틀린

코드테스트사이트:play.kotlinlang.org

단축키(맥북):

맥북 스크린샷 바로 클립보드에 붙여넣기

-control+command+shift+3 or 4(3은 전체화면, 4는 마우스로 지정한 영역, 4일때 스페이스바 누르면 창캡처가능)

화면에 분할해놓은 창끼리 이동

-command+'

한 창에서 탭끼리 이동

-command+shift

 

//특별한 기능이나 형태를 가진 클래스들을 알아보자
//Data class
//:데이터 다루는 데에 최적화된 class, '5가지 기능'을 내부적으로 자동생성함
// 5가지
// -equals():내용의 동일성을 판단
// -hashCode():객체의 내용에서 고유한 코드를 생성
// -toString():포함된 속성을 보기쉽게 나타냄
// -copy():객체를 복사하여 똑같은 내용의 새 객체를 만듦
//         *copy()함수 통해 새 객체 생성할 때는
//         아무패러미터가 없으면 똑같은 내용으로 생성함
//         ex.val a=Data("A",7)
//            val b=a.copy
//         패러미터가 있다면 해당 패러미터를 교체하여 생성함
//         ex.val b=a.copy("B")
//            -->b는 Data("B",7)로 생성됨 
// -componentX():속성을 순서대로 반환함
//     copy()함수의 예시에서
//     "A"를 component1(), 7을 component2()같은 내용으로
//     속성의 내용을 반환함
//사실 사용자가 직접 호출하기 위한 함수가 아닌, 배열이나 리스트 등에
//데이터 클래스의 객체가 담겨있을 때,
// ex)listOf(Data("A",7),Data("B",1))
//이 내용을 자동으로 꺼내쓸 수 있는 기능을 지원하기 위한 함수들임

 



//일반 클래스와 데이터 클래스의 기능을 1:1로 비교해보자
fun main(){
    
    val a=General("보영",212)
    //일반클래스의 객체 하나 만들고
    
    println(a==General("보영",212))//??이게몰깡 훔..
    //equals()함수 있는지 테스트
    //a와 똑같이 만든 객체와 내용이 동일한지 비교하여 출력
    println(a.hashCode())
    //해쉬코드() 함수값 출력해봄
    println(a)
    //toString 결과값 보기 위해 a 그대로 출력해봄
    
    val b=Data("루다",306)
    //데이터 클래스 객체 생성
    
    println(b==Data("루다",306))
    println(b.hashCode())
    println(b)
    
    println(b.copy())//copy()함수 사용
    println(b.copy("아린"))//copy()함수로 속성 바꿔서 생성도 해봄
    println(b.copy(id=618))
    //named agrument를 통해 아이디만 바꿔서 출력해봄
    
}

class General(val name:String, val id:Int)
    //일반 클래스 만들고 이름과 id 받음

data class Data(val name:String, val id:Int)
    //데이터클래스 만들고 똑같이 이름과 아이디 받아봄
    


//실행결과 보면
//일반클래스로 만든 a는 equals()나 hashCode(),toString()
//함수의 결과가 제대로 구현되지 않은 반면 
//data클래스로 만든 b는 세 함수 모두 의미있는 기능으로 자동 구현됨
//copy()함수 역시 원본을 복사한 새 객체를 쉽게 만들 수 있음    

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

fun main(){
    
    val list = listOf(Data("보영",212),
       Data("루다",306),
       Data("아린",618))
                      //데이터 클래스의 객체들이 담긴 list 작성
    //이 리스트에 담긴 Data객체의 내용을 for문에서 모두 순회하려면 (?)
    //두개의 속성을 받을 수 있는 이름(a,b)을 지정하여 in앞에 써주면 됨
    for((a,b) in list)
    {
        println("${a}, ${b}")//아 a가 component1() b가 comopnent2()에 대응하나보다
    }
    //이렇게 하면 내부적으로 component1(),component(2)라는 함수 사용하여
    //순서대로 값을 불러오게 됨
    
    //실행해보면
    //리스트에서 각각의 Data객체를 참조하여 속성을 모두 출력하였음을 알수있음
    
    
}

class General(val name:String, val id:Int)
    //일반 클래스 만들고 이름과 id 받음

data class Data(val name:String, val id:Int)
    //데이터클래스 만들고 똑같이 이름과 아이디 받아봄

 


//Enum class(이늄 클래스)
//enumerated type(열거형)의 준말로
//이늄 클래스 내에 상태를 구분하기 위한 객체들을 이름을 붙여
//여러개 생성해두고 그중 하나의 상태를 선택하여 나타내기 위한 클래스
//ex. enum class Color{
//       RED,
//       BLUE,
//       GREEN
//       *특이한 형태이지만 모두 enum class인 Color의 객체를
//       생성하기 위한 선언이다.
//    }
//enum클래스 안의 객체들은 관행적으로 상수를 나타낼 때 사용하는
// '대문자로 기술'한다.
//또한, enum의 객체들은 고유한 속성을 가질 수 있다.
//enum의 생성자를 만들어 속성을 받도록 하면,
// 객체를 선언할때 속성(1,2,3처럼)도 설정할 수 있다.
//또, 일반 클래스처럼 함수도 추가할수있다.
//ex. enum class Color(val number:Int){
//       RED(1),
//       BLUE(2),
//       GREEN(3); //세미콜론 추가하고 함수 기술할 수 있음
//       
//       fun isRed()=this==Color.RED
//    }

fun main(){
   
    var state = State.SING
    //변수에 초기값으로 State.SING 넣어줌
    //*enum은 선언시에 만든 객체를 이름으로 참조하여 그대로 사용하게 됨
    println(state)//그대로 출력해보자
    //-->SING으로 출력됨.
    
    state = State.SLEEP
    //변수의 값을 SING대신 SLEEP으로 바꿔줌
    println(state.isSleeping())
    //함수 수행해서 잠자는지 여부를 출력
    //-->true라고 출력됨
    
    state = State.EAT
    println(state.message)
    //한번더 변수값(?) 변경하고 메시지 출력하기
    //-->"밥을 먹습니다"라고 출력됨
    
    //enum변수를 그대로 출력할 때는
    // toStrng()을 통해 '상태 객체의 이름'이 출력되고 
    //같은 객체끼리 비교했기 때문에 true가 반환되었으며
    //EAT객체의 message속성에 담긴 "밥을 먹습니다"가 출력됨
    
}

enum class State(val message:String){
    //enum클래스 만들고 String으로 속성 하나 받음
    //이제 객체 나열해보자
    SING("노래를 부릅니다"),//객체 만들고 message속성 넣음
    EAT("밥을 먹습니다"),
    SLEEP("잠을 잡니다");
    
    fun isSleeping()=this==State.SLEEP
    //잠을 자는지 여부를
    //boolean값을 반환하는 함수인 isSleeping을 만들어보자
    //이때, 비교할 대상은 State객체 자기자신이므로 'this'로
    //해주어야함
}

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