계산기 과제를 복습하면서 사칙연산 기호를 관리하기 위해 Enum을 사용해보았다.
처음에는 단순히 +, -, *, /를 switch문에서 직접 비교했지만, 도전 과제에서는 Enum을 활용하여 연산자 정보를 하나의 타입으로 관리해보았다.
이번 글에서는 계산기 과제에서 사용한 코드를 기준으로 Java의 Enum을 어떻게 활용할 수 있는지 정리해보자.
1. Enum이란?
Enum은 서로 관련된 상수들을 하나의 타입으로 묶어서 관리할 수 있도록 해주는 문법이다.
이 값들은 프로그램이 실행되는 동안 갑자기 다른 연산자로 변경될 필요가 없다.
이처럼 정해진 값들을 하나의 그룹으로 관리하고 싶을 때 Enum을 사용할 수 있다.
계산기 과제에서는 OperatorType이라는 Enum을 만들었다.
public enum OperatorType {
SUM('+'),
SUB('-'),
MUL('*'),
DIV('/');
private char op;
private OperatorType(char op) {
this.op = op;
}
public char getOp() {
return op;
}
}
2. Enum 상수에 인자값을 넣을 수 있다
Enum도 일반적인 클래스처럼 필드와 생성자를 가질 수 있다.
예를 들어 다음 코드에서:
SUM('+')
'+'는 SUM이라는 Enum 상수에 전달되는 값이다.
그리고 Enum 내부의 생성자가 이 값을 받는다.
private OperatorType(char op) {
this.op = op;
}
결국 다음과 같은 흐름이다.
SUM('+')
↓
생성자 호출
↓
OperatorType(char op)
↓
this.op = '+'
따라서 SUM이라는 Enum 상수는 내부적으로 +라는 연산 기호 정보를 가지고 있게 된다.
다른 값들도 동일하다.
SUM('+') → '+'
SUB('-') → '-'
MUL('*') → '*'
DIV('/') → '/'
이렇게 하면 연산자에 대한 정보를 Enum 안에서 함께 관리할 수 있다.
3. Enum의 필드 값을 가져오기
Enum 내부에 저장한 op 값을 가져오기 위해 Getter 메서드를 만들었다.
public char getOp() {
return op;
}
예를 들어 SUM의 연산 기호를 가져오고 싶다면 다음과 같이 사용할 수 있다.
OperatorType.SUM.getOp(); // '+'를 반환한다.
4. Enum의 모든 값을 배열로 가져오기 - values()
계산기에서는 사용자가 입력한 연산 기호와 Enum에 저장된 연산 기호를 비교해야 했다.
이때 사용한 것이 바로 values() 메서드이다.
OperatorType[] op = OperatorType.values();
values()는 해당 Enum에 선언된 모든 Enum 상수를 배열로 반환한다.
[SUM, SUB, MUL, DIV]
5. 향상된 for문으로 Enum의 모든 값 확인하기
이제 values()로 가져온 Enum 배열을 반복문으로 확인할 수 있다.
OperatorType[] op = OperatorType.values();
for (OperatorType operatorType : op) {
}
이 코드는 배열의 값을 하나씩 꺼내서 operatorType에 넣는다.
예를 들어 반복문이 실행되면서 다음과 같이 동작한다고 생각할 수 있다.
6. 사용자 입력값과 Enum의 값을 비교하기
계산기에서는 사용자가 연산 기호를 입력한다.
+
사용자가 입력한 값은 char 타입의 cal 변수에 저장된다.
char cal = sc.nextLine().charAt(0);
이제 이 입력값이 어떤 연산자인지 Enum을 통해 찾아야 한다.
이를 위해 values()로 모든 Enum 값을 가져오고 반복문을 사용했다.
OperatorType[] op = OperatorType.values();
OperatorType matchedOp = null;
for (OperatorType operatorType : op) {
if (cal == operatorType.getOp()) {
matchedOp = operatorType;
}
}
7. 찾은 Enum을 switch문에서 활용하기
연산자를 찾은 후에는 matchedOp를 switch문의 조건으로 사용할 수 있다.
switch (matchedOp) {
case SUM -> result = num1 + num2;
case SUB -> result = num1 - num2;
case MUL -> result = num1 * num2;
case DIV -> {
if (num2 == 0) {
System.out.println("나눗셈 연산에서 분모는 0이 올 수 없습니다.");
return 0;
}
result = num1 / num2;
}
}
여기서 중요한 점은 이제 +, -, *, /를 직접 비교하지 않는다는 것이다.
대신 Enum의 상수 자체를 기준으로 분기한다.
'TIL' 카테고리의 다른 글
| Spring MVC의 ArgumentResolver 등록하고 사용하기 (0) | 2026.07.27 |
|---|---|
| 싱글톤(Singleton) 패턴이란? (0) | 2026.07.23 |
| JPA N+1 문제란? (왜 생기고 어떻게 해결할까?) (0) | 2026.07.15 |
| [트러블슈팅] 고객 조회 시 주문 통계(총 주문 수 / 총 구매 금액) 추가하기 (0) | 2026.07.14 |
| [Spring] MVC에서 자주 사용하는 객체와 어노테이션 정리 (0) | 2026.07.08 |