개별 프로젝트로 사칙연산 + $a$ 가 되는 계산기 개발
LV.1
최소 사칙연산이 가능할것
- $+$ , $-$ , $*$ , $/$ + $a$양의 정수(0 포함)을 입력 받기Scanner
활용양의 정수는 각각 하나씩 전달 받을것
연산 기호 입력받기Scanner
활용
입력받은 정수 2개와 연산를 활용해 연산 후 결과값 출력if
orswitch
제어문 사용연산 오류가 발생할 경우 해당 오류에 대해 출력
ex) 나눗셈 연산에서 분모에 0이 입력될 수 없습니다.
반복문을 사용하되, 반복 종료를 알려주는 'exit'문자열을 입력하기 전까지 무한으로 계산 진행for
orwhile
LV.2
연산 수행 후, 결과값 반환 메서드 구현 & 연산 결과를 저장하는 컬렉션 타입 필드를 가진
Calculator
클래스 생성- 사칙연산을 수행한 후. 결과값을 반환하는 메서드 구현
- 연산 결과를 저장하는 컬렉션 타입 필드를 가진
Calculator
클래스 생성 - 양의 정수 2개와 연산 기호를 매개변수로 받아 사칙연산기능을 수행한 후
결과 값을 반환하는 메서드와 연산 결과를 저장하는 컬렉션 타입 필드를 가진Calculator
클래스 생성
LV.1에서 구현한 App 클래스의 main 메서드에
Calculator
클래스가 활용될 수 있도록 수정- 연산 수행 역할은
Calculator
클래스가 담당- 연산 결과는
Calculator
클래스의 연산 결과를 저장하는 필드에 저장
- 연산 결과는
- 소스 코드 수정 후에도 수정 전의 기능들이 반드시 똑같이 동작할것
- 연산 수행 역할은
App클래스의 main메서드에서
Calculator
클래스의 연산 결과를 저아하고 있는 컬렉션 필드에 직접 접근하지 못하도록 수정(캡슐화)- 간접 접근을 통해 필드에 접근하여 가져올 수 있도록 구현(Getter)
- 간접 접근을 통해 필드에 접근하여 수정할 수 있도록 구현(Setter)
- 위 요구사항을 모두 구현 했다면 App클래스의 main메서드에서 위에서 구현한 메서드를 활용
Calculator
클래스에 저장된 연산 결과들 중 가장 먼저 저장된 데이터를 삭제하는 기능을 가진 메서드를 구현한 후 App 클래스의 main메서드에 삭제 메서드가 활용될 수 있도록 수정
- Calculator 클래스에서 연산 수행
import java.util.Objects;
import java.util.Scanner;
class Calculator {
public static int calculate(int a, int b, char c) {
switch (c) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
if (b == 0) {
System.out.println("분모에는 0이 들어갈 수 없습니다." + "\n");
break;
}
return a / b;
}
return 0;
}
}
public class Main {
public static void main(String[] args) {
int a;
int b;
int result;
String input;
char c;
Scanner sc = new Scanner(System.in);
for (int i = 1; ; i++) {
System.out.printf("\n========계산 준비 완료 / 사용량 : %d회==========\n\n", i);
System.out.println("첫번째 숫자를 입력하세요.");
System.out.print(": ");
while (!sc.hasNextInt()){
System.out.println("잘못된 값을 입력하였습니다.");
System.out.print(": ");
sc.next();
}
a = sc.nextInt();
System.out.println("두번째 숫자를 입력하세요.");
System.out.print(": ");
while (!sc.hasNextInt()){
System.out.println("잘못된 값을 입력하였습니다.");
System.out.print(": ");
sc.next();
}
b = sc.nextInt();
System.out.println("사칙연산 기호를 입렵하세요(+, -, *, /)");
System.out.print(": ");
while(true){
input = sc.next();
c = input.charAt(0);
if(c == '+' || c == '-' || c == '*' || c == '/'){
break;
} else{
System.out.println("잘못된 값을 입력하였습니다. 입력값: " + c );
System.out.print(": ");
}
}
result = Calculator.calculate(a, b, c);
System.out.println("\n"+ a + c + b + "=" + result);
System.out.print("종료 하시려면 'exit'를 입력해주세요: ");
String out = sc.next();
if (Objects.equals(out, "exit")){
break;
}
}
}
}
- Calculator 클래스에서 연산 수행 및 연산값 저장
import java.util.ArrayList; import java.util.Objects; import java.util.Scanner; import java.util.List;
class Calculator {
private static List
// 생성자
public Calculator() {
this.history = new ArrayList<>();
}
//
//기능
public static int calculate(int a, int b, char c) {
int result = 0;
String output;
switch (c) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
if (b == 0) {
System.out.println("분모에는 0이 들어갈 수 없습니다." + "\n");
break;
}
result = a / b;
break;
}
output = a + c + b + " = " + result;
history.add(output);
return result;
}
public List<String> getHistory() {
return history;
}
}
public class Main {
public static void main(String[] args) {
int a, b, result;
String input;
char c;
Scanner sc = new Scanner(System.in);
for (int i = 1; ; i++) {
System.out.printf("\n========계산 준비 완료 / 사용량 : %d회==========\n\n", i);
System.out.println("첫번째 숫자를 입력하세요.");
System.out.print(": ");
while (!sc.hasNextInt()){
System.out.println("잘못된 값을 입력하였습니다.");
System.out.print(": ");
sc.next();
}
a = sc.nextInt();
System.out.println("두번째 숫자를 입력하세요.");
System.out.print(": ");
while (!sc.hasNextInt()){
System.out.println("잘못된 값을 입력하였습니다.");
System.out.print(": ");
sc.next();
}
b = sc.nextInt();
System.out.println("사칙연산 기호를 입렵하세요(+, -, *, /)");
System.out.print(": ");
while(true){
input = sc.next();
c = input.charAt(0);
if(c == '+' || c == '-' || c == '*' || c == '/'){
break;
} else{
System.out.println("잘못된 값을 입력하였습니다. 입력값: " + c );
System.out.print(": ");
}
}
result = Calculator.calculate(a, b, c);
System.out.println("\n"+ a + c + b + "=" + result);
System.out.print("최근 계산값: ");
Calculator calculator = new Calculator();
for (String history : calculator.getHistory()) {
System.out.println(history);
}
System.out.print("종료 하시려면 'exit'를 입력해주세요: ");
String out = sc.next();
if (Objects.equals(out, "exit")){
break;
}
}
}
}
* 문제 1 :
오류 발생 : `UnsupportedOperationException`
private static List
변경 불가능한 리스트로 생성
`List.of()`은 불변 리스트를 생성, `add()` 실행 시 예외 발생
this.history = new ArrayList<>();
변경 -> 정보 은닉 추가.
* 문제 2 :
최근 결과값의 출력이 이상

