일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 26 | 27 | 28 | 29 | 30 | 31 |
- kotlin recyclerview
- 컬렉션함수
- 코틀린 컬렉션함수
- programmers # 프로그래머스 #큰수비교 #cmp_to_key()
- 내용의동일성
- collection function
- kakao blind
- 코틀린 제너릭
- 코틀린 람다함수
- 코틀린 중첩클래스
- kotlin collection
- class
- 카카오 순위검색
- 프로그래머스
- kotlin listview
- lateinit
- 코틀린 data class
- 코틀린 lateinit
- 코틀린 문자열
- Kotlin
- add view
- kotlin addview
- 프로그래머스 #탐욕법 #큰수만들기 #join #python
- isNullOrBlank
- 코틀린
- 객체의 동일성
- Kotlin Generic
- 해시
- 컬렉션 함수
- 코틀린 내부 클래스
- Today
- Total
엔지니어 규의 IT 프로그래밍 다이어리
[Kotlin]24. Data class 와 Enum Class 본문
Data class
데이터 클래스는 데이터를 다루는 데에 최적화된 클래스로, 5가지 기능을 내부적으로 자동으로 생성해준다.
첫번째 : 내용의 동일성을 판단하는 equals() 의 자동구현
두번째 : 객체의 내용에서 고유한 코드를 생성하는 hashcode() 의 자동구현
세번째 : 포함된 속성을 보기쉽게 나타내는 toString()의 자동구현
네번째 : 객체를 복사하여 똑같은 내용의 새 객체를 만드는 copy()의 자동구현
다섯째 : 속성을 순서대로 반환하는 componentX()의 자동구현
fun main(){
val a = General("보영",212)
println(a == General("보영",212)) //false
println(a.hashCode()) // 980546781
println(a) // General@3a71f4dd
val b= Data("루다",386)
println( b== Data("루다",386)) //true
println(b.hashCode()) // 46909958
println(b) // Data(name=루다, id=386)
println(b.copy()) //Data(name=루다, id=386)
println(b.copy("아린")) //Data(name=아린, id=386)
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 는 equals(), hashCode(), toString() 함수의 결과가 제대로 구현되지 않는 반면,
data 클래스로 만든 b는 세 함수 모두 의미있는 기능으로 자동 구현되어 있음을 알 수 있으며
copy 함수를 통해 원본을 복사한 새 객체 역시 쉽게 만들 수 있음을 알 수 있다.
copy 함수를 통해 새객체를 형성할 때는 b.copy() 처럼 똑같은 내용의 객체를 생성 할 수도 있지만 b.copy("아린") 처럼
생성자와 똑같은 형태의 파라미터를 주어 일부 속성을 변경할 수 있다.
이제 componentX() 계열 함수의 동작을 확인해보자.
componentX() 는 data 클래스 객체의 속성의 내용을 component1(), component2() 같은 함수로 반환한다.
이 함수는 사용자가 직접 호출하기 위한 함수가 아닌 listof(Data("A",7), Data("B",3)) 처럼 배열이나 list 등에
Data 클래스 객체가 담겨 있을때 이 내용을 자동으로 꺼내쓸 수 있는 기능을 지원하기 위한 함수이다.
fun main(){
val list = listOf(
Data("보영",212),
Data("루다",306),
Data("아린",618))
for ((a, b) in list){
println("${a},${b}")
}
/*
보영,212
루다,306
아린,618
*/
}
class General(val name: String, val id : Int)
data class Data(val name: String, val id: Int)
위의 코드에서 list에 담긴 Data 객체의 내용을 for 문에서 모두 순회하려면
두개의 속성을 받을 수 있는 이름(a,b) 을 지정하여 in 앞에 써주면되고,
이렇게하면 내부적으로는 component1(), component2()라는 함수를 사용하여 순서대로 값을 불러오게 된다.
위 코드를 실행하면 리스트에서 각각의 Data 객체를 참조하여 속성을 모두 출력했음을 알 수 있다.
Enum Class
enumerated type, '열거형' 의 준말로 enum 클래스 내에 상태를 구분하기 위한 객체들을 이름을 붙여 여러개 생성해두고
그중 하나의 객체를 선택하여 나타내기 위한 클래스 이다.
enum class 에는 다음과 같은 특징이 있다.
첫째 : enum 클래스 안의 객체들은 관행적으로 상수를 나타낼때 사용하는 대문자로 기술한다.
둘째 : enum의 객체들은 고유한 속성을 가질수 잇는데, enum의 생성자를 만들어 속성을 받도록 하면,
객체를 선언할때 속성도 설정할 수 있다.
셋째 : 일반클래스 처럼 함수도 추가할 수 있다. 이때는 객체의 선언이 끝나는 위치에 세미콜론을 추가한 후 함수를 기술하면 된다.
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
}
위코드를 실행하면
enum 변수를 그대로 출력할때는 toString()을 통해 상태 객체의 이름이 출력되고,
같은 객체끼리 비교하였을때는 true 가 반환되었으며
Eat 객체의 메세지가 담긴 "밥을 먹습니다." 가 출력된것을 알 수 있다.
data class 와 enum class 는 일반 클래스에서 제공되지 않는 특정한 용도의 기능을 제공하므로, 여러가지 상황에서 사용할 수 있다.
'프로그래밍 언어 > 코틀린' 카테고리의 다른 글
[Kotlin] 26. 컬렉션 함수(1) (0) | 2022.06.02 |
---|---|
[Kotlin] 25. Set 과 Map (0) | 2022.06.01 |
[Kotlin] 23. 중첩 클래스와 내부클래스 (1) | 2022.05.31 |
[Kotlin] 22. 함수의 argument를 다루는 방법과 infix 함수 (0) | 2022.05.31 |
[Kotlin] 21. Null 값을 처리하는 방법, 변수가 동일한지 확인하는 방법(난이도 : ★★★) (0) | 2022.05.29 |