
🚩STEP 1. 클래스 없이 기본적인 연산을 수행할 수 있는 계산기 만들기
- 일단 만들기
package com.example.calculator;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true){
// Scanner를 사용하여 양의 정수를 입력받는다
System.out.print("첫 번째 숫자를 입력하세요: ");
int num1 = sc.nextInt();
System.out.print("두 번째 숫자를 입력하세요: ");
int num2 = sc.nextInt();
// 사칙연산 기호를 입력받는다
System.out.print("사칙연산 기호를 입력하세요: ");
char oper = sc.next().charAt(0);
switch (oper){
case '+':
System.out.println("결과: " + (num1 + num2));
break;
case '-':
System.out.println("결과: " + (num1 - num2));
break;
case '*':
System.out.println("결과: " + (num1 * num2));
break;
case '/':
if(num2 == 0){
System.out.println("나눗셈 연산에서 분모(두 번째 정수)에 0이 입력될 수 없습니다.");
} else {
System.out.println("결과: " + (num1 / num2));
}
break;
default:
System.out.println("올바른 연산 기호를 입력하세요 (+, -, *, /)");
}
System.out.println("더 계산하시겠습니까? exit 입력 시 종료");
String exit = sc.next();
if (exit.equals("exit")){
System.out.println("계산기를 종료합니다");
break;
}
}
sc.close();
}
}
- 변수 result값
package com.example.calculator;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true){
// Scanner를 사용하여 양의 정수를 입력받는다
System.out.print("첫 번째 숫자를 입력하세요: ");
int num1 = sc.nextInt();
System.out.print("두 번째 숫자를 입력하세요: ");
int num2 = sc.nextInt();
// 사칙연산 기호를 입력받는다
System.out.print("사칙연산 기호를 입력하세요: ");
char oper = sc.next().charAt(0);
int result = 0;
boolean isValid = true;
switch (oper){
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
if(num2 == 0){
System.out.println("나눗셈 연산에서 분모(두 번째 정수)에 0이 입력될 수 없습니다.");
isValid = false;
} else {
result = num1 / num2;
}
break;
default:
System.out.println("올바른 연산 기호를 입력하세요 (+, -, *, /)");
isValid = false;
}
if (isValid){
System.out.println("결과: " + result);
}
System.out.println("더 계산하시겠습니까? exit 입력 시 종료");
String exit = sc.next();
if (exit.equals("exit")){
System.out.println("계산기를 종료합니다");
break;
}
}
sc.close();
}
}
❗ 그런데 문제 발생 이렇게 만들었더니 내가 실수로 num1과 num2에 숫자를 안 입력하고 다른 것을 입력했더니 그냥 프로그램이 종료가 되어 버린다
- 예외처리
package com.example.calculator;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(true){
int num1 = 0;
int num2 = 0;
while(true){
try {
// Scanner를 사용하여 양의 정수를 입력받는다
System.out.print("첫 번째 숫자를 입력하세요: ");
num1 = sc.nextInt();
// 양의 정수가 입력이 안 되었을 경우
if (num1 < 0) {
System.out.println("0 이상의 정수를 입력하세요.");
continue;
}
break;
} catch (Exception e) {
// 숫자가 입력되지 않아 프로그램이 오류나는 것을 예외 처리
System.out.println("숫자를 입력해 주세요. ㅜㅜ");
// 잘못 입력된 것을 버린다
sc.next();
}
}
while(true){
try {
System.out.print("두 번째 숫자를 입력하세요: ");
num2 = sc.nextInt();
if (num2 < 0) {
System.out.println("0 이상의 정수를 입력하세요.");
continue;
}
break;
} catch (Exception e) {
System.out.println("숫자를 입력해 주세요. ㅜㅜ");
sc.next();
}
}
// 사칙연산 기호를 입력받는다
System.out.print("사칙연산 기호를 입력하세요: ");
char oper = sc.next().charAt(0);
int result = 0;
switch (oper){
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
if(num2 == 0){
System.out.println("나눗셈 연산에서 분모(두 번째 정수)에 0이 입력될 수 없습니다.");
continue;
} else {
result = num1 / num2;
}
break;
default:
System.out.println("올바른 연산 기호를 입력하세요 (+, -, *, /)");
continue;
}
System.out.println("결과: " + result);
System.out.println("더 계산하시겠습니까? exit 입력 시 종료");
String exit = sc.next();
if (exit.equals("exit")){
System.out.println("계산기를 종료합니다");
break;
}
}
sc.close();
}
}
바꿨다 try catch를 넣어서......

