char 대신 왜 enum을 쓰는지 처음부터 정리계산기 과제를 진행하면서 STEP 3에서 enum을 활용하라는 요구사항을 만났다.
처음에는 솔직히 이렇게 생각했다.
+,-,*,/는 그냥 문자니까char로 하면 되는 거 아닌가?
실제로 STEP 1, STEP 2까지는 char 타입으로도 계산기를 충분히 만들 수 있었다.
하지만 STEP 3에서는 단순히 “동작하는 계산기”를 넘어서,
연산자 타입을 더 명확하고 안전하게 관리하는 방식으로 코드를 개선하는 것이 핵심이었다.
이번 글에서는 내가 계산기 과제를 하면서 이해한
enum이 무엇인지,
왜 계산기에서 enum을 쓰는지,
기존 코드에 어떻게 연결했는지를 정리해보려고 한다.
enum은 정해진 값들만 가질 수 있도록 만든 특별한 타입이다.
예를 들어 이런 것들이 있다.
이런 값들은 공통점이 있다.
값의 종류가 미리 정해져 있다.
자바에서는 이렇게 정해진 종류만 있는 값들을 표현할 때 enum을 사용한다.
예를 들어 계산기의 연산자를 enum으로 만들면 이렇게 표현할 수 있다.
public enum OperatorType {
ADD,
SUBTRACT,
MULTIPLY,
DIVIDE
}
이제 OperatorType은 새로운 타입이 되고,
이 타입은 오직 아래 네 값만 가질 수 있다.
OperatorType.ADDOperatorType.SUBTRACTOperatorType.MULTIPLYOperatorType.DIVIDE즉, enum의 핵심은
아무 값이나 들어오지 못하게 하고, 정해진 값만 다루게 만드는 것
이라고 이해하면 된다.
char를 썼을까?처음 만들었던 계산기에서는 사용자가 사칙연산 기호를 직접 입력했다.
예를 들면 이런 식이다.
char operator = scanner.next().charAt(0);
그리고 계산할 때는 이렇게 비교했다.
if (operator == '+') {
result = a + b;
} else if (operator == '-') {
result = a - b;
} else if (operator == '*') {
result = a * b;
} else if (operator == '/') {
result = a / b;
}
이 방식은 동작은 잘 한다.
하지만 문제는 char 타입은 연산자만 넣는 타입이 아니라는 점이다.
즉 아래 같은 값도 모두 들어갈 수 있다.
'a''?''1'즉 char는 그저 “문자 한 글자”를 저장하는 타입일 뿐이고,
“연산자 전용 타입”은 아니다.
여기서 enum을 쓰는 이유가 생긴다.
계산기에서는 사실 연산자의 종류가 딱 4개로 정해져 있다.
즉 아무 문자나 들어오는 게 아니라
정해진 연산자만 관리하고 싶다는 요구가 있다.
이럴 때 enum을 사용하면 코드가 훨씬 명확해진다.
char operator = '+';
OperatorType operatorType = OperatorType.ADD;
둘 다 결국 더하기를 의미하지만,
OperatorType.ADD 쪽이 훨씬 의미가 분명하다.
'+'는 그냥 문자 하나처럼 보이지만,
ADD는 누가 봐도 “더하기 연산자”라는 걸 알 수 있다.
즉 enum을 쓰면
는 장점이 있다.
사용자는 여전히 +, -, *, /를 입력한다.
하지만 프로그램 내부에서는 이 문자를 바로 계산에 쓰지 않고,
먼저 enum 값으로 바꾸도록 했다.
즉 흐름은 이렇게 바뀐다.
'+' -> 바로 Calculator에 전달
'+' -> OperatorType.ADD 로 변환 -> Calculator에 전달
즉 사용자 입력은 여전히 문자지만,
프로그램 내부 계산 로직은 enum 기반으로 동작하게 바꾼 것이다.
먼저 연산자의 종류를 enum으로 정의했다.
package com.example.calculator;
public enum OperatorType {
ADD,
SUBTRACT,
MULTIPLY,
DIVIDE
}
이제 OperatorType은 계산기에서 사용하는 연산자 타입이 되었다.
문제는 사용자가 입력하는 값은 +, -, *, / 같은 문자라는 점이다.
그래서 이 문자를 enum 값으로 변환해주는 메서드가 필요했다.
package com.example.calculator;
public enum OperatorType {
ADD,
SUBTRACT,
MULTIPLY,
DIVIDE;
public static OperatorType fromChar(char operator) {
if (operator == '+') {
return ADD;
} else if (operator == '-') {
return SUBTRACT;
} else if (operator == '*') {
return MULTIPLY;
} else if (operator == '/') {
return DIVIDE;
} else {
throw new IllegalArgumentException("잘못된 연산자입니다.");
}
}
}
이 메서드는 말 그대로
문자(char)를 받아서 OperatorType으로 바꾸는 역할을 한다.
예를 들어:
OperatorType type = OperatorType.fromChar('+');
이렇게 하면 결과는:
OperatorType.ADD
가 된다.
즉, 사용자 입력을 프로그램 내부에서 안전하게 사용할 수 있는 enum 값으로 바꾸는 과정이라고 보면 된다.
원래 Calculator 클래스는 char를 매개변수로 받았었다.
public int calculate(int a, int b, char operator) {
int result = 0;
if (operator == '+') {
result = a + b;
} else if (operator == '-') {
result = a - b;
} else if (operator == '*') {
result = a * b;
} else if (operator == '/') {
result = a / b;
}
results.add(result);
return result;
}
이제는 char 대신 OperatorType을 받도록 바꾸었다.
public int calculate(int a, int b, OperatorType operatorType) {
int result = 0;
if (operatorType == OperatorType.ADD) {
result = a + b;
} else if (operatorType == OperatorType.SUBTRACT) {
result = a - b;
} else if (operatorType == OperatorType.MULTIPLY) {
result = a * b;
} else if (operatorType == OperatorType.DIVIDE) {
result = a / b;
}
results.add(result);
return result;
}
여기서 핵심 변화는 두 가지였다.
char에서 OperatorType으로 바뀜'+' 같은 문자에서 OperatorType.ADD 같은 enum 값으로 바뀜이렇게 바꾸니 계산 로직이 훨씬 의미 중심으로 읽히기 시작했다.
사용자 입력은 그대로 문자로 받았다.
char operator


