본문 바로가기

Java

자바 계산기 구현

학습목표


  • 자바 문법 공부
  • git 활용법

요구사항 분석


  • 입력받는 문자열에 따라 (사칙연산), (원의 넓이)를 계산한다
  • 사칙 연산 계산기는 실수를 포함하여 계산 가능 해야한다.
  • (remove) 입력을 받을 시 가장 먼저 계산된 결과값을 삭제하는 기능이 필요하다.
  • (inquiry) 입력을 받을 시 저장된 결과값을 보여주는 기능이 필요하다.
  • (exit) 입력을 받을 시 프로그램 종료 다른 입력을 받는다면 처음으로 돌아가서 기능 수행

프로그래밍 요구사항


  • Scanner 사용
  • JCF 사용
  • forEach 사용
  • 접근제어자 설정(캡슐화) getter, setter 구현
  • static, final 사용 (상수)
  • 추상클래스, 인터페이스 사용
  • 메서드 책임 분리(SRP)
  • enum 사용 - 사칙연산에 추가
  • 제네릭 사용
  • 람다&스트림 사용

오류&해결


오류

intellij 터미널 한글 깨짐 현상
원인 : 터미널 문자 인코딩이 UTF-8로 일치되지 않아서 발생
해결 : export LANG=ko_KR.UTF-8 설정

fatal: The current branch main has no upstream branch.
원인 : 현재 브랜치가 원격 저장소(origin)의 main 브랜치가 연결(upstream)되어 있지 않아서 발생하는 오류

  • git remote -v : 로컬 저장소가 어떤 원격 저장소와 연결되어 있는지 보여준다.
  • upstream : 로컬 브랜치가 원격 브랜치와 연결(upstream)되어 있는지 확인
  • git push -u origin main
    • git push, git pull만 해도 자동으로 동기화
      해결 : git

입력을 기다리지 않고 다음 로직이 실행되는 현상
원인 : next() 사용 시 개행문자 \n은 읽지 않기 때문에 next 사용 후 nextLine을 사용하면 남아있는 개행 문자\n를 바로 읽어버려 입력을 건너뛰어서 발생
해결 : next()대신 nextLine()을 사용하여 개행 문자까지 읽는다.

다른 사람의 name과 email로 커밋 기록이 남는 현상
원인 : user.name, user.email을 설정해주지 않았다
해결
git config user.name 이름, git config user.email 이메일 설정
가장 최근 커밋 변경
git commit --amend --author="새이름 <새이메일>" --no-edit
여러 커밋을 한 번에 변경하고 싶을 때
git rebase -i --root -x "git commit --amend --author='새이름 <새이메일>' --no-edit"
잘못된 이름을 입력시 :q!로 나온 후
진행 중인 rebase를 중단
git rebase --abort
정상적으로 수정할 내용없이 저장되었다면
:wq 저장하고 에디터 종료
You have unstaged changes
리베이스 도중 커밋 수정 작업이 완료되었으나, 작업 디렉토리 변경사항(unstaged changes)가 남아있어 리베이스를 계속 할 수 없다
원인 : git commit --amend가 실행될 때 워킹 디렉토리나 인덱스에 변경이 남아있으면 Git은 리베이스를 중단하고 처리를 요구
해결
git status 로 어떤 파일이 변경되었는지 확인
변경사항을 커밋 후 git rebase --continue
The previous cherry-pick is now empty, possibly due to conflict resolution.
원인 : 커밋이 이미 워킹 트리에 반영되었거나, 충돌 해결 과정에서 변경점이 모두 사라져 empty커밋이 되었다.
해결 : 빈 커밋을 건너뛰는 방법 git rebase --skip
리베이스 성공 시

  • 로컬 브랜치의 커밋 해시를 모두 새로 만든다
  • 원격 저장소에는 이전 커밋들이 존재
  • 이 상태에서 git push를 할 경우 거부
    git push -f

git 커밋 메시지 수정
가장 최근 올라간 커밋 메시지 수정
git commit --amend -m "새로운 커밋 메시지"
수정할 커밋 개수(n)만큼 rebase 실행
git rebase -i HEAD~n
수정할 커밋의 pick을 reword로 변경
pick 기존 커밋 메시지 -> reword 기존 커밋 메시지
수정 후 원격 저장소에 반영(강제 푸시)
git push -f

기존 클래스를 제네릭으로 변경 후 오류
Unchecked call to 'result(T)' as a member of raw type
원인 : 제네릭 클래스 타입 파라미터를 명시하지 않고(raw type) 메서드 호출
해결 : 제네릭 타입 명시
Calculator<String> calculator = new ArithmeticCalculator();
객체 선언 시 반드시 타입 파라미터를 명시
Unchecked assignment
원인 : 제네릭 타입을 명확히 지정하지 않고 객체를 할당할 때 발생
해결 : 제네릭 타입 명시

제네릭을 사용할 때는 제네릭 추상 클래스Calculator<T>를 상속받는 모든 클래스는 <T> 가 무엇인지 명확하게 지정해야 한다.
Calculator<Double> calculator = new ArithmeticCalculator();
public class ArithmeticCalculator extends Calculator<Double> { ... }
raw type 사용 금지

Calculator calculator = ...; // X (raw type)
ArithmeticCalculator calculator = ...; // X (raw type)

실수 연산 결과가 달라지는 현상
원인 : 컴퓨터의 부동소수점 연산 특성
해결 : String.format() 사용해서 소수점 둘째짜리까지만 표현

double result = getOpration.operator(a, b);
addResult(String.format("%.2f", result));

git rebase 취소 관련
리베이스 진행 중 취소
git rebase --abort
리베이스 끝난 후
git reflog
이전 HEAD를 찾는다
git reset --hard HEAD@{n}

stream 사용
mapToDouble(Double::doubleValue)Double객체 대신 double 사용

  • 객체끼리도 비교가 가능하나 기본형을 쓰면 불필요한 박싱/언박싱 없이 바로 산술 연산이 가능하다
    max().orElse(Double.MIN_VALUE) 최대값을 구하고 리스트가 비어있다면 기본값 min을 사용
    filter(s -> {}) 각 원소 (s)에 대해 조건을 검사해서 true값만 남기고 false가 되는 값은 걸러냅니다.
    catch(NumberFormatException) 숫자가 아닌 문자열이면 결과에서 제외
    collect(Collectors.toList()) 필터링된 값들만 모아서 List<>로 만들어서 반환

https://github.com/liebigbear/java-calculator

'Java' 카테고리의 다른 글

Interceptor  (4) 2025.07.21
Spring 정리  (0) 2025.07.19
추상화와 상속  (2) 2025.07.10
클래스 문법  (1) 2025.07.08
[Java] 업캐스팅, 다운캐스팅  (0) 2025.07.07