enum(열거형)은 자바에서 상수들의 집합을 정의할 때 사용되는 특별한 자료형이다. 일정한 값들로 미리 정의해 놓고, 이를 통해 가독성과 코드 안정성을 높일 수 있다. 주로 제한된 선택지들 (요일, 상태 등) 을 처리할 때 유용하다.
public enum Day {
SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}
enum은 클래스와 유사하며 그 안에 메서드와 필드를 정의할 수도 있다.
public class EnumExample {
public static void main(String[] args) {
Day day = Day.MONDAY;
if (day == Day.MONDAY) {
System.out.println("It's Monday!");
}
}
}
public class EnumSwitchExample {
public static void main(String[] args) {
Day day = Day.FRIDAY;
switch (day) {
case MONDAY:
System.out.println("Start of the work week.");
break;
case FRIDAY:
System.out.println("It's almost the weekend!");
break;
case SUNDAY:
System.out.println("Rest day.");
break;
default:
System.out.println("Another regular day.");
}
}
}
enum은 단순한 상수의 집합일 뿐만 아니라 필드와 메서드를 추가하여 더 복잡한 데이터를 다룰 수 있다.
public enum Planet {
MERCURY(3.303e+23, 2.4397e6),
VENUS(4.869e+24, 6.0518e6),
EARTH(5.976e+24, 6.37814e6);
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 getMass() {
return mass;
}
public double getRadius() {
return radius;
}
public double surfaceGravity() {
final double G = 6.67300E-11; // gravitational constant
return G * mass / (radius * radius);
}
}
이번에 계산기 프로젝트를 만들면서 사칙연산 연산자를 enum으로 정의해서 로직을 바꿔보았다.
계산기를 구현하는데 다양한 방법이 있겠지만 enum을 사용하면서 생각해본 몇 가지 좋은 점을 적어보려고 한다.
사전에 정의된 값들만 사용할 수 있다. 계산기에서는 +, -, *, /와 같은 연산자만 허용되며 그 외의 값은 허용되지 않도록 강제할 수 있다.
이렇게 하면 잘못된 연산자가 들어오는 경우를 방지할 수 있고 코드에서 직접 문자열로 연산자를 비교하는 대신 enum으로 안전하게 관리할 수 있다.
연산자를 문자열로 비교하면 오타나 잘못된 값이 들어오는 것을 컴파일러가 잡아내지 못하지만 enum은 타입이 강제되므로 잘못된 연산자가 사용될 가능성을 줄일 수 있다.
연산자와 관련된 동작을 enum안에 메서드로 정의해 코드를 읽을 때 연산자 별로 어떤 동작을 수행하는지 명확해 진다.
나중에 새로운 연산자나 기능을 추가해야 한다면 enum에 새로운 연산자를 추가하고 해당 연산에 대한 동작을 쉽게 확장할 수 있다.그리고 로직을 한 곳에 묶음으로써 연산과 관련된 로직을 다른 곳에서 일일이 처리 할 필요가 없고 enum안에서 해결 할 수 있다.