Enum - 1에서는 Enum과 final을 비교했을 때 아래의 장점이 있다는 것을 알아보았다.
- 코드의 가독성 상승
- 상수들에 대한 관리 용이
- 타입 안전성 제공
- Enum의 내장 메서드 활용
- 필드나 메서드를 추가해 복잡한 로직 구현 가능
이번에는 Enum의 특징과 사용법 등에 대해서 자세히 알아보도록 하겠다.
Enum은 기본적으로 아래와 같이 사용된다.
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
Day today = Day.MONDAY;
switch (today) {
case MONDAY:
System.out.println("Today is Monday!");
break;
case TUESDAY:
System.out.println("Today is Tuesday!");
break;
// 기타 요일들에 대한 처리
default:
System.out.println("Another day!");
break;
}
Enum의 기본 내장 메서드를 사용하여 아래와 같이 사용할 수 있다.
// 모든 Enum 값을 순회
for (Day day : Day.values()) {
System.out.println(day);
}
// 이름으로 Enum 값 가져오기
Day day = Day.valueOf("MONDAY");
System.out.println(day); // 출력: MONDAY
// Enum 값의 순서
System.out.println(Day.MONDAY.ordinal()); // 출력: 1 (0부터 시작)
이에 더해서 Enum에서는 단순히 상수를 표현하는 것뿐만 아니라 멤버 변수, 메서드, 생성자를 포함할 수 있다. 예를 들어, 각 상수에 대한 추가 정보를 저장하고자 할 때 다음과 같이 사용할 수 있다.
이번에는 요일이 아니라 태양계 행성을 Enum으로 구현해 보면 아래와 같이 나타낼 수 있다.
public enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS(4.869e+24, 6.0518e6),
EARTH(5.976e+24, 6.37814e6),
MARS(6.421e+23, 3.3972e6);
private final double mass; // in kilograms
private final double radius; // in meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
public double mass() {
return mass;
}
public double radius() {
return radius;
}
// 중력 계산 메서드 추가
public double surfaceGravity() {
final double G = 6.67300E-11;
return G * mass / (radius * radius);
}
}
위처럼 작성한다면 각 행성들에 mass와 radius 필드를 가지게 할 수 있고 각 상수를 생성할 때, 이 두 가지 정보를 함께 초기화할 수 있다.
위의 Enum 클래스는 아래와 같이 사용할 수 있다.
Planet earth = Planet.EARTH;
System.out.println("Earth's mass: " + earth.mass());
System.out.println("Earth's radius: " + earth.radius());
System.out.println("Earth's surface gravity: " + earth.surfaceGravity());
평소 Enum을 맨 위의 Day처럼 단순하게 사용해 왔는데, 여러 메서드나 필드를 추가해서 좀 더 효율적으로 사용할 수 있도록 해봐야겠다.
[참고] https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/Enum.html Java SE 17 Enum 공식 문서
'프로그래밍 언어 > JAVA' 카테고리의 다른 글
상속과 다형성 (0) | 2024.09.06 |
---|---|
예외 처리 (0) | 2024.02.05 |
Static / Non-Static method (0) | 2024.01.29 |
Enum - 1 (feat. final) (0) | 2023.11.08 |
Stream (0) | 2023.11.04 |