이제 프로그램이 종료되지 않고 다시 돌아간다
🚩STEP 2. 클래스를 적용해 기본적인 연산을 수행할 수 있는 계산기 만들기
- 사칙연산을 수행 후, 결과값 반환 메서드 구현 & 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Caculator 클래스를 생성
package com.calculator.step2;
import java.util.ArrayList;
import java.util.List;
public class Calculator {
// 연산 결과를 저장하는 컬렉션 타입 필드 선언 및 생성
public List<Integer> results = new ArrayList<>();
public int calculate(int num1, int num2, char oper) {
// 연산 결과를 담을 변수
int result = 0;
// 연산
switch (oper) {
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
if (num2 == 0) {
throw new IllegalArgumentException("나눗셈 연산에서 분모(두 번째 정수)에 0이 입력될 수 없습니다");
}
result = num1 / num2;
break;
default:
// 연산 기호
throw new IllegalArgumentException("올바른 연산 기호를 입력하세요 (+, -, *, /");
}
// 계산 결과 저장
results.add(result);
// 계산 결과 반환
return result;
}
}
- STEP 1에서 구현한 App 클래스의 main 메서드에 Calculator 클래스가 활용될 수 있도록 수정
package com.calculator.step2;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Calculator calculator = new Calculator();
Scanner sc = new Scanner(System.in);
while(true){
int num1 = 0;
int num2 = 0;
while(true){
try {
// Scanner를 사용하여 양의 정수를 입력받는다
System.out.print("첫 번째 숫자를 입력하세요: ");
num1 = sc.nextInt();
// 양의 정수가 입력이 안 되었을 경우
if (num1 < 0) {
System.out.println("0 이상의 정수를 입력하세요.");
continue;
}
break;
} catch (Exception e) {
// 숫자가 입력되지 않아 프로그램이 오류나는 것을 예외 처리
System.out.println("숫자를 입력해 주세요. ㅜㅜ");
// 잘못 입력된 것을 버린다
sc.next();
}
}
while(true){
try {
System.out.print("두 번째 숫자를 입력하세요: ");
num2 = sc.nextInt();
if (num2 < 0) {
System.out.println("0 이상의 정수를 입력하세요.");
continue;
}
break;
} catch (Exception e) {
System.out.println("숫자를 입력해 주세요. ㅜㅜ");
sc.next();
}
}
// 사칙연산 기호를 입력받는다
System.out.print("사칙연산 기호를 입력하세요: ");
char oper = sc.next().charAt(0);
// switch문을 호출로 Calculator 호출로 바꿈
try {
int result = calculator.calculate(num1, num2, oper);
System.out.println("결과: " + result);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
continue;
}
System.out.println("더 계산하시겠습니까? exit 입력 시 종료");
String exit = sc.next();
if (exit.equals("exit")){
System.out.println("계산기를 종료합니다");
break;
}
}
sc.close();
}
}
- App 클래스의 main 메서드에서 Calculator 클래스의 연산 결과를 저장하고 있는 컬렉션 필드에 직접 접근하지 못하도록 수정 (캡슐화)


- 가장 먼저 저장된 데이터 삭제


- 조회와 삭제
❗set get을 전혀 안 써서 비활성화가 되어 있다. get set을 요구사항에 구현한 메서드를 활용. get set을 어떻게 써야 되나 고민을 하다 마지막에 계산기 종료하는 exit로 변수를 정해 놓은 곳을 cmd로 바꾸고 조회와 전체 삭제 기능을 만들었다.


🚩트러블 슈팅
트러블 1️⃣ - 과제를 시작할 때 무엇부터 해야 할지 몰랐다
과제 요구사항을 읽었지만, 어떤 클래스부터 만들고 어떤 코드를 먼저 작성해야 할지 감이 잡히지 않았다. 인텔리제이를 켜고도 main 메서드에 무엇을 적어야 할지 막막했다
문법 문제보다는 프로그램을 어떤 흐름과 구조로 설계해야 되는지 몰랐다.
flowchart를 복습하고 나니까 동작 흐름이 어느 정도 이해가 갔고 입력 -> 계산 -> 출력을 기준으로 작은 단위로 나누어 생각했다 STEP2에서는 계산 역할만 분리해서 Calculator 클래스로 옮기는 것부터 시작했다
트러블 2️⃣ - setter를 어떻게 사용해야 할지 몰랐다
STEP2에서 계산 결과를 저장하는 List를 캡슐화하기 위해서 setter를 구현했다. 결과 초기화를 위해서 외부에서 새로운 List를 생성해 setResults(List)로 교체하는 방식으로 사용했다
코드가 동작하는 데에는 문제가 없었지만, Calculator 내부 상태를 외부에서 통째로 교체하는 방식이 맞나? 의문이 들었다. 이후 학습 과제로 남았다.
이번 과제는 뭔가 남들이 빨리 하니까 나도 급해져서 오류가 나면 그거 고치기에만 급급했다. 문제가 완전히 해결된 뒤에만 정리하려고 생각했는데 막히는 지점과 의문이 생긴 순간을 그때그때 기록하는 것을 못했다. 이후에는 setter 사용과 같은 이런 선택에 대해 왜 그렇게 했는지, 다른 방법은 없는지에 대해서 생각을 해 보고, 기록하는 것도 그때그때 해야겠다고 생각했다.
'IL > TIL' 카테고리의 다른 글
| 20260126 [TIL] - 자료구조 및 알고리즘 INTRO (0) | 2026.01.26 |
|---|---|
| 20260113 [TIL] 10 - Flowchart (0) | 2026.01.13 |
| 20260108 [TIL] 8 - Java 객체지향 이해하기 (클래스와 객체, JVM 메모리 영역, 레퍼클래스, static, final, 인터페이스, 캡슐화, 상속, 추상화, 다형성) (0) | 2026.01.08 |
| 20260107 [TIL] - 협업을 위한 git 활용 팀 과제 (0) | 2026.01.06 |
| 20260105 [TIL] 5 - Java 기초 문법(변수, 입출력, 연산자, 조건문, 반복문, 배열, 메서드) (0) | 2026.01.05 |