[내일배움캠프] - DAY12 제네릭, Enum, 람다, 스트림을 활용하여 계산기 개선하기

2026. 1. 18. 22:38·TIL & 트러블 슈팅

계산기 구조 개선

오늘은 이전에 만들었던 계산기를 제네릭, Enum, 람다, 스트림을 활용하여 확장성과 가독성을 고려한 코드로 리팩토링하는 과정을 보여드릴려고 합니다.


현재 사칙연산 계산기는 (➕,➖,✖️,➗) 이렇게 총 4가지 연산 타입으로 구성되어 있습니다.

  • Enum 타입을 활용하여 연산자 타입에 대한 정보를 관리하고 이를 사칙연산 계산기 ArithmeticCalculator 클래스에 활용 해봅니다.

 

기존에는 Calculator 클래스 내부에서 switch 문을 사용하여 연산자를 구분하고 그에 따라 결과를 계산하는 방식으로 로직을 구현하였습니다. 하지만 이러한 구조는 연산자가 추가될수록 조건문이 길어지고, 코드의 가독성과 확장성이 떨어지는 문제가 있어 이를 개선하기 위해 이번 리팩토링에서는 연산자별 로직을 Enum으로 분리하여, 각 연산이 스스로의 책임을 가지도록 구조를 변경했습니다.

 

 

위 코드는 OperatorType Enum이 연산자의 역할과 책임을 스스로 수행할 수 있도록 설계한 부분입니다. 생성자를 통해 각 연산자 Enum 상수에 맞는 기호를 저장하도록 하여, 연산자와 기호 간의 관계를 명확하게 정의합니다. 또한 apply 메서드를 추상 메서드로 선언하여, 각 연산자가 반드시 자신만의 연산 로직을 구현하도록 강제합니다.

 

 

 

실수, 즉 double 타입의 값을 전달 받아도 연산이 수행하도록 만들기

  • 키워드 : 제네릭(단순히, 기존의 Int 타입을 double 타입으로 바꾸는 게 아닌 점에 주의하세요!)
  • 지금까지는 ArithmeticCalculator, 즉 사칙연산 계산기는 양의 정수(0 포함)를 매개변수로 전달받아 연산을 수행
  • 피연산자를 여러 타입으로 받을 수 있도록 기능을 확장(ArithmeticCalculator 클래스의 연산 메서드(calculate))
  • 위 요구사항을 만족할 수 있도록 ArithmeticCalculator 클래스를 수정합니다. (제네릭) - 추가적으로 수정이 필요한 다른 클래스나 메서드가 있다면 같이 수정 해주세요.

 

calculator 메서드는 제네릭(<T extends Number, U extends Number>)을 활용하여 문제 요구사항인 소수점 계산이 가능하도록 구현했습니다. 또한 전달받은 OperatorType의 apply 메서드를 호출함으로써, 실제 연산 로직은 Enum이 담당하고 계산기는 결과만 받아 처리하도록 역할을 분리했습니다.

 

계산이 완료된 결과는 results 리스트에 저장되며, getResults 메서드를 통해 외부에서 결과 목록을 조회할 수 있습니다. 또한 removeResults 메서드를 통해 사용자가 가장 먼저 저장된 결과를 제거할 수 있도록 하여, 사용자가 계산 결과를 효율적으로 관리할 수 있도록 로직을 구현하였습니다.

 

 

계산 로직을 분리한 이후, 메인 클래스도 사용자로부터 입력을 받아 계산기에 전달하는 흐름 제어 역할만 담당하도록 하였습니다.

 

저장된 연산 결과들 중 Scanner로 입력받은 값보다 큰 결과값 들을 출력

  • ArithmeticCalculator 클래스에 위 요구사항을 만족하는 조회 메서드를 구현합니다.
  • 단, 해당 메서드를 구현할 때 Lambda & Stream을 활용하여 구현합니다.(Java 강의에서 람다 & 스트림을 학습 및 복습 하시고 적용 해보세요!)
  • 추가) 람다 & 스트림 학습을 위해 여러 가지 조회 조건들을 추가하여 구현 해보시면 학습에 많은 도움이 되실 수 있습니다.

 

 

위 코드에서 getResultsGreaterThan 메서드는 저장된 계산 결과 중에서 특정 값(threshold)보다 큰 결과만 조회하기 위한 역할을 합니다. results 리스트를 스트림으로 변환 후, 람다 표현식을 사용해 기준 값보다 큰 요소만 필터링하고, 그 결과를 다시 리스트로 수집합니다. 이를 통해 반복문이나 조건문 없이도 간결하고 직관적인 결과 조회 로직을 구현했습니다. 메인 클래스에서는 사용자에게 결과 조회 여부를 입력 받아, 사용자가 입력한 값을 기준값으로 하여, 기준값 보다 큰 수 가 출력되도록 하였습니다.


[ 오늘 배운 학습 ]

이전에는 클래스를 분리하지 않고 메인 클래스에서 대부분의 로직을 처리하는 방식으로 프로그래밍을 해왔었습니다. 그로 인해 제네릭, 람다, 스트림과 같은 객체지향 언어의 핵심 개념에 대한 이해가 부족했고, 코드의 가독성도 떨어질 수 밖에 없었습니다. 이번 계산기 과제를 리팩토링 하면서 제네릭과 람다, 스트림 개념을 이해했다고 생각했지만, 실제로 코드에 적용해보는 과정에서 여전히 헷갈리는 부분이 많다는 것을 느꼈습니다. 그럼에도 직접 구현해보며 각 문법의 역할과 사용 목적을 정리해볼 수 있었던점이 매우 의미 있는 학습 경험이었다고 생각합니다.

'TIL & 트러블 슈팅' 카테고리의 다른 글

[내일배움캠프] - DAY14 자료구조와 알고리즘-2  (0) 2026.01.27
[내일배움캠프] - DAY13 자료구조와 알고리즘-1  (0) 2026.01.26
[내일배움캠프] - DAY11 자바에 대해 알아보자-3  (0) 2026.01.16
[내일배움캠프] - DAY10 계산기 만들기  (0) 2026.01.13
[내일배움캠프] - DAY9 플로우차트  (0) 2026.01.12
'TIL & 트러블 슈팅' 카테고리의 다른 글
  • [내일배움캠프] - DAY14 자료구조와 알고리즘-2
  • [내일배움캠프] - DAY13 자료구조와 알고리즘-1
  • [내일배움캠프] - DAY11 자바에 대해 알아보자-3
  • [내일배움캠프] - DAY10 계산기 만들기
N_HYUN
N_HYUN
안녕하세요! 현이의 개발 공부방입니다.
  • N_HYUN
    현이의 개발 공부방
    N_HYUN
  • 전체
    오늘
    어제
    • 분류 전체보기 (29)
      • FrontEnd (0)
      • BackEnd (0)
        • Java (0)
      • DataBase (1)
      • TIL & 트러블 슈팅 (24)
      • Etc (4)
        • Theoretical Computer Scienc.. (1)
        • Web & CS (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
N_HYUN
[내일배움캠프] - DAY12 제네릭, Enum, 람다, 스트림을 활용하여 계산기 개선하기
상단으로

티스토리툴바