Data Class
: 데이터를 다루는 데 최적화된 클래스
5가지 기능을 내부적으로 자동으로 생성해준다.
1. 내용의 동일성을 판단하는 equals() 자동구현
2. 객체의 내용에서 고유한 코드를 생성하는 hashcode()의 자동구현
3. 포함된 속성을 보기쉽게 나타내는 toString()의 자동구현
4. 객체를 복사하여 똑같은 내용의 새 객체를 만드는 copy()의 자동구현
copy() 함수를 통해 새 객체를 생성할 때는 아무 파라미터가 없으면 똑같은 내용으로 생성함
val a = Data("A", 7)
val b = a.copy()
파라미터가 있다면 해당 파라미터를 교체하여 생성함
val a = Data("A", 7)
val b = a.copy("B") // b는 Data("B", 7)으로 생성됨
5. 속성을 순서대로 반환하는 componentX()의 자동구현
Data(”A”, 7) → “A” : component1() / 7 : component2()
이 함수는 사용자가 직접 호출하기 위한 함수가 아닌 배열이나 리스트 등에 데이터 클래스의 객체가 담겨 있을 때
listOf(Data(”A”, 7), Data(”B”, 1))
이 내용을 자동으로 꺼내 쓸 수 있는 기능을 지원하기 위한 함수들이다.
fun main(){
val a = General("보영", 212)
println(a == General("보영", 212)) // false
println(a.hashCode()) // 681842940
println(a) // General@28a418fc
val b = Data("루다", 306))
println(b == Data("루다", 306)) // true
println(b.hashCode()) // 46909878
println(b) // Data(name=루다, id=306)
println(b.copy()) // Data(name=루다, id=306)
println(b.copy("아린")) // Data(name=아린, id=306)
println(b.copy(id = 618)) // Data(name=루다, id=618)
}
class General(val name: String, val id: Int)
data class Data(val name: String, val id: Int)
일반 클래스로 만든 a는 equls()나 hashCode(), toString() 함수의 결과가 제대로 구현되지 않은 반면 data 클래스로 만든 b는 세 함수 모두 의미있는 기능으로 자동 구현되어 있으며 copy() 함수를 통해 원본을 복사한 새 객체 역시 쉽게 만들 수 있음을 알 수 있다.
fun main(){
val list = listOf(Data("보영", 212),
Data("루다", 306),
Data("아린", 618))
for((a, b) in list){
println("${a}, ${b}")
}
}
class General(val name: String, val id: Int)
data class Data(val name: String, val id: Int)
// 출력 :
// 보영, 212
// 루다, 306
// 아린, 618
Enum Class
enumerated type (’열거형’의 준말)
선언
enum class Color{
RED,
BLUE,
GREEN
}
enum 클래스 안의 객체들은 관행적으로 상수를 나타낼 때 사용하는 대문자로 기술한다.
사용
Color.RED
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
}
fun main(){
var state = State.SING
println(state) // SING
state = State.SLEEP
println(state.isSleeping()) // true
state = State.EAT
println(state.message) // 밥을 먹습니다
}
enum class State(val message: String){
SING("노래를 부릅니다"),
EAT("밥을 먹습니다"),
SLEEP("잠을 잡니다");
fun isSleeping() = this == State.SLEEP
}
'Language > Kotlin' 카테고리의 다른 글
[Kotlin] 컬렉션 함수 (1) (0) | 2023.09.22 |
---|---|
[Kotlin] 컬렉션(2) Set과 Map (0) | 2023.09.22 |
[Kotlin] 중첩클래스와 내부클래스 (0) | 2023.09.20 |
[Kotlin] 함수의 다양한 기능 (0) | 2023.09.20 |
[Kotlin] null 처리와 동일성의 확인 (0) | 2023.09.19 |