정상 출력 10 * 10 = 100
현재 출력 62 = 100
output = a + c + b + " = " + result;
`a + c + b`를 계산할때 `c`가 문자열이 아닌 연산자로 해석될 가능성
output = a + " " + c + " " + b + " = " + result;
`" "`추가로 숫자와 연산 기호 구분
---------------------
Main.java
import java.util.Objects;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int a, b, result;
String input;
char c;
Calculator calculator = new Calculator();
Scanner sc = new Scanner(System.in);
for (int i = 1; ; i++) {
System.out.printf("\n========계산 준비 완료 / 사용량 : %d회==========\n\n", i);
System.out.println("첫번째 숫자를 입력하세요.");
System.out.print(": ");
while (!sc.hasNextInt()){
System.out.println("잘못된 값을 입력하였습니다.");
System.out.print(": ");
sc.next();
}
a = sc.nextInt();
System.out.println("두번째 숫자를 입력하세요.");
System.out.print(": ");
while (!sc.hasNextInt()){
System.out.println("잘못된 값을 입력하였습니다.");
System.out.print(": ");
sc.next();
}
b = sc.nextInt();
System.out.println("사칙연산 기호를 입렵하세요(+, -, *, /)");
System.out.print(": ");
while(true){
input = sc.next();
c = input.charAt(0);
if(c == '+' || c == '-' || c == '*' || c == '/'){
break;
} else{
System.out.println("잘못된 값을 입력하였습니다. 입력값: " + c );
System.out.print(": ");
}
}
//연산 처리는 Calculator class에서만 진행
result = calculator.calculate(a, b, c);
System.out.println("\n"+ a + c + b + "=" + result);
System.out.println("최근 계산값");
// getter를 사용해 데이터 받기
for (String history : calculator.getHistory()) {
System.out.println(history);
}
System.out.print("종료 하시려면 'exit'를 입력해주세요: ");
String out = sc.next();
if (Objects.equals(out, "exit")){
break;
}
}
}
}
Calculator.java
import java.util.ArrayList;
import java.util.List;
public class Calculator {
private static List
// 생성자
public Calculator() {
this.history = new ArrayList<>();
}
//기능
public int calculate(int a, int b, char c) {
int result = 0;
String output;
switch (c) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
if (b == 0) {
System.out.println("분모에는 0이 들어갈 수 없습니다." + "\n");
break;
}
result = a / b;
break;
}
output = a + " " + c + " " + b + " = " + result;
history.add(output);
return result;
}
// 원본 보호를 위해 복사본 반환
public List<String> getHistory() {
return new ArrayList<>(history);
}
}
Code `main.java` 와 `Calculator.java`로 분리
`Calculator` 클래스에서 `private history` 와 `getHistory()`를 활용하여 데이터 보호
=> 캡슐화 까지 진행완료
'Project' 카테고리의 다른 글
[Project]Calculator_5 (0) | 2025.05.13 |
---|---|
[Project]Calculator_4 (0) | 2025.05.13 |
[Project]Calculator_3 (0) | 2025.05.13 |
[Project]Calculator_1 (0) | 2025.05.13 |
[Mini Team Project] KPT (0) | 2025.05.13 |