| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
- Class
- Kotlin LinkedList
- kotlin
- State Hoisting
- List
- 라즈베리파이 피코
- 안드로이드
- 상태 호이스팅
- 추상화함수
- 아두이노
- 스택
- 우송대
- kotlinClass
- Kotlin자료구조
- Android
- 큐
- 우송대학교
- deque
- 개발 보드
- 자료구조
- LinkedList
- Stack
- Compoae
- 리컴포지션
- 코틀린
- 재정의함수
- Queue
- 클래스
- PICO4
- 컴포즈
- Today
- Total
개발자의 생활
Enum Class 본문
1. Enum 클래스 소개
enum 클래스는 컴파일 시점에 객체를 상수처럼 만들어 놓고 사용할 수 있도록 하는 클래스입니다.
1. enum class의 기본 사용법
enum class Book{
KOTLIN, JAVA, ANDROID
}
위 코드가 객체를 상수처럼 만들어 놓은 것입니다.
이 코드를 일반 클래스로 구현한 것을 보시면 쉽게 이해가 되실 겁니다.
class EnumBook(){
companion object{
val KOTLIN = EnumBook()
val JAVA = EnumBook()
val ANDROID = EnumBook()
}
}
위 코드를 보시면 companion object 내부에 정적 인스턴스를 만들고 있습니다. 이를 싱글턴이라고 하죠
그리고 자신의 클래스를 사용하여 각각 객체를 만들고 있습니다.
***위 코드는 이해를 돕기 위한 코드로 실제 enum Class는 더 많은 기능을 내장하고 있습니다.***
2. Enum Class 사용이유
Enum Class를 사용하는 이유는 가독성과 유지보수 등 다양한 장점이 있기 때문입니다.
fun main(){
val bookNum = 0
val str = when(bookNum){
0 -> "KOTLIN"
1 -> "JAVA"
2 -> "ANDROID"
else -> "KOTLIN"
}
println("$str 책을 읽습니다.")
}
만약 이런 코드를 만든다고 했을 때 지금 당장은 정수 0 = KOTLIN을 의미하고 1 = JAVA를 의미하고 2 = ANDROID를 의미한다는 것을 쉽게 알 수 있지만 만약 코드가 길어지거나 숫자를 잘못 작성하면 잘못된 값을 출력하게 됩니다.
이때 Enum을 사용하면
fun main(){
val bookNum = Book.KOTLIN
val str = when(bookNum){
Book.KOTLIN -> "KOTLIN"
Book.JAVA -> "JAVA"
Book.ANDROID -> "ANDROID"
}
println("$str 책을 읽습니다.")
}
이렇게 가독성이 훨씬 좋아지게 됩니다. 이제는 숫자로 표기하지 않아도 돼서 실수할 일이 줄어들고 코드가 길어진다 해도 바로 이해할 수 있게 됐습니다.
그리고 한 가지 달라진 점이 있습니다. 바로 else 가 없습니다.
일반적으로 when을 사용하면 else를 붙여서 다른 값이 들어오는 경우에도 에러가 나지 않도록 보장을 해 주어야 하지만 Enum 은 객체가 정해져 있으므로 모든 객체가 when에 있다면 다른 값이 들어올 일이 없기 때문에 else 가 없어도 됩니다. 안정성도 보장이 되는 것이죠
3. Enum의 생성자
Enum Class 도 클래스이기 때문에 동일하게 생성자를 만들 수 있습니다.
enum class Book(
val message: String
){
KOTLIN("kotlin"), JAVA("java"), ANDROID("android")
}
이렇게 message를 필드를 만들 수 있습니다. 그럼 내부에 있는 객체에도 파라미터를 넘겨주어야 하죠
위 코드도 이해를 위해 비슷하게 일반 클래스로 구현해 보겠습니다.
class EnumBook(
val message: String
){
companion object{
val KOTLIN = EnumBook("kotlin")
val JAVA = EnumBook("java")
val ANDROID = EnumBook("android")
}
}
이렇게 생성자를 만들 수도 있습니다. 당연히 필드가 있으면 프로퍼티도 자동으로 만들어지게 됩니다. 또한 init을 사용할 수 있으며 메서드와 지역변수 상속 또한 받을 수 있습니다.
init 초기화
fun main(){
val bookNum1 = Book.KOTLIN
val bookNum2 = Book.JAVA
val bookNum3 = Book.ANDROID
val bookNum4 = Book.KOTLIN
}
enum class Book(
val message: String
){
KOTLIN("kotlin"),
JAVA("java"),
ANDROID("android");
init {
println("${this.name} 객체가 생성 되었습니다")
}
}
출력 결과

