📺 이 글은 제가 평소 즐겨보는 Kotlin 유튜버
Philipp Lackner 님의 영상
👉 Kotlin Class Types Explained
을 보고 정리한 내용을 바탕으로 작성한 포스트입니다!
🧠 클래스마다 자동으로 생성되는 메서드나 제약 조건이 있다는 사실, 알고 계셨나요?
이 글에서는 영상 속 내용을 기반으로
각 클래스 타입의 특징, 사용 예시, 자동 생성 메서드, 제약사항까지
한 번에 깔끔하게 정리해봤습니다.
Kotlin에는 다양한 클래스 및 구조가 존재하며, 각각 특정 목적과 기능을 위해 설계되어 있습니다.
이 글에서는 Kotlin에서 사용 가능한 클래스 및 클래스 유사 구조 15가지를 기능 위주로 묶어 정리하고, 자동 생성 메서드, 제약 조건, 대표적인 사용 예까지 함께 설명합니다 💡
🧾 설명
가장 기본적인 클래스. 생성자, 메서드, 프로퍼티, 중첩 클래스 등을 자유롭게 가질 수 있음.
💡 예제
class Person(val name: String, var age: Int) {
fun introduce() {
println("Hi, I'm $name and I'm $age years old.")
}
}
🧾 설명
데이터 보관용 클래스. 생성자 프로퍼티 기반으로 유용한 메서드 자동 생성.
⚙️ 자동 생성 메서드
equals()hashCode()toString()copy()componentN()⚠️ 제약 사항
primary constructor에 val/var 포함 필수open, sealed, abstract, inner 불가💡 예제
data class User(val username: String, val email: String)
🧾 설명
고정된 상수 집합 표현. 각 항목은 인스턴스이며 생성자 및 메서드 포함 가능.
✅ 장점
when 문에서 exhaustive 체크 가능💡 예제
enum class Direction {
NORTH, SOUTH, EAST, WEST
}
fun move(dir: Direction) {
when (dir) {
Direction.NORTH -> println("Go up")
Direction.SOUTH -> println("Go down")
Direction.EAST -> println("Go right")
Direction.WEST -> println("Go left")
}
}
🧾 설명
제한된 상속 구조. when 문에서 exhaustive 체크 가능.
⚠️ 제약 사항
abstract 포함💡 예제
sealed class Result
data class Success(val data: String) : Result()
data class Failure(val message: String) : Result()
object Loading : Result()
🧾 설명
sealed class와 유사하지만 다중 구현이 가능.
💡 예제
sealed interface UiEvent
object Click : UiEvent
object Swipe : UiEvent
🧾 설명
object에 data 특성이 결합된 구조. 싱글톤 + 자동 메서드 제공.
⚙️ 자동 생성 메서드
toString()equals()hashCode()💡 예제
sealed class ScreenState
data object Loading : ScreenState
data object Empty : ScreenState
🧾 설명
전역에서 단 하나만 존재하는 싱글톤 객체.
📌 활용 예
💡 예제
object AppConfig {
const val version = "1.0.0"
fun printVersion() = println(version)
}
🧾 설명
코드에 메타데이터를 부여하는 데 사용. Java와 호환됨.
💡 예제
annotation class Info(val author: String)
@Info("Jiwoo")
class Article
🧾 설명
래핑 없이 값 자체로 동작. 성능 + 타입 안전성 확보.
⚠️ 제약 사항
💡 예제
@JvmInline
value class Email private constructor(val value: String) {
companion object {
private val EMAIL_REGEX = "^[\\w.-]+@[\\w.-]+$".toRegex()
fun create(email: String): Email {
require(email.matches(EMAIL_REGEX)) { "Invalid email" }
return Email(email)
}
}
}
🧾 설명
단 하나의 추상 메서드만 가짐. 람다로 간편하게 구현 가능 (SAM 지원).
💡 예제
fun interface Validator {
fun validate(input: String): Boolean
}
val notEmpty = Validator { it.isNotEmpty() }
🧾 설명
공통 기능 제공 및 구현 강제 목적. 직접 인스턴스화 불가.
💡 예제
abstract class Animal {
abstract fun speak(): String
}
class Dog : Animal() {
override fun speak() = "Woof"
}
🧾 설명
inner 키워드 없이 클래스 내부에 정의된 클래스. 외부 참조 불가.
💡 예제
class Outer {
class Nested {
fun message() = "Hello from Nested"
}
}
🧾 설명
외부 클래스 인스턴스에 접근 가능 (inner 키워드 필요).
💡 예제
class Outer(val greeting: String) {
inner class Inner {
fun sayHello() = "Greeting: $greeting"
}
}
⚠️
companion object는 클래스 종류가 아니라 클래스 내부 정적 객체이므로 본 목록에는 포함되지 않습니다.
🧾 설명
이름 없이 즉석에서 인터페이스/추상 클래스 구현.
💡 예제
interface Clickable {
fun click()
}
val handler = object : Clickable {
override fun click() = println("Clicked!")
}
| 🏷️ 클래스 종류 | 💡 핵심 특징 |
|---|---|
class | 가장 기본적인 클래스 |
data class | equals, copy, toString 등 자동 생성 |
enum class | 상수 집합 + 타입 안정성 |
sealed class | 제한된 상속 구조, when에서 exhaustive 체크 |
sealed interface | 다중 구현 가능한 봉인 인터페이스 |
data object | 싱글톤 + equals/hashCode/toString 자동 제공 |
object | 전역 싱글톤 객체 |
annotation class | 메타데이터 정의용 구조 |
value class (@JvmInline) | primitive처럼 동작하는 경량 래퍼 |
fun interface | 람다 표현식 가능한 함수형 인터페이스 |
abstract class | 인스턴스화 불가, 템플릿 역할 |
nested class | 외부 인스턴스 참조 불가한 내부 클래스 |
inner class | 외부 클래스 인스턴스 참조 가능 |
anonymous object | 이름 없는 일회성 객체 구현 |
companion object ❌ | 정적 객체 (클래스 자체 아님, 제외됨) |
이 글이 Kotlin 클래스 구조를 제대로 이해하고 선택하는 데 도움이 되길 바랍니다 🙌
질문이나 피드백은 댓글로 남겨주세요!