코틀린은 안드로이드 개발을 포함한 다양한 영역에서 널리 사용되는 현대적인 프로그래밍 언어로 데이터 클래스(data class)와 씰드 클래스(sealed class)를 지원하는데 이 두 클래스 유형은 코틀린 프로그래밍 언어에서 중요한 역할을 한다
그렇기에 오늘 글에서는 이 두 개념에 대해 자세히 알아보자
데이터 클래스(Data Classes)
코틀린의 데이터 클래스는 데이터 저장과 전달에 최적화된 클래스 유형으로 간결한 구문과 자동 생성된 메소드들을 통해 다양한 데이터를 효율적으로 관리를 할 때 사용한다
1
2
3
4
5
6
7
data class User(val name: String, val age: Int)
fun main() {
val alice = User("Alice", 30)
val (name, age) = alice
println("Name: $name, Age: $age")
}
위 코드처럼 데이터 클래스는 data 키워드를 사용해 선언하고 데이터 클래스로 클래스를 생성하면 자동으로 메소드들이 생성되는데 equals(), hashCode(), toString(), copy() 등의 메소드가 이에 해당한다
이러한 메소드들은 인스턴스 비교와 복제를 단순화할 수 있기에 유용히며 데이터 클래스는 최소 한 개의 매개변수를 갖는 주 생성자가 필요하다
실드 클래스(Sealed Classes)
실드 클래스는 제한된 클래스 계층을 구현하는데 사용되는 클래스로 실드 클래스를 사용하면 타입 안전성을 강화하고 복잡한 상태 또는 연산의 관리를 단순화할 수 있다 뭔가 말이 복잡하니
다 집어치우고 코드로 확인해보자
1
2
3
4
5
6
7
8
9
10
sealed class ApiResponse
data class Success(val data: String): ApiResponse()
data class Error(val message: String): ApiResponse()
fun handleResponse(response: ApiResponse) {
when (response) {
is Success -> println("Success: ${response.data}")
is Error -> println("Error: ${response.message}")
}
}
예제 코드는 위와 같고 실드 클래스는 다음과 같은 특징을 가지고 있는데 실드 클래스의 서브클래스는 실드 클래스와 동일한 파일 내에서만 정의할 수 있으며 when 식과 함께 사용될 때 모든 가능한 케이스를 다루어야 한다
위와 같은 특징을 통해서 실드 클래스는 혹시 모를 처리를 하지 않아서 나올 수 있는 런타임 오류의 가능성을 줄일 수 있고 계층 구조를 더욱 명확하고 관리하기 쉽게 만들 수 있다
이러한 실드 클래스의 서브클래스는 일반 클래스, 데이터 클래스, 심지어 다른 실드 클래스가 될 수 있기에 대다수의 경우의 사용이 가능하다
데이터 클래스와 실드 클래스는 어떨 때 사용할까?
그렇다면 앞에서 배운 데이터 클래스와 실드 클래스는 어떨 때 사용할까?
데이터 클래스 사용: 데이터 클래스는 데이터의 저장 및 전달에 최적화되어 있기에 주로 데이터 전달 객체(Data Transfer Objects, DTOs), 구성 설정, 혹은 다른 간단한 데이터 집합을 표현하는 데 사용된다
실드 클래스 사용: 실드 클래스는 다양한 상태와 그에 대한 처리를 명확하고 안전하게 관리할 수 있게 해주기에 복잡한 비즈니스 로직, 상태 머신, 또는 제한된 타입 집합이 필요한 경우에 사용된다