2025년 12월 31일 작성
Kotlin Class - 간결한 객체 지향 문법
Kotlin class는 간결한 생성자 문법, data class, sealed class, object 등 Java보다 강력하고 간결한 객체 지향 기능을 제공합니다.
Kotlin Class
- Kotlin은 간결하고 강력한 class 시스템을 제공합니다.
- primary constructor로 boilerplate를 줄입니다.
data class,sealed class,object등 특수 class를 지원합니다.- 기본적으로
final이며, 상속하려면open을 명시해야 합니다.
flowchart TD
root[Kotlin Class]
root --> class_constructor[생성자]
root --> special_class[특수 Class]
root --> inheritance[상속]
class_constructor --> primary[Primary Constructor]
class_constructor --> secondary[Secondary Constructor]
special_class --> data_class[Data Class]
special_class --> sealed_class[Sealed Class]
special_class --> object_class[Object]
special_class --> enum_class[Enum Class]
inheritance --> open_class[Open Class]
inheritance --> abstract_class[Abstract Class]
inheritance --> interface[Interface]
Class 선언
classkeyword로 class를 선언합니다.- body가 없으면 중괄호를 생략할 수 있습니다.
class Person
class User {
// properties, methods
}
Primary Constructor
- class 이름 뒤에 constructor를 선언합니다.
val/var로 property를 동시에 선언할 수 있습니다.- Java의 field 선언, 생성자, getter/setter를 한 줄로 대체합니다.
class User(val name: String, var age: Int)
// 위 코드는 아래 Java code와 동일
// public class User {
// private final String name;
// private int age;
// public User(String name, int age) { ... }
// public String getName() { ... }
// public int getAge() { ... }
// public void setAge(int age) { ... }
// }
- default parameter로 여러 생성자를 대체합니다.
class User(
val name: String,
val email: String = "",
val age: Int = 0
)
val user1 = User("Kim")
val user2 = User("Lee", "lee@example.com")
val user3 = User("Park", age = 25)
init Block
- 초기화 logic은
initblock에 작성합니다.- 여러
initblock을 가질 수 있으며 순서대로 실행됩니다.
- 여러
class User(val name: String) {
val upperName: String
init {
require(name.isNotBlank()) { "Name cannot be blank" }
upperName = name.uppercase()
}
}
Data Class
- data class는 data 보관 목적의 class입니다.
equals(),hashCode(),toString(),copy()를 자동 생성합니다.- primary constructor에 최소 하나의 property가 필요합니다.
data class User(val name: String, val age: Int)
val user = User("Kim", 25)
println(user) // User(name=Kim, age=25)
val copy = user.copy(age = 26) // User(name=Kim, age=26)
val (name, age) = user // destructuring
Sealed Class
- sealed class는 제한된 class 계층을 정의합니다.
- 모든 subclass가 compile time에 알려져 있습니다.
when표현식에서else없이 모든 경우를 처리할 수 있습니다.
sealed class Result {
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()
object Loading : Result()
}
fun handle(result: Result): String = when (result) {
is Result.Success -> "Data: ${result.data}"
is Result.Error -> "Error: ${result.message}"
Result.Loading -> "Loading..."
// else 불필요
}
Object
object는 singleton을 선언합니다.- class 선언과 instance 생성을 동시에 처리합니다.
object DatabaseConfig {
val url = "jdbc:mysql://localhost:3306/db"
val maxConnections = 10
fun connect() { /* ... */ }
}
// 사용
val url = DatabaseConfig.url
DatabaseConfig.connect()
Companion Object
- companion object는 class 내부의 singleton입니다.
- Java의
staticmember를 대체합니다. - factory method pattern에 유용합니다.
- Java의
class User private constructor(val name: String) {
companion object {
fun create(name: String): User {
return User(name.trim())
}
}
}
val user = User.create(" Kim ")
상속
- Kotlin class는 기본적으로
final입니다.- 상속을 허용하려면
open을 명시해야 합니다. - method override도
open이 필요합니다.
- 상속을 허용하려면
open class Animal(val name: String) {
open fun speak() = println("...")
}
class Dog(name: String) : Animal(name) {
override fun speak() = println("Woof!")
}
Interface
- interface는 abstract method와 default implementation을 가질 수 있습니다.
- 상태(property)를 가질 수 있지만 backing field는 없습니다.
interface Drawable {
fun draw()
fun describe() = println("Drawable object") // default implementation
}
class Circle : Drawable {
override fun draw() = println("Drawing circle")
}
Abstract Class
- abstract class는 instance를 생성할 수 없습니다.
- abstract member는 subclass에서 반드시 구현해야 합니다.
abstract class Shape {
abstract fun area(): Double
fun describe() = println("Area: ${area()}")
}
class Rectangle(val width: Double, val height: Double) : Shape() {
override fun area() = width * height
}
Visibility Modifier
- Kotlin은 4가지 visibility modifier를 제공합니다.
| modifier | class member | top-level |
|---|---|---|
public (기본값) |
어디서나 접근 가능 | 어디서나 접근 가능 |
private |
class 내부에서만 | 파일 내부에서만 |
protected |
class와 subclass에서 | 사용 불가 |
internal |
같은 module에서 | 같은 module에서 |
class User(private val id: Long) {
internal fun validate() { /* ... */ }
protected open fun process() { /* ... */ }
}
Reference
- https://kotlinlang.org/docs/classes.html
- https://kotlinlang.org/docs/data-classes.html
- https://kotlinlang.org/docs/sealed-classes.html
- https://kotlinlang.org/docs/object-declarations.html