**Enum(열거형)**은 자바에서 상수들의 집합을 정의하는 특별한 데이터 타입입니다. 고정된 상수 값들을 의미적으로 표현할 때 사용하며, 주로 상태나 옵션을 나타낼 때 유용합니다. enum은 여러 상수 값을 가질 수 있으며, 각각의 상수는 고유한 이름을 가지고 있습니다.
1. Enum의 기본 개념
• **Enum**은 열거형 데이터 타입으로, 일정한 개수의 상수 값들을 정의할 수 있습니다.
• 일반적으로 상태, 옵션, 카테고리 등을 나타낼 때 많이 사용됩니다.
• 자바에서 enum은 클래스처럼 동작하며, 내부적으로 객체로 취급됩니다. 각 열거형 상수는 해당 Enum 타입의 인스턴스입니다.
예시: 기본 Enum 선언
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
• 여기서 Day는 Enum 타입이며, MONDAY, TUESDAY, WEDNESDAY 등은 상수 값입니다.
2. Enum의 특징
2.1 각 상수는 객체로 취급
• 자바에서 Enum의 각 상수는 해당 Enum 타입의 객체입니다. 즉, 상수들은 기본적으로 싱글턴 패턴을 따릅니다.
Day monday = Day.MONDAY;
Day friday = Day.FRIDAY;
System.out.println(monday); // 출력: MONDAY
System.out.println(monday == Day.MONDAY); // true
2.2 타입 안전성
• Enum은 타입 안전성을 제공합니다. 즉, 열거형 상수 외에 다른 값은 할당할 수 없습니다. 이는 정의된 상수 값만 사용할 수 있도록 강제하는 기능입니다.
Day today = Day.MONDAY;
// today = "WEDNESDAY"; // 오류 발생: 열거형 타입 외의 값은 할당 불가
2.3 switch문과 함께 사용 가능
• Enum은 switch문에서 사용할 수 있습니다. 이는 코드 가독성을 높이고, 조건에 따른 처리에 유용합니다.
public void printDayMessage(Day day) {
switch(day) {
case MONDAY:
System.out.println("Start of the work week!");
break;
case FRIDAY:
System.out.println("Almost the weekend!");
break;
case SUNDAY:
System.out.println("Rest day!");
break;
default:
System.out.println("Another regular day.");
}
}
3. Enum의 메서드와 확장 기능
3.1 values() 메서드
• Enum 타입은 모든 상수를 배열로 반환하는 values() 메서드를 제공합니다. 이를 통해 모든 상수를 순회할 수 있습니다.
for (Day day : Day.values()) {
System.out.println(day);
}
3.2 ordinal() 메서드
• ordinal() 메서드는 상수의 선언 순서를 나타내는 0부터 시작하는 인덱스를 반환합니다.
System.out.println(Day.MONDAY.ordinal()); // 출력: 0
System.out.println(Day.FRIDAY.ordinal()); // 출력: 4
3.3 name() 메서드
• name() 메서드는 상수의 이름을 문자열로 반환합니다.
System.out.println(Day.MONDAY.name()); // 출력: "MONDAY"
3.4 valueOf() 메서드
• valueOf() 메서드는 문자열로 상수 값을 가져올 때 사용됩니다. 이 문자열은 반드시 정확하게 상수 이름과 일치해야 합니다.
Day day = Day.valueOf("MONDAY");
System.out.println(day); // 출력: MONDAY
4. Enum에 메서드 추가
Enum은 클래스처럼 동작할 수 있기 때문에, 필드나 메서드를 추가할 수 있습니다. 이를 통해 각 열거형 상수에 추가적인 속성을 부여할 수 있습니다.
예시: Enum에 필드와 메서드 추가
public enum Season {
SPRING("Warm"),
SUMMER("Hot"),
FALL("Cool"),
WINTER("Cold");
private String description;
// 생성자
Season(String description) {
this.description = description;
}
// Getter 메서드
public String getDescription() {
return description;
}
}
public class Main {
public static void main(String[] args) {
for (Season season : Season.values()) {
System.out.println(season + ": " + season.getDescription());
}
}
}
• 출력:
SPRING: Warm
SUMMER: Hot
FALL: Cool
WINTER: Cold
• 각 열거형 상수는 고유의 설명(description)을 가지고 있으며, 이를 메서드로 접근할 수 있습니다.
5. Enum의 사용 사례
5.1 상태 표현
• Enum은 상태를 표현하는 데 유용합니다. 예를 들어, 서버의 상태, 사용자의 권한, 주문 상태 등을 Enum으로 표현할 수 있습니다.
public enum OrderStatus {
NEW, PROCESSING, SHIPPED, DELIVERED
}
5.2 옵션 설정
• Enum은 옵션을 제공하는 경우에도 유용합니다. 예를 들어, 정렬 방식이나 알림 설정 등을 정의할 수 있습니다.
public enum SortingOrder {
ASCENDING, DESCENDING
}
6. Enum과 상속
• 자바의 Enum은 다른 클래스를 상속할 수 없으며(다른 클래스의 하위 클래스가 될 수 없음), 다른 클래스가 Enum을 상속할 수도 없습니다.
• 하지만, 인터페이스를 구현할 수는 있습니다.
public interface Displayable {
void display();
}
public enum TrafficLight implements Displayable {
RED, YELLOW, GREEN;
@Override
public void display() {
System.out.println("Traffic light: " + this);
}
}
7. 결론
• Enum은 자바에서 고정된 상수 집합을 정의할 때 사용하는 특별한 데이터 타입입니다.
• Enum을 사용하면 타입 안전성을 확보할 수 있고, 가독성과 유지보수성이 뛰어난 코드를 작성할 수 있습니다.
• 또한, 메서드와 필드를 추가하여 더 복잡한 기능도 제공할 수 있으며, 상수의 객체화를 통해 각 상수에 행동을 부여할 수 있습니다.
Enum은 특히 상태, 옵션, 설정 값 등을 표현할 때 매우 유용하게 사용됩니다.
+예시
아래는 **Enum**을 활용한 좋은 예시로, 커피 주문 시스템을 구현한 간단한 코드입니다. 이 예시에서는 커피의 종류와 사이즈를 Enum으로 정의하고, 주문 처리를 하는 구조를 보여줍니다. 이를 통해 Enum의 상수, 필드, 메서드 사용법을 이해할 수 있습니다.
커피 주문 시스템 예시
// 커피의 종류를 나타내는 Enum
public enum CoffeeType {
ESPRESSO, AMERICANO, LATTE, CAPPUCCINO;
}
// 커피 사이즈를 나타내는 Enum
public enum CoffeeSize {
SMALL(200), MEDIUM(300), LARGE(400);
private final int milliliters; // 각 사이즈에 대한 용량(ml)
// 생성자
CoffeeSize(int milliliters) {
this.milliliters = milliliters;
}
// Getter 메서드
public int getMilliliters() {
return milliliters;
}
}
// 커피 주문 클래스
public class CoffeeOrder {
private CoffeeType type;
private CoffeeSize size;
// 생성자
public CoffeeOrder(CoffeeType type, CoffeeSize size) {
this.type = type;
this.size = size;
}
// 주문 정보 출력 메서드
public void printOrder() {
System.out.println("Order: " + type + ", Size: " + size + " (" + size.getMilliliters() + "ml)");
}
}
// 메인 클래스
public class Main {
public static void main(String[] args) {
// 커피 주문 생성
CoffeeOrder order1 = new CoffeeOrder(CoffeeType.ESPRESSO, CoffeeSize.SMALL);
CoffeeOrder order2 = new CoffeeOrder(CoffeeType.LATTE, CoffeeSize.LARGE);
// 주문 정보 출력
order1.printOrder(); // 출력: Order: ESPRESSO, Size: SMALL (200ml)
order2.printOrder(); // 출력: Order: LATTE, Size: LARGE (400ml)
}
}
설명:
1. CoffeeType:
• 커피의 종류를 Enum으로 정의했습니다. ESPRESSO, AMERICANO, LATTE, CAPPUCCINO와 같은 고정된 커피 종류를 제공합니다.
2. CoffeeSize:
• 커피의 사이즈를 나타내는 Enum으로, 각 사이즈가 고유한 **용량(milliliters)**을 가지고 있습니다.
• 생성자를 통해 각 상수에 밀리리터 값을 할당하고, getMilliliters() 메서드를 사용해 각 사이즈의 용량을 반환할 수 있습니다.
3. CoffeeOrder:
• 커피 주문을 나타내는 클래스입니다. 커피 종류와 사이즈를 주문에 포함하며, 이를 출력하는 메서드를 제공합니다.
4. 실행 흐름:
• main 메서드에서 두 가지 커피 주문을 생성하고, 주문 정보를 출력합니다.
이 예시의 포인트:
• **Enum**을 통해 고정된 상수를 의미 있게 정의하고, 관련된 속성과 메서드를 추가하여 더 복잡한 동작을 구현할 수 있습니다.
• Enum 상수는 객체처럼 동작하며, 생성자를 통해 각 상수에 특정 값(여기서는 밀리리터)을 할당할 수 있습니다.
• 이 코드를 작성해보면 Enum의 기본적인 동작 방식뿐만 아니라, Enum이 클래스처럼 동작할 수 있는 점도 이해하게 됩니다.
'Java' 카테고리의 다른 글
[Java] 리스트(List) 와 배열(Array)의 차이점 (0) | 2024.09.29 |
---|---|
[Java] 람다 표현식(Lamda Expression) (0) | 2024.09.29 |
[Java] 상속 vs 합성 (0) | 2024.09.28 |
[Java] final (0) | 2024.09.28 |
[Java] 추상 클래스(Abstract Class) (0) | 2024.09.28 |