오랜만에 코틀린 포스팅을 해보자!
이번시간에는 코틀린의 data class 와 object에 대해서 알아볼 예정이다.

data class

우리는 가끔 데이터만 저장하고 다른건 하지 않을 때가 많다. 예를들어 java의 getter, setter, hashcode/equals, toString 등 기계적인 작업을 할 때가 많다. 그래서 우리는 java 라이브러리인 lombok을 사용하긴 한다. java는 서드파트에서 지원해주지만 코틀린 경우에는 언어 자체에서 지원해 준다.

기본 문법은 아래와 같다.

data class User(val id: Long, val name: String)

class 앞에 data 키워드를 넣어 주면 된다. data class는 컴파일러가 자동으로 아래와 같은 메서드를 알아서 만들어 준다
– constructor
– getter/setter
– hashcode/equals
– toString
– componentN() functions
– copy() function

val user = User(1, "wonwoo")
println(user.id)
println(user.name)
val hashCode = user.hashCode()
val equals = user.equals(User(2, "test"))
val id = user.component1()
val name = user.component2()
val copy = user.copy(2, "wonwoo1")

위와 같이 생성자와 getter, hashCode, equals, componentN, copy 등이 만들어 졌다.
좀 더 자세히 살펴보자.

생성자

생성자는 기본적으로 파라미터에 따라서 만들어 진다. 예를들어 위와 같은 경우에는 id와 name의 생성자만 존재한다. 예를들어 모든 생성자를 만들고 싶다면 아래와 같이 하면 된다.

data class User(var id: Long? = null, var name: String? = null)

해당 변수에 초기화를 해주면 그에 맞게 생성자를 만들어 준다.

getter, setter

data class의 생성자에는 var혹은 val를 사용해야 된다. 동일하게 var는 읽기 쓰기가 가능하므로 getter, setter모두 생성 되지만 val 경우에는 읽기 전용이므로 getter만 생성 된다.

data class User(val id: Long, var name: String)

val user = User(1, "wonwoo")
user.id = 1 //컴파일 에러
user.name = "wonwoo1"

위의 name은 var로 선언하여 변경이 가능하지만 id 경우에는 val로 선언되어서 변경이 불가능하다.

hashcode/equals 와 toString

자바와 동일하게 hashcode와 equals는 쌍으로 만들어 진다. 물론 구현 또한 비슷하게 구현되어 지지 않나 싶다.
toString의 경우에는 "User(id=1, name=wonwoo)" 와 같은 형태로 구현되어 진다.
딱히 설명할게 없기에 넘어가자.

componentN

다른 언어(스칼라)에서는 Destructuring라고도 불린다.

val id = user.component1()
val name = user.component2()

위와 같이 N번째에 값을 자유롭게 꺼낼수 있다. component1 경우에는 첫 번째 파라미터인 id component2 경우에는 두 번째 파라미터인 name을 꺼내서 사용 할 수 있다. 이 것도 귀찮다 좀 더 깔끔하고 짧게 사용할 수 있다.

val (id, name) = user
println("id : $id name : $name")

위와 같이 각각의 원소들을 순서대로 꺼내서 사용할 수 있다. 좀 더 간편하게 object의 프로퍼티에 접근할 수 있다.

copy

말 그대로 복사를 하는 개념이다. java의 clone과 비슷하다. 조금 다른점은 일부 프로퍼티만 변경하고 나머지는 그대로 유지 할 수 있다는 점이다.

val user = User(1, "wonwoo")
val copy = user.copy(name = "wonwoo1")

위와 같이 id는 기존과 동일하게 하고 name만 wonwoo1로 변경하였다. 여기서 주의할 점은 새로운 user가 다시 생기는거지 기존 user를 변경하는 것은 아니다. 여기서 생소한 것이 보인다. 바로 (name = "wonwoo1") 이부분이다. 요즘 나오는 언어에는 거의 대부분 지원하는 듯하다. named parameters 혹은 Named Arguments 라고 불리는데 필자는 named parameters 라고 알고 있었는데 코틀린 문서에는 Named Arguments라고 있어 추가해서 넣었다.

object

코틀린에서는 static한 함수가 존재 하지 않는다. 하지만 그에 맞게 object라는 것을 지원해주는데 싱글톤 개념이다. 스칼라에서도 object가 있는데 스칼라와 동일한 것으로 보인다.
문법을 살짝 보자.

object Utils {
    fun sum(a: Int, b :Int) = a + b
}

위와 같이 object라는 키워드를 선언하면 된다. class와 문법은 비슷하다. object 뒤에 object명을 기술 해주고 바디를 작성해주면 된다. 사용법은 아래와 같다.

Utils.sum(1,10)

자바의 static 메서드를 호출하듯이 호출 하면 된다. 더 다양하게 사용하는 법은 있지만 아직 필자도 잘 모르기에 나중에 기회가 된다면 설명하도록 하자.

이렇게 간단하게 data class와 object에 대해서 알아봤다. object는 좀 더 봐야 할 듯하다. data class의 경우에는 아주 유용하게 쓰일 것 같다.
다음 시간에는 function에 대해서 살펴 보도록 하자.