본문 바로가기

공부 자료/코틀린[Kotlin]

[Atomic 35 ] 데이터 클래스 (feat. data class 클래스명)

반복적인 코딩을 줄여주는 코틀린

 

class 매커니즘이 상당 부분의 일을 덜어주지만,

데이터를 저장하는 것이 주 목적인 클래스의 경우 여전히 반복적인 코드를 작성해야 하는데,

코틀린에서는 데이터 저장만 하는 클래스가 필요할 경우 data 클래스를 사용해 코드를 줄이고 공통 작업을 편하게 수행할 수 있도록 해준다.

오늘은 데이터 클래스에 대한 아톰을 학습할 예정이다.

 


 

[ 데이터 클래스 ]

데이터 클래스

: 클래스 앞에 data 키워드 사용

: 모든 생성자 파라미터를 var / val로 선언

: toString() 코드를 추가 작성하지 않아도 객체를 더 읽고 보기 쉬운 형식으로 제공

: equals()가 자동 생성

: copy() 함수로 해당 데이터 클래스의 데이터를 포함하는 새로운 객체 생성 가능하며, 값을 새로 지정할 경우 이름 있는 인자를 통해 지정 가능

 

 

[ 기본 데이터 클래스 예시 ]

data class Simple(
	val arg1:String.
    var args:Int
)

fun main(){
	val s1 = Simple("Hi", 29)
    val s2 = Simple("Hi", 29)
    s1 eq "Simple(arg1=Hi, args=29)"
    s1 eq s2 // 그냥 클래스의 경우 주소값을 의미하기 때문에 eq가 아닌 neq가 됨
}

 

: 객체를 읽기 쉬운 형식으로 제공하기 때문에 각 객체는 데이터가 동일할 경우 동일한 객체로 취급

: 기존 클래스의 경우에는 주소값을 의미하기 때문에 eq가 될 수 없음

 

 

[ copy() ]

import atomictest.eq

data class DetailedContact(
	val name:String,
    val surname:String,
    val number:String,
    val address:String
)

fun main(){
	val contact = DetailedContact("Miffy", "Miller", "1-234-567890",
    					"1600 Amphitheatre Parkway")
    val newContact = contact.copy(
    		number="098-765-4321", address="Brandschenkestrasse 110")
    
    newContact eq 
    	DetailedContact("Miffy", "Miller", "098-765-4321", "Brandschenkestrasse 110")
}

 

: 변경하고 싶은 인자만 이름 붙은 인자로 지정하면 나머지는 그대로 유지됨

 

 

[ HashMap / HashSet의 키로 활용 ]

import atomictest.eq

data class Key(val name: String, val id: Int)
fun main() {
	val korvo: Key = Key("Korvo", 19)
    korvo.hashCode() eq -2041757108
    
	val map = HashMap<Key, StringX)
    map[korvo] = "Alien"
	map[korvo] eq "Alien"
    
	val set = HashSet<Key>() set.add(korvo)
    set.contains(korvo) eq true
}

 

: 올바른 hashCode()를 직접 작성하는 것은 까다롭고 실수하기 쉬우나, 이것을 data 클래스가 대신 해주면 꽤 편리함

 


 

[ 오늘의 학습 소감 ]

 

오늘은 데이터 클래스에 대한 학습을 진행했다. 데이터 저장만 하는 클래스라는 점을 제외하고는 선언하는 방식은 기존 클래스와 많이 다르지 않은데, 여러가지 제공해 주는 것들이 기존 클래스와 어떻게 다른지에 대한 파악은 필요할 것 같은 학습 내용이 있었다. 그렇기에 이 데이터 클래스가 어떻게 활용될 수 있을지도 생각해보는 시간이 필요할 것으로 보인다.