반응형
데이터 클래스
단순히 값을 저장하기 위한 용도로 클래스를 활용하려면 data 키워드를 이용해서 정의할 수 있다.
이 때 유용하게 활용할 수 있는 여러 메소드를 자동으로 구현해준다.
단, 주 생성자에 정의 된 속성만 이용해서 메소드의 내용을 구성한다.
toString : 객체의 내용 문자열 반환
equals : 두 객체의 속성 값 비교(주소 값 비교 x)
copy : 원본 객체 속성 값 복사 된 새로운 객체 생성
hashCode : 객체의 속성 값 비교
componentN: 객체의 속성 값 반환
컬렉션을 사용할 때는 equals, hashCode 등의 메소드가 오버라이딩 되어야 한다(속성 값 동등 비교를 위해)
/* class 앞에 data만 붙여주면 됨 */
data class PersonClass(var name: String, var age: Int)
fun main(){
var p1 = PersonClass("짱구", 17)
var p2 = PersonClass("짱구",17)
var p3 = PersonClass("스폰지밥",16)
/* toStirng */
println(p1.toString())
println(p1)
/* equals
비교 연산자(==)를 이용하면 내부적으로 equals 메소드가 호출 되고
메소드의 인자값으로 비교할 대상 객체가 전달 된다.*/
println(p1 == p1)
println("equals: ${p1.equals(p2)}")
println(p1 == p3)
/* 참조 비교 연산자(===)를 사용하면 두 객체의 참조가 같은지(동일 객체)를 비교한다.*/
println(p1 === p2)
/* copy */
var copied1 = p1.copy()
println(copied1)
println("복사 이후 : ${ p1 === copied1 }")
/* 명명인자를 전달하는 형식으로 속성 값을 전달하면
해당 속성의 내용만 변경 된 복사 객체를 생성할 수 있다.*/
var copied2 = p1.copy(name="네모네모")
var copied3 = p1.copy(age=2)
println("이름만 변경한 복사 객체$copied2")
println("이름만 변경한 복사 객체$copied3")
/* componentN
* 구조 분해 할당을 이용할 때 componentN 메소드가 유용하게 활용된다. */
/* var p1Name = p1.component1()
var p1Age = p1.component2()*/
//위의 주석한 코드와 동일하게 동작하는 코드 p1객체를 분해해서 name. age 하나씩 할당한다~
var (p1Name, p1Age) = p1
println(p1Name)
println(p1Age)
/* hashCode */
println(p1.hashCode())
println(p2.hashCode())
println(p3.hashCode())
}
출력 결과
PersonClass(name=짱구, age=17)
PersonClass(name=짱구, age=17)
true
equals: true
false
false
PersonClass(name=짱구, age=17)
복사 이후 : false
이름만 변경한 복사 객체PersonClass(name=네모네모, age=17)
이름만 변경한 복사 객체PersonClass(name=짱구, age=2)
짱구
17
51057110
51057110
440031487
반응형
'프로그래밍 > Kotlin' 카테고리의 다른 글
[코틀린 / Kotlin] 컬렉션 _ List (add, remove, removeAt, contains, listOf ...) (0) | 2022.10.20 |
---|---|
[코틀린 / Kotlin] 상속과 오버라이딩 (0) | 2022.10.20 |
[코틀린 / Kotlin] lazy 와 lateinit 를 활용한 지연 초기화 (0) | 2022.10.20 |
[코틀린 / Kotlin] getter와 setter (0) | 2022.10.20 |
[코틀린 / Kotlin] open class, private , protected 속성 설정 (0) | 2022.10.20 |