스파르타 11일차

임선구·6일 전

스파르타

목록 보기
11/14

Java 계산기 과제에서 Enum 이해하기

char 대신 왜 enum을 쓰는지 처음부터 정리

계산기 과제를 진행하면서 STEP 3에서 enum을 활용하라는 요구사항을 만났다.
처음에는 솔직히 이렇게 생각했다.

+, -, *, /는 그냥 문자니까 char로 하면 되는 거 아닌가?

실제로 STEP 1, STEP 2까지는 char 타입으로도 계산기를 충분히 만들 수 있었다.
하지만 STEP 3에서는 단순히 “동작하는 계산기”를 넘어서,
연산자 타입을 더 명확하고 안전하게 관리하는 방식으로 코드를 개선하는 것이 핵심이었다.

이번 글에서는 내가 계산기 과제를 하면서 이해한
enum이 무엇인지,
왜 계산기에서 enum을 쓰는지,
기존 코드에 어떻게 연결했는지를 정리해보려고 한다.


1. enum이란 무엇인가?

enum정해진 값들만 가질 수 있도록 만든 특별한 타입이다.

예를 들어 이런 것들이 있다.

  • 요일: 월, 화, 수, 목, 금, 토, 일
  • 계절: 봄, 여름, 가을, 겨울
  • 상태: 대기중, 진행중, 완료
  • 연산자: 더하기, 빼기, 곱하기, 나누기

이런 값들은 공통점이 있다.

값의 종류가 미리 정해져 있다.

자바에서는 이렇게 정해진 종류만 있는 값들을 표현할 때 enum을 사용한다.

예를 들어 계산기의 연산자를 enum으로 만들면 이렇게 표현할 수 있다.

public enum OperatorType {
    ADD,
    SUBTRACT,
    MULTIPLY,
    DIVIDE
}

이제 OperatorType은 새로운 타입이 되고,
이 타입은 오직 아래 네 값만 가질 수 있다.

  • OperatorType.ADD
  • OperatorType.SUBTRACT
  • OperatorType.MULTIPLY
  • OperatorType.DIVIDE

즉, enum의 핵심은

아무 값이나 들어오지 못하게 하고, 정해진 값만 다루게 만드는 것

이라고 이해하면 된다.


2. 기존 계산기에서는 왜 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을 쓰는 이유가 생긴다.


3. 계산기에서 enum을 쓰는 이유

계산기에서는 사실 연산자의 종류가 딱 4개로 정해져 있다.

  • 더하기
  • 빼기
  • 곱하기
  • 나누기

즉 아무 문자나 들어오는 게 아니라
정해진 연산자만 관리하고 싶다는 요구가 있다.

이럴 때 enum을 사용하면 코드가 훨씬 명확해진다.

기존 방식

char operator = '+';

enum 방식

OperatorType operatorType = OperatorType.ADD;

둘 다 결국 더하기를 의미하지만,
OperatorType.ADD 쪽이 훨씬 의미가 분명하다.

'+'는 그냥 문자 하나처럼 보이지만,
ADD는 누가 봐도 “더하기 연산자”라는 걸 알 수 있다.

즉 enum을 쓰면

  • 의미가 더 명확해지고
  • 잘못된 값을 관리하기 쉬워지고
  • 연산자의 종류를 타입 차원에서 제한할 수 있다

는 장점이 있다.


4. 계산기에 enum을 어떻게 붙였는가?

사용자는 여전히 +, -, *, /를 입력한다.
하지만 프로그램 내부에서는 이 문자를 바로 계산에 쓰지 않고,
먼저 enum 값으로 바꾸도록 했다.

즉 흐름은 이렇게 바뀐다.

예전 방식

'+' -> 바로 Calculator에 전달

enum 적용 후 방식

'+' -> OperatorType.ADD 로 변환 -> Calculator에 전달

즉 사용자 입력은 여전히 문자지만,
프로그램 내부 계산 로직은 enum 기반으로 동작하게 바꾼 것이다.


5. OperatorType enum 만들기

먼저 연산자의 종류를 enum으로 정의했다.

package com.example.calculator;

public enum OperatorType {
    ADD,
    SUBTRACT,
    MULTIPLY,
    DIVIDE
}