동일하게 init 키워드는 객체가 생성될 때 무조건 처음 실행이 됩니다. 그래서 각각의 객체 모두 하나씩 init 이 실행되어 문자열이 출력됩니다. 하지만 KOTLIN 은 2번 생성을 했는데 init 이 한 번만 실행이 됐습니다. 이 말은 2개의 KOTLIN 객체는 사실 1개라는 것입니다. enum 은 싱글턴으로 설계되어 있기 때문에 하나의 객체만 만들어지게 됩니다.
변수와 함수
fun main(){
val bookNum1 = Book.KOTLIN
val bookNum2 = Book.JAVA
val bookNum3 = Book.ANDROID
val bookNum4 = Book.KOTLIN
bookNum1.messagePrint()
bookNum2.messagePrint()
bookNum3.messagePrint()
bookNum4.message = "코틀린"
bookNum4.messagePrint()
bookNum1.messagePrint()
}
enum class Book(
var message: String
){
KOTLIN("kotlin"),
JAVA("java"),
ANDROID("android");
val str = "책을 읽습니다"
init {
println("객체가 생성 되었습니다")
}
fun messagePrint(){
println("${this.message} $str")
}
}
출력 결과

필드 선언을 val -> var로 변경하였습니다.
enum calss 도 일반 클래스와 동일하기 때문에 당연히 변수와 메서드를 선언할 수 있습니다. 또한 생성자에 필드를 만들면 자동으로 프로퍼티가 만들어진다고 했는데 이 코드에서 그 사실을 확인할 수 있습니다.
enum class에 messagePrint이름의 메서드를 만들고 해당 인스턴스의 message 필드값을 출력하는 코드를 만들었습니다.
main 메서드에서 3개의 객체를 생성하고(bookNum4는 bookNum1과 동일한 객체) messagePrint 메서드를 호출합니다.
그리고 bookNum4의 필드값을 setter 프로퍼티를 통해 "코틀린" 문자열로 변경 후 bookNum1과 bookNum4의 messagePrint를 호출하였습니다. 이때 bookNum4 객체의 필드값만 바꾸었는데 bookNum1 도 동일하게 적용이 된 것이 확인되었습니다.
이걸로 enum class의 객체는 싱글턴이라는 것이 확인할 수 있습니다.
4. enum class의 주의사항
enum class 의 목적은
- 특정 상수의 데이터 타입과 값을 명확하게 표현
- 타입 안정성
- 가독성과 유지보수성 향상
등의 목적을 위해 사용합니다. 하지만 변수나 메서드 또는 다른 클래스를 상속받는 등의 코드량이 길어지고 종속성이 강해지면 오히려 enum의 장점이 사라지고 문제가 생길 수 있습니다.
이상으로 Enum Class 의 설명을 마치겠습니다. 감사합니다.
'kotlin' 카테고리의 다른 글
| [ kotlin ] 자료구조_Stack, Queue, Deque (0) | 2025.10.23 |
|---|---|
| sealed class (0) | 2025.09.16 |
| data class (2) | 2025.09.12 |
| 중첩 클래스, 내부클래스 (0) | 2025.09.08 |
| object 키워드(정적 변수, 정적 함수) (1) | 2025.08.31 |