enum - 열거형 타입
enum 이란 ?
: enum은 열거형 타입으로, 관련 있는 고정된 상수들을 하나로 묶을 수 있다.
- ADD, SUBTRACT, MULTIPLY, DIVIDE 등의 연산자들을 Operation이라는 enum으로 관리할 수 있다.
- 코드 가독성, 유지보수성, 타입 안정성을 높여준다.
| 가독성 | Operation.ADD처럼 명확하게 표현됨 |
| 타입 안정성 | 잘못된 값은 컴파일 단계에서 오류 발생, 더 안전하다 |
| 유지보수성 | 연산 추가/수정이 쉽다 (e.g., 나중에 MOD, POWER 등 확장 가능) |
| switch문 없이도 처리 가능 | apply() 같은 메서드를 enum 안에 정의해서 직접 계산 가능 |
| 기호 매핑 편리 | "+" 등의 기호를 연산자와 연결해서 입력값 처리나 출력에 활용 가능 |
char는 그냥 자유롭게 문자 쓰는 메모장 같은 느낌이고,
enum은 미리 정해진 옵션만 고를 수 있는 드롭다운 메뉴 같은 느낌이라고 생각해주면 편하다.
간단한 예시를 들자면,
public enum Operation {
ADD("+") {
...
}
},
SUBTRACT("-") {
...
}
};
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
여기서 Operation 이라는 클래스를 enum (열거형 타입) 으로 선언해주었다.
이 때, 코드를 설명해보자면, + 기호는 ADD라는 '상수'에 들어가는 것이다.
- 기호도 SIBTRACT 라는 '상수'에 들어가는 것이다.
변수를 선언해주고, 그 변수 안에다가 특정 기호를 넣어줬다고 생각해도된다.
그리고 +, -, *, / 같은 연산 기호를 enum 상수랑 연결하려고 symbol이라는 값을 만들었고,
그걸 저장하기 위해 private final String symbol; 필드와 생성자를 만든 것이다.
그럼 여기서, 내가 왜 symbol 을 생성해주었을까?
코드로 예시를 들어보자.
숫자 1을 입력하세요: 3
연산자를 입력하세요: +
숫자 2를 입력하세요: 5
peration op = ???; // + 기호 → 이걸 Operation.ADD 로 바꿔줘야 함!
double result = op.apply(3, 5);
이렇게 사용자에게 입력받은 "+" 를 가지고 실제로 계산하려면, 코드는 위의 코드와 같이 동작해야한다.
여기서 문제는, 사용자가 입력한 "+"는 단순한 문자열이다. 근데 내가 작성해준 코드는 Operation.Add 같은 enum 타입을 써써 동작한다. 즉, "기호 -> enum 타입" 으로 바꿔주는 작업이 필요하다. 근데 enum 자체엔 "+" 같은 문자열 정보가 없으면 이걸 어떻게 매칭할까? 그래서 생성해준게 symbol이다. 여기서 "+" 와 같은 문자열은 "이 enum이 어떤 기호와 연결되는지" 알려주는 역할이다.
그리고 사칙연산을 해주는 계산기를 만드는데, 사용자가 올바른 사칙연산자를 입력하지 않았을 때 예외처리를 활용한 것을 예시로 들어보자.
계산흐름 :
- 사용자한테 +, -, *, / 중 하나를 입력받음 (문자열 형태)
- symbol을 기준으로 올바른 Operation enum 상수로 바꿔줌
- 잘못된 기호면 예외 발생 → 경고 메시지 출력
- 맞는 기호면 .apply(x, y)로 계산 수행!
try {
Operation op = Operation.fromSymbol(input);
double result = op.apply(x, y);
System.out.println("결과: " + result);
} catch (IllegalArgumentException e) {
System.out.println("올바르지 않은 연산자입니다: " + input);
} catch (ArithmeticException e) {
System.out.println("오류: " + e.getMessage());
}
public static Operation fromSymbol(String input) {
for (Operation op : Operation.values()) {
if (op.getSymbol().equals(input)) {
return op;
}
}
throw new IllegalArgumentException("지원하지 않는 연산자: " + input);
}
위에는 메인 클래스에 있는 내용이고
아래는 enum이 있는 클래스에 있는 내용이다.
지금까지의 코드들의 흐름을 표로 정리해보자면,
| 구성 | 내용 |
| Operation | 연산자와 기호 연결, apply 정의 |
| symbol 필드 | 사용자 입력 "+" → ADD 연결 역할 |
| fromSymbol() | 문자열 기호를 enum으로 변환 |
| main() | 입력 받고, 예외 처리하며 계산 수행 |