: 데이터를 다루는 데에 최적화된 class로 5가지 기능을 내부적으로 자동으로 생성
val a = Data("A", 7)
val b = a.copy() -> ("A", 7)
val c = a.copy("B") -> ("B", 7)=> 이 함수는 사용자가 직접 호출하기 위한 함수가 아닌 배열이나 리스트에 데이터 클래스의 객체가 담겨있을 때 이 내용을 자동으로 꺼내 쓸 수 있는 기능을 지원하기 위한 함수들

일반 클래스로 만든 a는 equals()나 hashCode(), toString() 결과가 제대로 안나왔지만 Data class로 생성한 b 클래스는 잘 나오는 것으로 확인된다.

또한 Data 클래스 리스트의 경우 반복문을 통해 인덱스 a, b를 component1, component2라는 함수를 사용하여 순서대로 값을 불러오게 된다.

: 열거형의 줄임말
: 상태를 구분하기위한 객체들을 이름을 붙여 여러개 생성해두고, 그 중 하나의 상태를 선택하여 나타내기 위한 클래스
: enum 클래스 안의 객체들은 관행적으로 상수를 나타낼 때 사용하는 대문자로 기술
: enum의 객체들은 고유한 속성을 가짐
enum class Color (val number: Int) {
RED(1),
BLUE(2),
GREEN(3);
fun isRed() = this == Color.RED
}
이런 형태로 enum 클래스에 속성을 받도록 하면 각 객체들에 속성도 설정 가능하다.
또한 일반 클래스처럼 함수도 선언 가능한데, 그러기 위해서는 마지막 객체에 ";"을 넣어줘야 한다.

state 변수의 SING 객체를 넣어주고, 출력하면 객체 이름이 반환되는 것을 알 수 있다.
그리고 SLEEP으로 설정 후 isSleeping함수 호출 시 State 클래스의 SLEEP과 비교하기 때문에 같음으로 true 반환한다.
마지막으로 EAT객체로 바꾼 후 State객체의 message 속성을 넣으면 해당 객체의 string 값이 반환되는 것을 알 수 있다.