-
Java EnumLANGUAGE/Java, Spring 2024. 12. 3. 19:32
1. Enum이란 무엇인가?
정의
- Enum(열거형)은 관련된 상수들의 집합을 의미합니다.
- Java에서 Enum은 클래스처럼 보이지만, 특정 값들을 제한된 범위 내에서 정의할 때 사용됩니다.
- Enum은 public, static, final의 특성을 가지며, 상수들은 대문자로 표기하는 것이 일반적입니다.
특징
- Enum은 각 상수가 고유의 인스턴스를 가지는 특별한 클래스입니다.
- Enum은 타입 안전성을 보장하며, 코드의 가독성과 유지 보수성을 높입니다.
2. Enum의 기본 사용법
선언
public enum Weekday { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }
- Enum은 enum 키워드를 사용하여 선언합니다.
- 각 상수들은 콤마(,)로 구분되며, 마지막 상수 뒤에는 세미콜론(;)이 필요 없습니다.
사용
public class EnumExample { public static void main(String[] args) { Weekday today = Weekday.MONDAY; System.out.println("Today is: " + today); } }
- Enum 타입의 변수를 선언하고, 해당 변수를 Enum 상수로 초기화할 수 있습니다.
- System.out.println으로 Enum 상수를 출력하면 해당 상수의 이름이 출력됩니다.
3. Enum의 메서드와 속성
주요 메서드
- values(): Enum의 모든 상수를 배열로 반환합니다.
- valueOf(String name): 지정된 이름과 일치하는 Enum 상수를 반환합니다. 대소문자를 구분합니다.
- ordinal(): Enum 상수가 선언된 순서를 반환합니다(0부터 시작).
예제
public class EnumMethodsExample { public static void main(String[] args) { // values() 메서드 사용 Weekday[] days = Weekday.values(); for (Weekday day : days) { System.out.println(day); } // valueOf() 메서드 사용 Weekday day = Weekday.valueOf("FRIDAY"); System.out.println("Day: " + day); // ordinal() 메서드 사용 int order = Weekday.MONDAY.ordinal(); System.out.println("Monday's order: " + order); } }
- values() 메서드를 통해 Enum의 모든 상수를 반복할 수 있습니다.
- valueOf() 메서드를 통해 문자열을 Enum 상수로 변환할 수 있습니다.
- ordinal() 메서드를 통해 Enum 상수의 순서를 확인할 수 있습니다.
4. Enum과 switch 문
switch 문에서 Enum 사용
- Enum을 switch 문의 case 레이블로 사용할 수 있습니다.
- 각 case는 Enum 상수를 사용합니다.
예제
public class EnumSwitchExample { public static void main(String[] args) { Weekday today = Weekday.WEDNESDAY; switch (today) { case MONDAY: System.out.println("Start of the work week"); break; case WEDNESDAY: System.out.println("Midweek"); break; case FRIDAY: System.out.println("End of the work week"); break; default: System.out.println("Weekend"); break; } } }
- switch 문을 사용하여 각 상수에 대한 로직을 분리할 수 있습니다.
- Enum과 switch 문을 함께 사용하면 코드의 가독성을 높일 수 있습니다.
5. Enum의 고급 기능
필드와 생성자 추가
- Enum에 필드, 생성자, 메서드를 추가하여 더 많은 기능을 구현할 수 있습니다.
예제
public enum Weekday { MONDAY("월요일"), TUESDAY("화요일"), WEDNESDAY("수요일"), THURSDAY("목요일"), FRIDAY("금요일"), SATURDAY("토요일"), SUNDAY("일요일"); private String korean; // 생성자 Weekday(String korean) { this.korean = korean; } public String getKorean() { return korean; } } public class AdvancedEnumExample { public static void main(String[] args) { Weekday today = Weekday.MONDAY; System.out.println("Today is: " + today.getKorean()); } }
- 각 Enum 상수는 생성자를 통해 특정 값을 가질 수 있습니다.
- 생성자는 자동으로 private으로 선언되며, Enum 상수에 대한 추가 정보를 저장할 수 있습니다.
- 추가된 필드와 메서드를 통해 Enum 상수에 대한 더 많은 기능을 제공합니다.
6. Enum의 활용 사례
상태 관리
- Enum은 상태를 관리하는 데 유용합니다. 예를 들어, 주문 상태, 트래픽 신호 상태 등을 Enum으로 정의할 수 있습니다.
예제
public enum OrderStatus { PENDING, PROCESSING, SHIPPED, DELIVERED } public class Order { private int id; private OrderStatus status; public Order(int id) { this.id = id; this.status = OrderStatus.PENDING; } public void nextStatus() { switch (status) { case PENDING: status = OrderStatus.PROCESSING; break; case PROCESSING: status = OrderStatus.SHIPPED; break; case SHIPPED: status = OrderStatus.DELIVERED; break; default: System.out.println("Order is already delivered."); } } public OrderStatus getStatus() { return status; } } public class OrderExample { public static void main(String[] args) { Order order = new Order(1); System.out.println("Order status: " + order.getStatus()); order.nextStatus(); System.out.println("Order status: " + order.getStatus()); order.nextStatus(); System.out.println("Order status: " + order.getStatus()); } }
- 이 예제에서는 OrderStatus라는 Enum을 사용하여 주문의 상태를 관리합니다.
- 각 상태 전환을 nextStatus() 메서드를 통해 쉽게 구현할 수 있습니다.
교통 신호 예제
public enum TrafficSignal { RED("멈추세요"), YELLOW("주의하세요"), GREEN("가세요"); private String message; TrafficSignal(String message) { this.message = message; } public String getMessage() { return message; } } public class TrafficSignalExample { public static void main(String[] args) { TrafficSignal signal = TrafficSignal.RED; System.out.println("Signal: " + signal + " - " + signal.getMessage()); signal = TrafficSignal.GREEN; System.out.println("Signal: " + signal + " - " + signal.getMessage()); } }
- TrafficSignal Enum을 통해 교통 신호의 상태를 관리하고, 각 상태에 대한 메시지를 제공할 수 있습니다.
7. Enum의 내부 구현
Enum 클래스의 내부
- Enum 클래스는 java.lang.Enum 클래스를 상속받습니다.
- 모든 Enum은 java.lang.Enum 클래스를 상속하므로 여러 가지 유용한 메서드를 제공합니다.
Enum의 상속과 인터페이스 구현
- Enum은 다른 클래스나 Enum을 상속할 수 없습니다.
- 하지만 인터페이스를 구현할 수 있습니다.
예제
public interface Displayable { void display(); } public enum Planet implements Displayable { MERCURY, VENUS, EARTH, MARS; @Override public void display() { System.out.println(this.name() + " is displayed."); } } public class PlanetExample { public static void main(String[] args) { Planet planet = Planet.EARTH; planet.display(); } }
- 이 예제에서는 Displayable 인터페이스를 구현하여 각 행성 Enum 상수에 display() 메서드를 추가합니다.
8. Enum의 기타 기능
열거형 상수의 메서드 오버라이드
- 각 Enum 상수에 대해 고유한 메서드를 정의할 수 있습니다.
예제
```java
public enum Operation {
ADD {
@Override
public int apply(int x, int y) {
return x + y;
}
},
SUBTRACT {
@Override
public int apply(int x, int y) {
return x - y;
}
},
MULTIPLY {
@Override
public int apply(int x, int y) {
return x * y;
}
},
DIVIDE {
@Override
public int apply(int x, int y) {
return x / y;
}
};public abstract int apply(int x, int y);
}
public class OperationExample {
public static void main(String[] args) {
int a = 6, b = 2;
System.out.println("Add: " + Operation.ADD.apply(a, b));
System'LANGUAGE > Java, Spring' 카테고리의 다른 글
JSTL, EL 문법 정리 (1) 2024.12.03 mvc2( java, jsp, mybatis) (0) 2024.12.02 Java의 정석 정리 (06장) (0) 2024.12.02 Java의 정석 정리 (05장) (0) 2024.12.02 Java의 정석 정리 (04장) (1) 2024.12.02