enum
- Java에서 enum은 열거형(enumeration)을 나타내는 특별한 데이터 타입입니다.
- 특정 값들의 집합을 정의할 때 사용하며, 각 값은 enum 타입의 상수(constant)로 표현됩니다.
- 예를 들어, 요일을 나타내기 위해 월, 화, 수, 목, 금, 토, 일을 열거할 수 있습니다.
- enum을 사용하면 코드의 가독성과 안정성을 높일 수 있으며, 특정 값들만 사용해야 하는 상황에서 오류를 줄일 수 있습니다.
enum을 사용하는 이유
1. 코드의 간결성
(1) enum 사용 X
public class TrafficLight {
public static final TrafficLight RED = new TrafficLight("RED");
public static final TrafficLight YELLOW = new TrafficLight("YELLOW");
public static final TrafficLight GREEN = new TrafficLight("GREEN");
}
(2) enum 사용 O
public enum TrafficLight {
RED, YELLOW, GREEN
}
2. 인스턴스 생성과 상속 방지
인스턴스 생성과 상속을 방지할 수 있다는 말은, enum이 정의된 값 외에 새로운 객체를 생성하거나 다른 클래스가 이를 상속받아 재정의할 수 없다는 것을 의미합니다. 이를 통해 열거형의 값이 고정되고, 프로그램에서 더 안전하게 사용할 수 있습니다.
(1) 인스턴스 생성 방지
- 일반적인 클래스는 new 키워드를 사용해서 새로운 객체를 생성할 수 있습니다. 그러나 enum은 미리 정의된 상수 값들만 사용할 수 있고, 새로운 객체를 생성할 수 없습니다.
public enum TrafficLight {
RED, YELLOW, GREEN;
}
// 새로운 객체 생성 불가
// TrafficLight light = new TrafficLight("RED"); // 컴파일 오류
(2) 상속 방지
- Java의 일반적인 클래스는 다른 클래스가 이를 상속받아 새로운 동작을 정의하거나 수정할 수 있습니다. 그러나 enum은 상속이 불가능하며, 정의된 값과 동작을 변경할 수 없습니다.
public enum TrafficLight {
RED, YELLOW, GREEN;
}
// 상속 불가
// public class CustomTrafficLight extends TrafficLight { } // 컴파일 오류
3. 구현 의도 명확하게 표시
enum은 상수들을 열거하기 위해 만들어진 데이터 타입이므로, 일반 클래스에 상수를 선언하는 것보다 enum을 사용하면, 해당 값들이 미리 정해진 목록으로만 사용되어야 한다는 의도를 명확히 전달할 수 있습니다.
(1) 일반 클래스에서 신호등 상수 선언
public class TrafficLightConstants {
public static final int RED = 1;
public static final int YELLOW = 2;
public static final int GREEN = 3;
}
(2) Enum으로 신호등 상수 선언
public enum TrafficLight {
RED, YELLOW, GREEN
}
사용법
1. 변수 선언
Enum은 enum 키워드를 사용해 정의하며, 각 값은 Enum 타입의 상수 객체로 취급됩니다.
ex. 신호등 색깔을 나타내는 Enum
public enum TrafficLight {
RED, YELLOW, GREEN
}
➡️ 사용예시
TrafficLight signal = TrafficLight.RED;
if (signal == TrafficLight.RED) {
System.out.println("Stop!");
} else if (signal == TrafficLight.YELLOW) {
System.out.println("Caution!");
} else if (signal == TrafficLight.GREEN) {
System.out.println("Go!");
}
- 안전성 : TrafficLight.RED 같은 명확한 표현을 사용해 잘못된 값을 방지합니다.
- 가독성 : 코드만 봐도 값의 의미를 쉽게 이해할 수 있습니다.
2. Method 활용
Java Enum은 기본적으로 몇 가지 유용한 메서드를 제공합니다.
- values() : Enum의 모든 값을 배열로 반환합니다.
- valueOf(String name) : Enum 이름을 통해 해당 값을 반환합니다.
ex. 모든 값 출력
for (TrafficLight light : TrafficLight.values()) {
System.out.println(light);
}
ex. 문자열로 Enum 값 가져오기
TrafficLight signal = TrafficLight.valueOf("RED");
System.out.println(signal); // RED 출력
활용
Java의 Enum은 단순히 상수의 나열이 아니라, 클래스처럼 동작할 수 있습니다. 필드, 생성자, 메서드를 포함하여 더 복잡한 로직을 처리할 수 있습니다.
1. Field와 Constructor 포함
ex. 각 신호등 색깔에 대기 시간을 추가
public enum TrafficLight {
RED(30), YELLOW(5), GREEN(25);
private final int duration; // 대기 시간 (초 단위)
TrafficLight(int duration) {
this.duration = duration;
}
public int getDuration() {
return duration;
}
}
➡️ 사용 예시
TrafficLight signal = TrafficLight.RED;
System.out.println("Wait time: " + signal.getDuration() + " seconds");
- RED의 대기 시간은 30초, YELLOW는 5초, GREEN은 25초로 설정됩니다.
- getDuration() 메서드를 통해 각 Enum 값에 저장된 데이터를 가져올 수 있습니다.
2. Enum 안에 동작 정의
이 방식을 통해 Enum 값마다 다른 동작을 정의할 수 있습니다.
ex. 상태에 따른 메시지 출력
public enum OrderStatus {
PENDING {
@Override
public String getMessage() {
return "Your order is being processed.";
}
},
SHIPPED {
@Override
public String getMessage() {
return "Your order is on the way!";
}
},
DELIVERED {
@Override
public String getMessage() {
return "Your order has been delivered.";
}
};
public abstract String getMessage();
}
➡️ 사용 예시
OrderStatus status = OrderStatus.SHIPPED;
System.out.println(status.getMessage()); // "Your order is on the way!" 출력
특징
- 코드의 간결성 : enum을 사용하면 동일한 기능을 더 간단한 코드로 구현할 수 있습니다. 클래스 방식은 작성해야 할 코드가 길고 복잡합니다.
- 타입 안전성 : enum은 컴파일 타임에 타입 검사를 제공합니다. 하지만 클래스 방식에서는 상수를 올바르게 참조하지 못하면 런타임 오류가 발생할 가능성이 있습니다.
- 내장된 기능 : enum에는 values(), ordinal(), name() 등 유용한 메서드가 내장되어 있습니다. 이를 수동으로 구현하지 않아도 되므로 생산성이 높아집니다.
- 불변성 보장 : enum은 값이 불변(immutable)이고 미리 정의된 값만 사용할 수 있도록 보장합니다. 클래스 기반 구현은 이런 보장을 개발자가 직접 책임져야 합니다.
요약
enum은 특정한 상수 집합을 정의하고, 이 상수들을 객체로 관리하기 위해 만들어진 특수한 클래스이다.
출처
1. OpenAI의 ChatGPT (https://openai.com)
2. 생활코딩 Java - 상수와 enum (3/4) : enum의 문법 : https://youtu.be/3Xwko1gOjZQ?si=3GoHhT1M5AReYEAL
'Java > Grammar' 카테고리의 다른 글
[Java 문법] I/O Stream (0) | 2025.02.24 |
---|---|
[Java 문법] Overloading VS Overriding (1) | 2025.02.23 |
[Java 문법] String.valueOf() VS toString() (0) | 2025.01.18 |
[Java 문법] Class<?> (0) | 2025.01.17 |
[Java 문법] Optinal 주요 Method (0) | 2025.01.16 |