- 특별한 기능을 가진 Class 2개
Data Class
정의
- 데이터를 다루는 데에 최적화된 class로 ‘5가지 기능’을 내부적으로 자동으로 생성
5가지 기능
- equals(): 내용의 동일성 판단
- hashcode(): 객체의 내용에서 고유한 코드 생성
- toString(): 포함된 속성을 보기쉽게 나타내줌
- copy(): 객체를 복사하여 똑같은 내용의 새 객체 생성
- parameter가 없다면 똑같은 내용으로 생성, parameter가 있다면 해당 parameter를 교체하여 생성
- ex) val a = Data(“A”, 7)
- a.copy(“B”): Data(“B”, 7)로 생성
- a.copy()하면 Data(“A”, 7)로 생성
- 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은 선언시에 만든 객체를 이름으로 참조하여 그대로 사용
성질
- Enum 객체들은 고유한 속성을 가질 수 있다.
- Enum의 생성자를 만들어 속성을 받도록 하면 객체를 선언할 때 속성도 설정할 수 있다.
- 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 == 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)
}