= scanner.next().charAt(0);
그다음 바로 Calculator에 넘기는 대신,
먼저 enum으로 바꿨다.
OperatorType operatorType = OperatorType.fromChar(c);
그리고 이 enum 값을 Calculator에 전달했다.
int result = calculator.calculate(a, b, operatorType);
즉 App 클래스의 역할은
가 되었다.
처음에는 솔직히
“문자 하나 받아서 if문으로 계산하면 되는데 굳이 enum까지 써야 하나?”
라는 생각이 들었다.
하지만 직접 적용해보니 enum의 장점이 조금씩 보이기 시작했다.
'+'보다는 OperatorType.ADD가 훨씬 읽기 쉽다.
연산자는 아무 문자나 들어오는 값이 아니라,
정해진 4가지 중 하나라는 사실이 코드 구조에 반영된다.
지금은 단순히 연산 종류만 관리하지만,
나중에는 각 enum에 기호, 설명, 계산 로직까지 붙일 수도 있다.
즉 enum은 단순히 “문법 하나 더 배운 것”이 아니라
정해진 종류를 더 안전하게 표현하는 방식이라는 걸 느꼈다.
이번 계산기 과제에서 enum을 적용하면서 가장 중요하게 느낀 점은 다음과 같다.
enum은 정해진 값들만 가지는 타입이다.char로 직접 비교했지만,한 줄로 정리하면:
계산기에서 enum을 사용한다는 것은
연산자를 단순한 문자로 다루는 것이 아니라,
정해진 연산 타입으로 명확하게 관리하겠다는 의미였다.
처음에는 enum이 조금 추상적으로 느껴졌지만,
계산기처럼 연산자 종류가 명확한 예제에 직접 붙여보니 왜 필요한지 이해가 됐다.
이번 과제를 통해
단순히 “계산이 되게 만드는 것”에서 한 걸음 더 나아가,
코드를 더 명확하고 구조적으로 표현하는 방법을 조금씩 배우고 있다는 느낌이 들었다.
다음에는 enum뿐만 아니라
제네릭, 람다, 스트림도 계산기 과제에 어떻게 연결되는지 차근차근 정리해보고 싶다.