[Kotlin] 기본 예제 5 - data class, enum class, Object Class(Singleton), Companion Object, Sealed Class
1. data class
Kotlin에서 data 클래스는 데이터를 보유하기 위한 목적에 중점을 둔 클래스입니다. 주로 데이터를 담는 컨테이너 역할을 하며, 이러한 클래스에서 일반적으로 필요한 몇 가지 함수들을 자동으로 생성해줍니다.
data 키워드를 사용하여 선언된 클래스는 다음과 같은 기능들이 자동으로 제공됩니다
- equals()/hashCode(): 인스턴스 간의 비교를 위해 equals()와 hashCode() 함수가 자동으로 오버라이드됩니다.
- toString(): 객체의 문자열 표현을 반환하는 toString() 함수가 자동으로 오버라이드됩니다.
- copy(): 객체 복사를 위한 copy() 함수가 제공됩니다.
- Component functions: data class의 프로퍼티에 대해 componentN 함수가 생성되어, destructuring declarations(비구조화 선언)을 지원합니다.
data class User(val name: String, val age: Int)
fun main(){
val user1 = User("John", 25)
val user2 = User("John", 25)
// toString()
println(user1.toString()) // 결과: User(name=John, age=25)
// equals()/hashCode()
println(user1 == user2) // 결과: true
println(user1.equals(user2)) // 결과: true
// copy()
val user3 = user1.copy()
println(user3) // 결과: User(name=John, age=25)
// destructuring declaration
val (name, age) = user1
println("$name is $age years old.") // 결과: John is 25 years old.
}
2. enum class
- kotlin 웹에서 간단히 실습할 수 있는 사이트
https://www.w3schools.com/KOTLIN/trykotlin.php?filename=demo_class_function2
Enum은 "enumeration"의 줄임말로, 명확하게 정의된 값들의 집합을 표현하는데 사용되는 특별한 클래스 타입입니다. Enum 클래스는 고정된 수의 상수를 정의하고, 이들 각각은 Enum 클래스의 인스턴스입니다. Kotlin에서 enum class를 선언하는 방법은 다음과 같습니다.
enum class Direction {
NORTH,
SOUTH,
EAST,
WEST
}
enum class Planet(val mass: Double, val radius: Double) {
MERCURY(3.303e+23, 2.4397e6),
VENUS(4.869e+24, 6.0518e6),
EARTH(5.976e+24, 6.37814e6);
fun surfaceGravity(): Double {
val G = 6.67300E-11
return G * mass / (radius * radius)
}
fun surfaceWeight(otherMass: Double): Double {
return otherMass * surfaceGravity()
}
}
fun main() {
println(Direction.WEST.name) // Output: WEST
println(Direction.WEST.ordinal) // Output: 3
for (dir in Direction.values()) {
println(dir)
}
println(Direction.valueOf("SOUTH")) // Output: SOUTH
println(Planet.EARTH.name) // Output: EARTH
println(Planet.EARTH.ordinal) // Output: 2
println(Planet.EARTH.mass) // Output: 5.976E24
println(Planet.EARTH.radius) // Output: 6.37814e6 == 6378140.0
println(Planet.EARTH.surfaceGravity()) // Output: some calculated value -> 9.802652743337129
println(Planet.EARTH.surfaceWeight(Planet.VENUS.mass)) // Output: some calculated value -> 4.772911620730848E25
}
- 결과 데이터
WEST
3
NORTH
SOUTH
EAST
WEST
SOUTH
EARTH
2
5.976E24
6378140.0
9.802652743337129
4.772911620730848E25
3. Object Class / Singleton
object 키워드를 사용하여 싱글턴 패턴을 쉽게 구현할 수 있습니다. 싱글턴 패턴은 해당 클래스의 인스턴스가 하나만 생성되도록 보장하는 디자인 패턴입니다.
object Singleton {
init {
println("Singleton class invoked.")
}
var variableName="I am Var of Singleton"
fun printVarName(){
println(variableName)
}
}
fun main(args: Array<String>) {
Singleton.printVarName() // 출력 : I am Var of Singleton
}
4. Companion Object
Kotlin은 static 멤버를 직접 지원하지 않기 때문에, companion object 를 사용하여 같은 기능을 구현합니다.
class MyClass {
companion object Factory {
fun create(): MyClass = MyClass()
}
fun checkCreatedClass(){
println("Class created")
}
init{
println("Init block invoked")
}
}
fun main(args:Array<String>){
val instance=MyClass.create()
instance.checkCreatedClass() //출력 : Init block invoked \n Class created
}
5. Sealed Class
Sealed class 는 값이 한정된 set 타입을 나타낼 때 사용합니다. sealed class 자체는 추상클래스이며, 다른 클래스가 상속받아 확장할 수 있는 것으로 선언해야 합니다.
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
object NotANumber : Expr()
fun eval(expr: Expr): Double = when (expr) {
is Const -> expr.number
is