Data 클래스
데이터를 다루는 데에 최적화된 class로 '5가지 기능'을 내부적으로 자동으로 생성해준다.
- 내용의 동일성 판단하는 equals( )의 자동구현
- 객체의 내용에서 고유한 코드(해쉬코드)를 생성하는 hashCode( )의 자동구현
- 포함된 속성을 보기쉽게 나타내는 toString( ) 의 자동구현
- 객체를 복사하여 똑같은 내용의 새 객체를 만드는 copy( )의 자동구현
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. 속성을 순서대로 반환하는 component()의 자동구현
Data("A", 7)
component1( ), component2( ) 같은 함수로 속성의 내용을 반환한다
사실 이 함수는 사용자가 직접 호출하기 위한 함수가 아닌 배열이나 리스트등의 데이터 클래스의 객체가 담겨 있을 때 이 내용을 자동으로 꺼내 쓸 수 있는 기능을 지원하기 위한 함수들이다.
listOf(Data("A",7), Data("B",1))
equals, hashCode, toString, copy 사용예제
fun main(){
val a = General("보영", 212)
println(a == General("보영",212)) //false 비정상 출력
println(a.hashCode()) // 고유한 코드인지 아닌지 모르나 제대로 출력이 안된다함!
println(a) //객체의 속성이 제대로 출력되지않고 쓰레기값이 비정상 출력됨
val b = Data("루다", 306)
println(b == Data("루다", 306)) //true 정상출력
println(b.hashCode()) // 고유한 코드인지 아닌지 모르나 제대로 출력이 된다함!
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)
componentX( ) 계열의 함수 사용예제(직접 사용하는건 아님, 내부적으로 사용)
fun main(){
val list = listOf(Data("보영", 212),
Data("루다", 306),
Data("아린", 618))
for((a,b) in list){ // for문에서 두 개의 속성을 받을 수 있는 방법!
// 내부적으로는 component1( ), component2( ) 라는 함수를
// 사용하여 순서대로 값을 불러오게 된다!
println("${a}, ${b}")
}
}
class General(val name: String, val id: Int)
data class Data(val name: String, val id: Int)
Enum 클래스 (열거형, enumerated type)
이늄 클래스는 이늄 클래스내에 상태를 구분하기위한 객체들을 이름을 붙여 여러 개 생성해두고 그중 하나의 하나의 상태를 선택하여 나타내기 위한 클래스이다.
이늄의 기본 사용법
enum class Color{
RED,
BLUE,
GREEN
}
특이한 형태지만 모두 enum class인 Color 객체를 생성하기 위한 선언이다.
이늄 클래스 안의 객체들은 관행적으로 상수를 나타낼 때 사용하는 대문자로 기술한다.
Enum의 생성자, 이늄의 객체들의 속성
이늄의 객체들은 고유한 속성을 가질 수 있다.
enum class Color(val number: Int){
RED(1),
BLUE(2),
GREEN(3)
}
이늄의 생성자를 만들어 속성을 받도록 하면 객체를 선언할 때 속성도 설정할 수 있다.
Enum의 함수추가
또한 일반 클래스처럼 함수도 추가할 수 있다.
enum class Color(val number: Int){
RED(1),
BLUE(2),
GREEN(3); // 세미콜론을 추가한 후 함수를 기술해야 한다.
fun isRed( ) = this == color.RED
}
Enum의 활용 예제
fun main(){
var state = State.SING
println(state)
state = State.SLEEP
println(state.isSleeping())
state = State.EAT
println(state.message)
}
enum class State(val message: String){
SING("노래를 부릅니다"),
EAT("밥을 먹습니다"),
SLEEP("잠을 잡니다");
fun isSleeping() = this == State.SLEEP // 잠을 자는지 여부를 boolean값으로 반환
// * 이때 비교할 대상은 State 객체 자기 자신이므로 this로 해주어야 한다
}
enum은 어떤 상황에서 쓰이는가?
하나의 카테고리에 해당하는 여러개의 분류 객체를 미리 클래스로 만들때 사용한다.
enum 으로 만들면 클래스이름.객체명으로 참조할 수 있기 때문에 분류내에 어떤 객체가 있는지를 코드를 보는 다른 사람도 명확히 알 수 있으며, 영상에서 나온것 처럼 enum으로 상태를 미리 분류해 두면 상태가 바뀔때마다 변수값을 바꾸어두고 if 문이나 when 등의 조건문에서 현재 상태를 편리하게 확인해 볼 수 있다.
예제는 일반적으로 state machine 형태의 코드에서 흔히 쓰이는 방법이다.
data class 와 enum class는 일반 클래스에서 제공되지 않는 특정한 용도의 기능들을 제공하고 있으므로 여러가지 상황에서 유용하게 사용해보라.
'코틀린' 카테고리의 다른 글
코틀린(21) - 중첩 클래스, 내부 클래스 (0) | 2022.03.23 |
---|---|
코틀린(20) - 오버로딩, arguments, infix 함수 (0) | 2022.03.23 |
코틀린(19) - null 처리와 동일성의 확인 (0) | 2022.03.23 |
코틀린(18) - 문자열 관련 함수 (0) | 2022.03.23 |
코틀린(17) - 컬렉션 객체, 리스트 (0) | 2022.03.23 |
댓글