1. 데이터 클래스
데이터 클래스는 데이터 저장을 담당하는 클래스로 data 클래스를 사용하면 코드양을 줄이며 여러 공통 작업을 편하게 수행할 수 있습니다.
data 클래스를 정의할 때에는 data키워드를 사용하며 모든 생성자 파라미터를 var이나 val로 선언해야 합니다.
data class MemberResponse(
val name: String,
val email: String
)
fun main() {
val member1 = MemberResponse("준준", "jun@naver.com")
val member2 = MemberResponse("민민", "min@naver.com")
println(member1)
println(member2)
}
위의 예제의 실행결과를 통해 data클래스의 특징을 살펴볼 수 있는데
data클래스에 의해 만들어진 문자열은 파라미터의 이름과 객체에 담긴 내용이 표시됩니다.
toString()을 추가로 작성하지 않아도 객체를 더 읽기 쉽고 보기 좋은 형식으로 표현해준다.
1-1 data 클래스의 인스턴스의 동등 비교
fun main() {
val member1 = MemberResponse("준준", "jun@naver.com")
val member2 = MemberResponse("준준", "jun@naver.com")
when (member1 == member2) {
true -> println("같은 유저입니다")
else -> println("다른 유저입니다")
}
}
같은 데이터(모든 프로퍼티의 값이 같은)를 포함하는 data클래스 인스턴스의 동등 비교의 경우 equals()가 자동으로 생성되며 생성자 파라미터에 열거된 모든 프로퍼티가 같은지 검사하는 식으로 구현됩니다.
일반 클래스인 Member 클래스의 경우
class Member(val name : String)
fun main() {
val member1 = Member("민민")
val member2 = Member("민민")
when (member1 == member2) {
true -> println("같은 유저입니다")
else -> println("다른 유저입니다")
}
println(member1)
println(member2)
}
Member 클래스는 프로퍼티의 값이 동일한지 비교하는 것이 아닌 참조값을 비교하기 때문에 두 인스턴스가 서로 동등하지 않는 것을 확인할 수 있습니다.
1-2 copy 메서드
fun main() {
val member1 = MemberResponse("준준", "jun@naver.com")
val member2 = member1.copy(email = "1234@naver.com")
println(member2) // MemberResponse(name=준준, email=1234@naver.com) 출력
}
data class MemberResponse(
val name: String,
val email: String
)
copy메서드를 사용하면 현재 객체의 모든 데이터를 포함하는 새 객체를 생성할 수 있습니다.
추가로 이렇게 새 객체를 생성할 때, 변경하고 싶은 인자를 지정해 값을 새로 지정할 수 있습니다.
1-3 데이터 클래스의 제약 사항
최소 하나의 프로퍼티가 존재해야 합니다.
프로퍼티는 반드시 val 또는 val로 선언해야합니다.
데이터 클래스는 기본적으로 final이기 때문에 상속이 불가능합니다. open, abstract, sealed, inner 키워드 사용 불가
2. 구조 분해 선언
구조 분해 선언은 객체 구성 요소를 분해해 개별 변수에 한 번에 할당할 수 있는 문법입니다.
fun main() {
val (value, description) = evaluate(7)
println("value = $value, description = $description") //value = 14, description = High 출력
}
data class Computation(
val data: Int,
val info: String
)
fun evaluate(input: Int) =
if(input > 5)
Computation(input * 2, "High")
else
Computation(input * 2, "Low")
위 코드에서 value와 description 변수는 evaluate() 함수로 생성된 Computation 인스턴스로부터 각각 값을 가져옵니다.
data 클래스의 프로퍼티는 이름에 의해 대입되는 것이 아닌 순서대로 되입되기 때문에 주의해야합니다.
2-1 컬렉션에서 사용
구조 분해는 컬렉션의 요소를 반복 처리할 때 유용하게 사용할 수 있습니다.
fun main() {
val map = mapOf("준준" to 25, "민민" to 30)
for ((name, age) in map) {
println("$name is $age years old.")
}
}
준준 is 25 years old.
민민 is 30 years old.
2-2 주의 사항
일부 데이터를 사용하지 않을 경우 _를 활용해 무시할 수 있습니다.
fun main() {
val (value, _) = evaluate(7)
println("value = $value") //value = 14
}
data class Computation(
val data: Int,
val info: String
)
fun evaluate(input: Int) =
if(input > 5)
Computation(input * 2, "High")
else
Computation(input * 2, "Low")
data클래스가 아니거나 componentN() 메서드가 없으면 사용할 수 없습니다.
data 클래스는 자동으로 componentN() 메서드를 생성한다. 이 메서드들이 구조 분해 선언에 활용됨
3. 총정리
데이터 클래스는 데이터 저장 및 처리 작업을 간단하게 만들어주는 코틀린의 핵심 기능
- 간결한 구현: data 키워드를 통해 toString(), equals(), hashCode(), copy() 메서드를 자동으로 생성
- 동등 비교: 값 자체를 비교하는 equals()가 자동 구현되어 객체 내용이 같다면 동등하다고 판단
- 복사 기능: copy() 메서드를 사용해 일부 데이터만 수정하며 새로운 객체를 쉽게 생성 가능
구조 분해 선언은 객체의 데이터를 변수로 쉽게 분리하여 활용할 수 있도록 도와주는 문법
- 자동 구성: 데이터 클래스가 제공하는 componentN() 메서드 덕분에 프로퍼티를 분해하여 변수에 할당함
- 컬렉션에서 활용: 맵 또는 리스트의 데이터를 구조 분해하여 반복 작업을 간편하게 수행
'Kotlin 정리' 카테고리의 다른 글
[Kotlin 공부 9일차] 인터페이스 (0) | 2024.12.17 |
---|---|
[Kotlin 공부 8일차] 널이 될 수 있는 타입 (0) | 2024.12.12 |
[Kotlin 공부 6일차] 오버로딩, when (0) | 2024.12.06 |
[Kotlin 공부 5일차] 확장 함수, 이름 붙은 인자와 디폴트 인자 (0) | 2024.12.04 |
[Kotlin 공부 4일차] 객체, 클래스, 생성자 (0) | 2024.12.02 |