(Java) 계산기 프로그램 만들기 - Lv 3

Yong Lee·2025년 3월 4일

계산기

목록 보기
3/4

계산기


개요

이 프로젝트는 자바 언어를 사용하여 여러 방법 방식으로 계산기 프로그램을 만들어 자바에 대한 이해도를 높이는 것을 목적으로 한 블로그입니다.
이 프로젝트는 level이 나뉘어져 있으며, level이 올라갈수록 백엔드 개발자스러운 코드로 변할 예정입니다.
현재 블로그는 level 1과 2에서 사용했던 코드를 사용하여 level 3의 코드를 만들었습니다.


조건

3. Enum, 제네릭, 람다를 이해한 계산기 만들기

  • 현재 사칙연산 계산기는 (➕,➖,✖️,➗) 이렇게 총 4가지 연산 타입으로 구성되어 있습니다.
    • Enum 타입을 활용하여 연산자 타입에 대한 정보를 관리하고 이를 사칙연산 계산기 ArithmeticCalculator 클래스에 활용 해봅니다.
  • 실수, 즉 double 타입의 값을 전달 받아도 연산이 수행하도록 만들기
    • 키워드 : 제네릭
      • 단순히, 기존의 Int 타입을 double 타입으로 바꾸는 게 아닌 점에 주의하세요!
    • 지금까지는 ArithmeticCalculator, 즉 사칙연산 계산기는 양의 정수(0 포함)를 매개변수로 전달받아 연산을 수행
    • 피연산자를 여러 타입으로 받을 수 있도록 기능을 확장
      • ArithmeticCalculator 클래스의 연산 메서드(calculate)
    • 위 요구사항을 만족할 수 있도록 ArithmeticCalculator 클래스를 수정합니다. (제네릭)
      • 추가적으로 수정이 필요한 다른 클래스나 메서드가 있다면 같이 수정 해주세요.

Code!

계산기 프로젝트 코드 보러가기


Trouble!

Enum

Enum이란 것에 대해 알고는 있었지만, 직접 사용해본 적은 없었습니다.
조건에서 사용하라고 해서 어떻게 써야할지 찾던 중, 계산식을 집어넣는 방향으로 잡았습니다.
훨씬 코드가 깔끔해지고 간결해져서 좋다고 생각했지만, Enum을 조금 더 공부해보니 사용법이 조금 잘못되었다는 것을 알게되었습니다.

어떤 문제였을까요?
단일 책임 원칙(SRP) 위반하고 있습니다.
👉 enum은 원래 데이터(연산자 종류)를 정의하는 것이 주요 역할입니다.
그런데 저의 코드에서는 Operator가 연산 기호 + 계산 로직까지 모두 담당하고 있습니다.

왜 분리해야할까요?
유지와 보수할 때 많은 문제들이 생깁니다.
만약 add 로직에 추가적으로 어떤 기능이나 예외처리를 추가하고 싶을 때 enum에 로직이 있다면?
enum은 그만큼 복잡해질 것입니다. 오히려 안 사용한 것만 못한 상황이 되는 것입니다.
게다가 새로운 연산을 추가할 때, enum을 수정해야 하므로 OCP(개방-폐쇄 원칙) 위반이 될 수도 있습니다.

Naming

개발을 할 때면 항상 네이밍을 어떻게 하는 것이 좋을지 고민하게 됩니다.
Formula라는 객체를 만들었습니다. 계산식에 필요한 변수들이 들어있는 캡슐화된 객체를 만들었습니다.
하지만 다른 사람들에게 보여줬을 때, formula는 무슨 용도냐는 말을 들었습니다.
최대한 사람들이 직관적으로 알 수 있는 파일 이름을 만드는게 중요하다는 생각을 했습니다.

소수점 포멧

결과 값을 double 타입으로 받았습니다.
그리고 콘솔로 확인해보니 쓸 때 없이 긴 소수점 결과가 나왔습니다.
100 / 1000은 왜 0.1이라는 결과가 나오지 않은 걸까요?

산술적으로는 0.1이 정답이 맞습니다.
하지만 컴퓨터는 실수를 이진법(2진수) 부동소수점으로 변환해서 저장합니다.
그런데 1/10 (0.1) 같은 일부 10진수는 2진수로 완벽하게 표현되지 않아서 근사값으로 저장되는 것입니다.

level3를 끝내고 찾은 트러블들을 level4에서 고쳐서 다시 한 번 얘기해보겠습니다.


profile
오늘은 어떤 새로운 것이 나를 즐겁게 할까?

0개의 댓글