카테고리 없음

[TIL] CalculatorProject 하면서 만난 트러블슈팅 3가지

mooncommit 2026. 3. 25. 12:13

STEP 2 진행하면서 문제가 되었던 것을 정리해보았다.


1. IntelliJ에서 push했더니 갑자기 거부당함

IntelliJ에서 커밋하고 push 버튼 눌렀더니 이런 창이 떴다.

저장소 'CalculatorProject' 내 현재 브랜치 'main'의 푸시가 거부되었습니다.
푸시 전 원격 변경 내용을 병합해야 합니다.

병합 버튼 눌렀더니 이번엔 Merge Conflict 창이 또 뜨고... Calculator.javaworkspace.xml에서 충돌났다고 했다.

터미널 보니까 이런 메시지가 찍혀 있었다.

hint: You have divergent branches and need to specify how to reconcile them.

GitHub 원격에 내 로컬에 없는 커밋이 있었다.

로컬이랑 원격이 서로 다른 방향으로 수정된 상태에서 무작정 push하려 해서 거부당했던 것이다.

IntelliJ GUI로 계속 해결하려다 더 꼬일 것 같아서 그냥 터미널로 정석대로 처리했다.

git pull origin main

pull 하니까 merge conflict 발생했고, 충돌난 파일 직접 열어서 수정한 다음에 필요한 파일만 골라서 add했다.

git add Calculator.java
git commit -m "해결 완"
git push origin main

기본을 익히지 않고 마우스 클릭으로 편하게 하려다 오히려 더 헤맸다. 터미널로 하는 방법을 익히고 사용해야 될 것 같다.


2. GitHub 열어봤더니 필요없는 파일이 다 올라가 있음

GitHub 저장소 확인했더니 src 폴더 외에 .idea, .gitignore, CalculatorProject.iml, README.md까지 전부 올라가 있었다. src만 있으면 되는데 불필요한 것들이 다 딸려 왔다.

삭제 전 GitHub

.idea는 IntelliJ가 IDE 설정 저장용으로 만드는 폴더라 소스코드랑 전혀 상관없는 파일인데, 처음에 신경 안 쓰고 커밋했더니

그냥 같이 올라가버렸다.

방법을 찾아본 후 로컬 파일은 그대로 두고 GitHub에서만 삭제하고 싶어서 --cached 옵션을 썼다.

git rm -r --cached .idea
git rm --cached .gitignore
git rm --cached CalculatorProject.iml
git rm --cached README.md
git commit -m "불필요한 파일 삭제"
git push origin main

--cached를 쓰면 내 컴퓨터에서는 파일이 그대로 있고 GitHub에서만 삭제된다.

현재 GitHub

그랬더니 저장소가 src 폴더만 남아서 깔끔해졌다. 앞으로는 처음 커밋 전에 뭘 올릴지 꼭 확인할 것이다.


3. 예외 처리 했는데 결과에 0이 자꾸 찍힘

처음에 Calculator 클래스의 calculator() 메서드 안 switch문에서 예외 처리를 했다.
0으로 나누면 오류 메시지 출력 후 break, 잘못된 연산자면 default에서 오류 메시지 출력 후 break.

// 문제 있는 코드
switch (operator) {
    case '+': result = first + second; break;
    case '-': result = first - second; break;
    case '*': result = first * second; break;
    case '/':
        if (second == 0) {
            System.out.println("0으로 나눌 수 없습니다.");
            break;  // switch만 빠져나옴
        } else {
            result = first / second;
            break;
        }
    default:
        System.out.println("올바른 사칙연산을 입력해주세요.");
        break;  // switch만 빠져나옴
}
results.add(result);  // ⚠️ 여기가 문제
return result;

실행해보면 이렇게 나왔다.

// 0으로 나누기 시도했을 때
0으로 나눌 수 없습니다.
결과 : 0        ← ???

// 이상한 연산자 입력했을 때
올바른 사칙연산을 입력해주세요.
결과 : 0        ← ???

오류 메시지는 잘 뜨는데 결과에 0이 같이 찍히고 기록에도 남았다. 처음에는 왜 이러는지 몰랐는데,

원인은 break가 switch 블록만 탈출한다는 거였다.

 

switch를 break로 빠져나와도 그 아래의 results.add(result)return result는 그대로 실행된다. result는 아무것도 안 담긴 초기값 0 상태니까 결국 results.add(0)이 실행되는 것이다.

 

두 케이스 모두 원인이 같았다.

  • 0 나누기 → result 그대로 0 → switch 탈출 → results.add(0) 실행
  • 잘못된 연산자 → result 그대로 0 → switch 탈출 → results.add(0) 실행

그래서 예외 처리를 Calculator.java 안에서 하지 말고 App.java의 루프에서 미리 걸러내도록 옮겼다.

// 수정된 App.java
if (!(operator == '+' || operator == '-' || operator == '*' || operator == '/')) {
    System.out.println("올바른 사칙연산 기호를 입력해주세요.");
    continue;  // calculator() 호출 자체를 안 함
}

if (operator == '/' && second == 0) {
    System.out.println("0으로 나눌 수 없습니다.");
    continue;  // calculator() 호출 자체를 안 함
}

int result = calculator.calculator(first, second, operator);
System.out.println("결과 : " + result);
// 수정된 Calculator.java
switch (operator) {
    case '+': result = first + second; break;
    case '-': result = first - second; break;
    case '*': result = first * second; break;
    case '/': result = first / second; break;
}
results.add(result);
return result;

이제 잘못된 입력이 들어오면 오류 메시지만 출력하고 continue로 루프 처음으로 돌아간다. calculator() 자체를 호출 안 하니까 0이 리스트에 쌓일 일이 없다.

calculator.java 수정 전 / 후
App.java 수정 전 / 후

아는 것과 직접 짜는 건 다르다는 걸 느꼈다. 앞으로는 예외 처리를 계산 시작 전에 미리 걸러내는 방식으로 짜는 습관을 들여야겠다.


STEP 2 완료 ✅ ㅎㅎ