오늘 제일 힘들었던 건 코드 자체보다 "지금 내가 어느 클래스에 있고, 이 값이 어디서 와서 어디로 가는지"를 놓치는 부분이었다. App1과 Calculator3_1을 왔다갔다 하다 보면 머릿속에서 흐름이 끊긴다.
App1 (입력/출력) Calculator3_1 (계산/저장)
num1, num2, op ──────────▶ calculate(num1, num2, op)
│
switch로 연산 → result
│
results.add(result)
result ◀────────────────── return result
calculator.getResults() ──▶ results 리턴 (읽기만)
calculator.removeResult() ─▶ results.remove(0)
App은 "값을 보내고 결과를 받는" 쪽이고, Calculator는 "값을 받아서 계산하고 저장하는" 쪽이다. 이걸 표로 그려보고 나서야 어디서 막혔는지 보였다.
내용 정리
1. 데이터 흐름이 헷갈렸던 지점
App1에서 calculator.calculate(num1, num2, op)를 호출하면 그 세 값이 Calculator3_1의 calculate 메서드 파라미터로 들어간다. 거기서 계산한 result는 results에 저장도 되고, 동시에 return으로 App1 쪽에도 돌아온다. 즉 한 번의 호출로 "저장"과 "리턴" 두 가지가 같이 일어난다.
여기서 착각했던 부분은 calculate를 호출하면 App1의 result 변수에 값이 들어오니까, results 리스트에 저장되는 건 또 다른 단계라고 생각한 것이다. 실제로는 calculate 메서드 안에서 results.add(result)와 return result가 같은 메서드 안에 같이 있어서 동시에 처리된다.
public Integer calculate(int num1, int num2, char op){
int result;
switch (op) {
case '+' -> result = num1 + num2;
...
}
results.add(result); // 저장
return result; // 동시에 App한테 돌려줌
}
2. {} 안에 로직을 넣는 기준
switch 식에서 case '/' -> { ... }처럼 중괄호를 쓰는 경우와 case '+' -> result = num1 + num2;처럼 한 줄로 끝내는 경우가 헷갈렸다. 기준은 단순했다. 한 줄로 끝나면 중괄호 없이 바로 식을 쓰고, 조건 분기나 여러 줄이 필요하면 {}로 묶는다.
case '/' -> {
if (num2 == 0) {
throw new ArithmeticException("0으로 나눌 수 없습니다.");
}
result = num1 / num2;
}
나눗셈만 0 체크가 추가로 필요해서 {}가 붙은 거고, 다른 연산자는 한 줄이라 안 붙는다. 이걸 모든 case에 통일해서 {}를 붙여야 하나 말아야 하나로 한참 헤맸는데, 줄 수가 기준이라는 걸 알고 나니 정리됐다.
3. 메서드 선언부 문법 실수 - 괄호와 세미콜론
오늘 가장 어이없었던 버그.
public void removeResult; {
results.remove(0);
}
메서드 이름 뒤에 괄호 ()가 빠지고 대신 세미콜론이 붙어 있었다. 자바는 이걸 메서드 선언으로 인식하지 못하고 컴파일 자체가 깨진다.
public void removeResult() {
results.remove(0);
}
괄호 하나 빠진 걸로 전체가 안 돌아갔다. App1에서는 calculator.removeResult();로 이미 매개변수 없이 호출하고 있었으니, Calculator 쪽 선언만 고치면 맞아떨어지는 구조였다.
4. 출력 위치 - 반복문 안인지 밖인지
System.out.println("현재 저장된 결과들 : " + calculator.getResults())를 while 루프 밖에 써놨더니 "exit"을 입력하기 전까지는 한 번도 안 찍혔다. 코드 자체는 문제가 없었는데, 위치가 반복문 밖이라 매번 계산할 때마다 보여야 하는 결과가 마지막에 딱 한 번만 출력됐다.
while (!exit.equals("exit")) {
// 계산 로직
System.out.println("현재 저장된 결과들 : " + calculator.getResults()); // 루프 안으로 이동
...
}
같은 한 줄이어도 중괄호 안에 있는지 밖에 있는지에 따라 "한 번만 실행"과 "반복마다 실행"이 갈린다는 걸 직접 겪어봐야 체감이 됐다.
학습 메모
- 클래스 두 개를 오가는 코드를 읽을 때는 "지금 어느 클래스 안에 있는지"를 손으로 표시하면서 따라가는 게 도움이 됐다. 머릿속으로만 추적하면 중간에 놓친다.
- {} 유무는 거의 항상 "이 케이스가 한 줄로 끝나는가, 여러 줄/조건이 필요한가"로 판단하면 된다.
- 메서드 선언에서 괄호가 빠지면 에러 메시지가 직관적으로 안 나올 때가 있어서, 컴파일 에러가 이상하게 뜨면 메서드 헤더부터 다시 본다.
- 반복문 안/밖 위치는 "이 출력이 매번 필요한가, 끝나고 한 번만 필요한가"를 먼저 정하고 나서 코드 위치를 정하는 순서로 가야 한다.
핵심 요약
| App-Calculator 데이터 흐름 | 저장과 리턴이 한 메서드에서 동시에 일어남 | calculate 메서드 안에서 add와 return이 같이 처리됨을 확인 |
| {} 사용 기준 | 모든 case에 통일해야 한다고 착각 | 한 줄이면 생략, 조건/여러 줄이면 {} |
| removeResult; 컴파일 에러 | 괄호 빠짐 + 세미콜론 위치 | removeResult()로 수정 |
| 결과 출력이 한 번만 됨 | 출력문이 while 루프 밖에 위치 | 루프 안으로 이동 |
'Camp > 과제' 카테고리의 다른 글
| [TIL]CH 3 일정 관리 앱 만들기 (0) | 2026.07.01 |
|---|---|
| [계산기 과제 2차] 트러블슈팅 (0) | 2026.06.23 |
| [Java] 코드카타 트러블 슈팅 (0) | 2026.06.17 |
| Camp/과제[TIL] CH2 Java 계산기 과제 Lv.2 (트러블 슈팅) (0) | 2026.06.16 |
| [TIL] CH2 Java 계산기 과제 again (트러블 슈팅) (0) | 2026.06.15 |