이제 OperatorType은 계산기에서 사용하는 연산자 타입이 되었다.


6. 문자 입력을 enum으로 바꾸는 메서드 추가

문제는 사용자가 입력하는 값은 +, -, *, / 같은 문자라는 점이다.
그래서 이 문자를 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 값으로 바꾸는 과정이라고 보면 된다.


7. 기존 Calculator 클래스 수정하기

원래 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;
}

여기서 핵심 변화는 두 가지였다.

  1. 매개변수가 char에서 OperatorType으로 바뀜
  2. 비교 대상이 '+' 같은 문자에서 OperatorType.ADD 같은 enum 값으로 바뀜

이렇게 바꾸니 계산 로직이 훨씬 의미 중심으로 읽히기 시작했다.


8. App 클래스에서는 어떻게 연결했는가?

사용자 입력은 그대로 문자로 받았다.

char operator![](https://velog.velcdn.com/images/loaded_diaper/post/3c15d636-f7a5-4d3c-af62-619e293eb424/image.png)
![](https://velog.velcdn.com/images/loaded_diaper/post/2b29aaa4-8fab-4ea9-9c49-699f0e312eb9/image.png)
![](https://velog.velcdn.com/images/loaded_diaper/post/f04d90c3-ea63-4161-88c9-4f473e001d2c/image.png)
 = scanner.next().charAt(0);

그다음 바로 Calculator에 넘기는 대신,
먼저 enum으로 바꿨다.

OperatorType operatorType = OperatorType.fromChar(c);

그리고 이 enum 값을 Calculator에 전달했다.

int result = calculator.calculate(a, b, operatorType);

즉 App 클래스의 역할은

  • 입력 받기
  • 입력받은 문자를 enum으로 변환하기
  • Calculator에 넘기기

가 되었다.


9. enum을 적용하면서 느낀 점

처음에는 솔직히
“문자 하나 받아서 if문으로 계산하면 되는데 굳이 enum까지 써야 하나?”
라는 생각이 들었다.

하지만 직접 적용해보니 enum의 장점이 조금씩 보이기 시작했다.

1) 코드 의미가 더 분명해진다

'+'보다는 OperatorType.ADD가 훨씬 읽기 쉽다.

2) 정해진 값만 다룬다는 것이 코드에서 드러난다

연산자는 아무 문자나 들어오는 값이 아니라,
정해진 4가지 중 하나라는 사실이 코드 구조에 반영된다.

3) 나중에 확장하기 좋다

지금은 단순히 연산 종류만 관리하지만,
나중에는 각 enum에 기호, 설명, 계산 로직까지 붙일 수도 있다.

즉 enum은 단순히 “문법 하나 더 배운 것”이 아니라
정해진 종류를 더 안전하게 표현하는 방식이라는 걸 느꼈다.


10. 정리

이번 계산기 과제에서 enum을 적용하면서 가장 중요하게 느낀 점은 다음과 같다.

  • enum정해진 값들만 가지는 타입이다.
  • 계산기의 연산자처럼 종류가 미리 정해져 있는 값에 잘 어울린다.
  • 기존에는 char로 직접 비교했지만,
  • enum을 사용하면 의미가 더 분명하고 안전한 코드가 된다.
  • 사용자 입력은 문자로 받더라도, 프로그램 내부에서는 enum으로 변환해서 처리할 수 있다.

한 줄로 정리하면:

계산기에서 enum을 사용한다는 것은
연산자를 단순한 문자로 다루는 것이 아니라,
정해진 연산 타입으로 명확하게 관리하겠다는 의미였다.


마무리

처음에는 enum이 조금 추상적으로 느껴졌지만,
계산기처럼 연산자 종류가 명확한 예제에 직접 붙여보니 왜 필요한지 이해가 됐다.

이번 과제를 통해
단순히 “계산이 되게 만드는 것”에서 한 걸음 더 나아가,
코드를 더 명확하고 구조적으로 표현하는 방법을 조금씩 배우고 있다는 느낌이 들었다.

다음에는 enum뿐만 아니라
제네릭, 람다, 스트림도 계산기 과제에 어떻게 연결되는지 차근차근 정리해보고 싶다.


profile
끝까지 가면 내가 다 이겨

0개의 댓글