반복적인 코딩을 줄여주는 코틀린
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 클래스가 대신 해주면 꽤 편리함
[ 오늘의 학습 소감 ]
오늘은 데이터 클래스에 대한 학습을 진행했다. 데이터 저장만 하는 클래스라는 점을 제외하고는 선언하는 방식은 기존 클래스와 많이 다르지 않은데, 여러가지 제공해 주는 것들이 기존 클래스와 어떻게 다른지에 대한 파악은 필요할 것 같은 학습 내용이 있었다. 그렇기에 이 데이터 클래스가 어떻게 활용될 수 있을지도 생각해보는 시간이 필요할 것으로 보인다.
'공부 자료 > 코틀린[Kotlin]' 카테고리의 다른 글
[Atomic 37] 널이 될 수 있는 타입 (0) | 2024.02.13 |
---|---|
[Atomic 36] 구조 분해 선언 (1) | 2024.02.08 |
[Atomic 34] 이넘(feat. Enum) (0) | 2024.02.06 |
[Atomic 33] When 식 (1) | 2024.02.06 |
[Atomic 32] 오버로딩 (feat. overloading) (1) | 2024.02.05 |