6.
연산 결과가 10개를 초과하는 경우 가장 먼저 저장된 결과를 삭제하고 새로운 연산 결과가
저장될 수 있도록 소스 코드를 수정합니다.
현재 저장된 index가 마지막(9)라면 가장 먼저 저장된 결과 값이 삭제 되고 새로운 결과 값이
마지막 index에 저장될 수 있도록 구현합니다.
Hint : 결과 값들이 한칸씩 앞으로 이동되면 되지 않을까?
public class App {
public static void main(String[] args) {
...
System.out.println("결과: " + result);
...
/* 위 요구사항에 맞게 구현 */
...
System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
}
}
이것은
// 연산 결과를 배열에 저장.
if (index < intArray.length) {//이걸로 인트어레이가 인덱스보다 많은지 검사
intArray[index] = result;//이 문장은 연산의 결과를 intArray의 index 위치에 저장 예를 들어, index가 0이면, result는 배열의 첫 번째 위치에 저장
index++;//저장하면 1증가
System.out.println("현재 저장된 결과의 수: " + index);//얼마나 저장했는지 보여줌
} else {
System.out.println("저장 공간이 차서 첫번째 결과값을 지우고 이번 결과 값을 넣었습니다.");//그냥 안내용
for (int i = 0; i < intArray.length - 1; i++) {
intArray[i] = intArray[i + 1];//10개다 차면 -1하고 뒤에게 앞으로 한칸씩 이동
}
intArray[intArray.length - 1] = result;//마지막 배열에 현재 결과값 입력
}
이렇게 10개 이상부턴 하나씩지워지고 최신걸로 하나씩 밀어내는걸 만들수 있었다.
7.
결과가 10개로 고정되지 않고 무한이 저장될 수 있도록 소스 코드를 수정합니다.
JCF(Java Collection Framework)를 사용합니다. (e.g. List, Set …)
“remove”라는 문자열을 입력받으면 가장 먼저 저장된 결과가 삭제될 수 있도록 구현합니다.
public class App {
public static void main(String[] args) {
/* 적합한 컬렉션 타입의 변수 선언 */
...
System.out.println("결과: " + result);
/* 배열에서 컬렉션으로 변경됨으로써 변경해야하는 부분 구현 */
System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
/* 위 요구사항에 맞게 구현 */
System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
}
}
이건 이렇게
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Objects;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//jcf는 list, set, map이 있는데 list 사용
ArrayList<Integer> resultList = new ArrayList<>();//이건 크기가 정해지지 않아서 맘대로 추가, 삭제 가능
// int[] intArray = new int[10];
// 배열의 마지막 인덱스를 저장하는 변수를 선언합니다.
int index = 0;
while (true) {//반복을 시작하기위해 추가
System.out.print("첫 번째 숫자를 입력하세요: ");
int num1;
try {
num1 = sc.nextInt();
} catch (InputMismatchException e) {
System.out.println("잘못된 입력입니다. 숫자를 입력해주세요.");
return;
}
System.out.print("사칙연산 기호를 입력하세요: ");
char operator = sc.next().charAt(0);// 사칙연산은 한글자니 char, 연산자는 operator를 써야한다.
//charAt(0) 메서드는 문자열에서 첫 번째 문자를 추출하는 역할을 한다.사용자가 "+" 문자열을 입력하면 sc.next()는 "+" 문자열을 반환하고, charAt(0)은 이 문자열의 첫 번째 문자인 '+'를 추출하고 이렇게 추출된 문자는 char 타입으로 처리된다.
System.out.print("두 번째 숫자를 입력하세요: ");
int num2;
try {
num2 = sc.nextInt();
} catch (InputMismatchException e) {
System.out.println("잘못된 입력입니다. 숫자를 입력해주세요.");
return;
}//InputMismatchException으로 한 이유는 숫자를 안넣었을때 뜨는에러가 InputMismatch였기 때문이다.
int result = 0;//==인 이유는 char을 쓰면 이퀄이 작동하지 않아 바꿀수밖에 없었다.
if (operator == '+') {
result = num1 + num2;
} else if (operator == '-') {
result = num1 - num2;
} else if (operator == '*') {
result = num1 * num2;
} else if (operator == '/') {
if (num2 == 0) {
System.out.println("0으로 나눌 수 없습니다.");//이걸로 두번째 숫자가 0이면 나누기가 안되게 설정
return;
}
result = num1 / num2;
} else {
System.out.println("잘못된 연산자입니다.");
return;
}
System.out.println("결과: " + result);
// if (index < intArray.length) {//이걸로 인트어레이가 인덱스보다 많은지 검사
// intArray[index] = result;//이 문장은 연산의 결과를 intArray의 index 위치에 저장 예를 들어, index가 0이면, result는 배열의 첫 번째 위치에 저장
// index++;//저장하면 1증가
// System.out.println("현재 저장된 결과의 수: " + index);//얼마나 저장했는지 보여줌
// } else {
// System.out.println("저장 공간이 차서 첫번째 결과값을 지우고 이번 결과 값을 넣었습니다.");//그냥 안내용
//
// for (int i = 0; i < intArray.length - 1; i++) {
// intArray[i] = intArray[i + 1];//10개다 차면 -1하고 뒤에게 앞으로 한칸씩 이동
// }
// intArray[intArray.length - 1] = result;//마지막 배열에 현재 결과값 입력
// }
System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
String text = sc.next();//밑에 있던걸 옮긴거뿐
if (Objects.equals(text, "remove")) {
if (!resultList.isEmpty()) {//결과가 비었는지 확인
resultList.remove(0);//차있으면 첫번째(0)를 삭제
System.out.println("첫번째 결과가 삭제되었습니다.");
} else {
System.out.println("저장된 결과가 없습니다.");
}
} else {
resultList.add(result);
System.out.println("현재 저장된 결과의 수: " + resultList.size());
}
//반복의 끝의 시작
System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
/* exit을 입력 받으면 반복 종료 */
if (Objects.equals(text, "exit")) {
break;// 반복의 끝
}
}
}
}
JCF로 list인 ArrayList<Integer> resultList = new ArrayList<>();를 사용해 문한히 배열이 이어지도록 하고
remove 입력하면 맨 처음걸 삭제하도록 변경
8.
“inquiry”라는 문자열이 입력되면 저장된 연산 결과 전부를 출력합니다.
foreach(향상된 for문)을 활용하여 구현 해봅니다.
public class App {
public static void main(String[] args) {
...
System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
...
System.out.println("저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)");
/* 위 요구사항에 맞게 구현 */
System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
}
}
이것을 구현하기 위해
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.Objects;
import java.util.Scanner;
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//jcf는 list, set, map이 있는데 list 사용
ArrayList<Integer> resultList = new ArrayList<>();
int index = 0;
while (true) {//반복을 시작하기위해 추가
try {// 틀려도 종료되지 않기 위해 이거 전체를 try catch로 감싸기 그래서 하나씩 감싼것도 없앴다.
System.out.print("첫 번째 숫자를 입력하세요: ");
int num1 = sc.nextInt();
System.out.print("사칙연산 기호를 입력하세요: ");
char operator = sc.next().charAt(0);// 사칙연산은 한글자니 char, 연산자는 operator를 써야한다.
//charAt(0) 메서드는 문자열에서 첫 번째 문자를 추출하는 역할을 한다.사용자가 "+" 문자열을 입력하면
// sc.next()는 "+" 문자열을 반환하고, charAt(0)은 이 문자열의 첫 번째 문자인 '+'를 추출하고 이렇게 추출된
// 문자는 char 타입으로 처리된다.
System.out.print("두 번째 숫자를 입력하세요: ");
int num2 = sc.nextInt();
int result = 0;
if (operator == '+') {//==인 이유는 char을 쓰면 이퀄이 작동하지 않아 바꿀수밖에 없었다.
result = num1 + num2;
} else if (operator == '-') {
result = num1 - num2;
} else if (operator == '*') {
result = num1 * num2;
} else if (operator == '/') {
if (num2 == 0) {
System.out.println("0으로 나눌 수 없습니다.");
continue;
}
result = num1 / num2;
} else {
System.out.println("잘못된 연산자입니다.");
continue;
}
// 결과를 위로 옮긴 이유는, 밑으로 하니까 inquiry 입력시 최근걸 저장하기전에 출력을 해서 바로 전 결과물은 출력을 못해서 먼저 자장하도록 옮김
System.out.println("결과: " + result);
resultList.add(result);
System.out.println("현재 저장된 결과의 수: " + resultList.size());
System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? 아니면 결과들을 보시겠습니까? (remove 입력 시 삭제, inquiry 입력시 결과 출력)");
String text = sc.next();
if (Objects.equals(text, "remove")) {
if (!resultList.isEmpty()) {//결과가 비었는지 확인
resultList.remove(0);//차있으면 첫번째(0)를 삭제
System.out.println("첫번째 결과가 삭제되었습니다.");
} else {
System.out.println("저장된 결과가 없습니다.");
}
} else if (Objects.equals(text, "inquiry")) {//remove처럼 똑같이 입력 가능 비어있지 않으면 결과출력
if (!resultList.isEmpty()) {
System.out.println("저장된 연산 결과:");
resultList.forEach(System.out::println);//향상된 for인 foreach 사용
} else {
System.out.println("저장된 결과가 없습니다.");
}
}
System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
text = sc.next();
if (Objects.equals(text, "exit")) {
break;
}
} catch (InputMismatchException e) {
System.out.println("잘못된 입력입니다. 숫자를 입력하거나 올바른 명령어를 입력해주세요.");
sc.next();// 이걸로 틀린거 입력시에도 다시 입력가능
}
}
}
}
}
}
}
먼저 실수로 입력할때마다 재실행 되는게 버거워서 try catch로 전체를 감싼뒤 catch (InputMismatchException e) {
System.out.println("잘못된 입력입니다. 숫자를 입력하거나 올바른 명령어를 입력해주세요.");
sc.next();// 이걸로 틀리면 재실행이 아니라 다시 입력하도록 했고
else if (Objects.equals(text, "inquiry")) {//remove처럼 똑같이 입력 가능 비어있지 않으면 결과출력
if (!resultList.isEmpty()) {
System.out.println("저장된 연산 결과:");
resultList.forEach(System.out::println);//향상된 for인 foreach 사용
} else {
System.out.println("저장된 결과가 없습니다.");
}
이걸로 inquiry 입력시 저장한 결과들이 출력되게 했다.
과제대로 foreach를 썻으며 원래 remove같은 문자 입력 밑에 저장을 놓으니 문자 입력시엔 최근게 저장되지않아서
inquiry 쓰면 최근것을 출력하지 않아서
System.out.println("결과: " + result);
resultList.add(result);
System.out.println("현재 저장된 결과의 수: " + resultList.size());
System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? 아니면 결과들을 보시겠습니까? (remove 입력 시 삭제, inquiry 입력시 결과 출력)");
String text = sc.next();
if (Objects.equals(text, "remove")) {
if (!resultList.isEmpty()) {//결과가 비었는지 확인
resultList.remove(0);//차있으면 첫번째(0)를 삭제
System.out.println("첫번째 결과가 삭제되었습니다.");
} else {
System.out.println("저장된 결과가 없습니다.");
}
이렇게 결과를 먼저 저장하게 했다.
그리고 따로 나뉘어진 try catch를 전체를 감싸게 바꾸고
catch (InputMismatchException e) {
System.out.println("잘못된 입력입니다. 숫자를 입력하거나 올바른 명령어를 입력해주세요.");
sc.next();// 이걸로 틀린거 입력시에도 다시 입력가능
이걸로 틀렸을때 칼터럼 종료되 다시실행을 안해도 되게 고쳤다.
양의 정수 2개(0 포함)와 연산 기호를 매개변수로 받아 사칙연산(+,-,*,/) 기능을 수행한 후 결과 값을 반환하는 메서드와 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성합니다.
나눗셈에서 분모에 0이 들어오거나 연산자 기호가 잘 못 들어온 경우 적합한 Exception 클래스를 생성하여 throw 합니다. (매개변수로 해당 오류 내용을 전달합니다.)
public class Calculator {
/* 연산 결과를 저장하는 컬렉션 타입 필드 선언 및 생성 */
public 반환타입 calculate(...매개변수) {
/* 위 요구사항에 맞게 구현 */
/* return 연산 결과 */
}
import java.util.ArrayList;
public class Calculator {
private ArrayList<Integer> resultList = new ArrayList<>();
public int calculate(int num1, int num2, char operator) throws IllegalArgumentException {
int result;
if (operator == '+') {
result = num1 + num2;
} else if (operator == '-') {
result = num1 - num2;
} else if (operator == '*') {
result = num1 * num2;
} else if (operator == '/') {
if (num2 == 0) {
throw new IllegalArgumentException("0으로 나눌 수 없습니다.");
}
result = num1 / num2;
} else {
throw new IllegalArgumentException("잘못된 연산자입니다.");
}
resultList.add(result);
return result;
}
}
import java.util.ArrayList;
import java.util.List;
public class Calculator {
private List<Double> results = new ArrayList<>();
public double calculate(double num1, double num2, String operator) throws IllegalArgumentException, ArithmeticException {
double result;
switch (operator) {
case "+":
result = num1 + num2;
break;
case "-":
result = num1 - num2;
break;
case "*":
result = num1 * num2;
break;
case "/":
if (num2 == 0) {
throw new ArithmeticException("Division by zero");
}
result = num1 / num2;
break;
default:
throw new IllegalArgumentException("Invalid operator: " + operator);
}
results.add(result);
return result;
}
public List<Double> getResults() {
return results;
}
}
우선은 이렇게 해봤다.
2.
2. Level 1에서 구현한 App 클래스의 main 메서드에 Calculator 클래스가 활용될 수 있도록 수정합니다.
- 연산 수행 역할은 Calculator 클래스가 담당합니다.
- 연산 결과는 Calculator 클래스의 연산 결과를 저장하는 필드에 저장됩니다.
- 소스 코드 수정 후에도 수정 전의 기능들이 반드시 똑같이 동작해야합니다.
```java
public class App {
public static void main(String[] args) {
/* Calculator 인스턴스 생성 */
Scanner sc = new Scanner(System.in);
/* 반복문 시작 */
System.out.print("첫 번째 숫자를 입력하세요:");
int num1 = sc.nextInt();
System.out.print("두 번째 숫자를 입력하세요:");
int num2 = sc.nextInt();
System.out.print("사칙연산 기호를 입력하세요: ");
char operator = sc.next().charAt(0);
/* 위 요구사항에 맞게 소스 코드 수정 */
System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
...
/* 반복문 종료 */
}
}
이걸하려면, 아까만든 계산기 클래스에 게산을 넘기고 app클래스는 결과 출력만 하면 된다.
public ArrayList<Integer> getResultList() {
return resultList;// 이게있어야 계산기가 결과를 저장할수있다.
}
이걸 계산기에 추가해서 계산 결과가 Calculator 클래스의 연산 결과를 저장하는 필드에 저장되도록 한다.
// int result = 0;
// if (operator == '+') {//==인 이유는 char을 쓰면 이퀄이 작동하지 않아 바꿀수밖에 없었다.
// result = num1 + num2;
// } else if (operator == '-') {
// result = num1 - num2;
// } else if (operator == '*') {
// result = num1 * num2;
// } else if (operator == '/') {
// if (num2 == 0) {
// System.out.println("0으로 나눌 수 없습니다.");
// continue;
// }
// result = num1 / num2;
// } else {
// System.out.println("잘못된 연산자입니다.");
// continue;
// }
int result = calculator.calculate(num1, num2, operator);// 계산기에 접속해 계산
이렇게 앱 클래스가 하고있던 계산기능을 없애고 int result = calculator.calculate(num1, num2, operator); 이걸로 계산을 떠넘긴다.