
과제 제출을 했다..
근데 하고 보니 체크 박스를 놓친게 보이는거다..
양수를 왜 보지 못했던거니..
단순히 양수만 놓친 것도 아니라서 정답 코드와 문제를 보고 오답노트를 해보려고 한다.
나의 코드
System.out.println("첫 번째 정수를 입력하세요: "); int number1 = sc.nextInt(); System.out.println("원하는 사칙연산 기호를 입력하세요(+, -, *, /): "); String Operation = sc.next(); System.out.println("두 번째 정수를 입력하세요: "); int number2 = sc.nextInt();(이미 다음 조건도 틀림)
정답 코드
while (true) { System.out.print("첫 번째 숫자를 입력하세요: "); int firstNumber = sc.nextInt(); if (firstNumber < 0) { System.out.println("음수는 입력할 수 없습니다. 프로그램을 재시작합니다."); continue; } System.out.print("두 번째 숫자를 입력하세요: "); int secondNumber = sc.nextInt(); if (secondNumber < 0) { System.out.println("음수는 입력할 수 없습니다. 프로그램을 재시작합니다."); continue; } System.out.print("사칙연산 기호를 입력하세요 (+, -, *, /): "); char operator = sc.next().charAt(0);
if (firstNumber < 0) { System.out.println("음수는 입력할 수 없습니다. 프로그램을 재시작합니다."); continue; }
charAt(0))나의 코드
System.out.println("원하는 사칙연산 기호를 입력하세요(+, -, *, /): "); String Operation = sc.next();굳이 변명?하자면? char타입? 쓸줄 모름~ 하고 String을 썼던 것 같다.
튜터님께서 몰라도 쓰면 인텔리제이가 알려주신다고 했다..
문제를 활용하자
정답코드
System.out.print("사칙연산 기호를 입력하세요 (+, -, *, /): "); char operator = sc.next().charAt(0);
이 경우에 또 바꾸어줘야하는게
switch (Operation) {
case "+":
result = number1 + number2;
break;
case "-":
result = number1 - number2;
break;
case "*":
result = number1 * number2;
break;
case "/":
if (number2 != 0) {
result = number1 / number2;
} else {
System.out.println("나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다.");
break;
각 연산기호에 씌워져 있는 "" 을 ''으로 바꾸어 줘야 오류가 뜨지 않는다.
if switch예시 코드
public class App { public static void main(String[] args) { Scanner sc = new Scanner(System.in); ... int result = 0; /* 제어문을 활용하여 위 요구사항을 만족할 수 있게 구현합니다.*/ System.out.println("결과: " + result); } }
나의 코드
switch (Operation) { case '+': result = number1 + number2; break; case '-': result = number1 - number2; break; case '*': result = number1 * number2; break; case '/': if (number2 != 0) { result = number1 / number2; } else { System.out.println("나눗셈 연산에서 분모(두번째 정수)에 0이 입력될 수 없습니다."); break; } default: System.out.println("유효하지 않은 연산자입니다."); continue; } System.out.println("결과: " + result); System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)");
정답 코드
switch (operator) { case '+': System.out.println("결과: " + (firstNumber + secondNumber)); break; case '-': System.out.println("결과: " + (firstNumber - secondNumber)); break; case '*': System.out.println("결과: " + firstNumber * secondNumber); break; case '/': if (secondNumber == 0) { throw new IllegalArgumentException("나눗셈 연산에서 분모(두 번째 정수)가 0일 수 없습니다."); } System.out.println("결과: " + (double) firstNumber / secondNumber); break; default: throw new IllegalArgumentException("사칙연산 기호는 +, -, *, / 중 하나여야 합니다."); }
case '/':
if (number2 != 0) {
result = (double) number1 / number2;
다만 이 경우 double에 오류가 뜨는데, 원인은 내가 선언해 놓은 result 값이 int 타입이기 때문이다. 선택지는 두 가지 인데, 정답코드처럼 아예 result라는 값을 만들지 않고 그냥 프린트 하는 방법과, 내가 선언해 놓은 result 타입을 int에서 double로 바꾸어주면 된다. 나는 double로 바꾸어 주었다.
double result = 0;
정답 코드
default: throw new IllegalArgumentException("사칙연산 기호는 +, -, *, / 중 하나여야 합니다.");
정답 코드처럼 "throw new 발생시킬예외();"의 형태로 사용할 수 있다.
나의 코드
- 우선 나는 맨 위에 boolean 타입의 변수(keepRunning)를 선언해서 true, false로 계산을 계속 진행할지를 정하도록 만들어놨다.
boolean keepRunning = true;
- 이에 while(keepRunning)안에 연산식을 넣어 무한으로 반복하도록 만들었다.
while(keepRunning) { System.out.println("첫 번째 정수를 입력하세요: "); int number1 = sc.nextInt(); if (number1 < 0) { System.out.println("음수는 입력할 수 없습니다. 프로그램을 재시작합니다."); continue; } System.out.println("원하는 사칙연산 기호를 입력하세요(+, -, *, /): "); char Operation = sc.next().charAt(0); System.out.println("두 번째 정수를 입력하세요: "); int number2 = sc.nextInt(); if (number2 < 0) { System.out.println("음수는 입력할 수 없습니다. 프로그램을 재시작합니다."); continue; } . . . . System.out.println("결과: " + result); System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)"); String reply = sc.next(); if (reply == "exit") { keepRunning = false; } } System.out.println("계산기를 종료합니다."); sc.close();
- if 문으로 exit을 받게 되면 keepRunning이 false가 되면서 계산이 종료된다.
정답 코드
- 해당 문제에서는 굳이 while을 쓰기 위해 변수를 선언하지 않아도 됨을 알 수 있다.
while (true) { System.out.print("첫 번째 숫자를 입력하세요: "); int firstNumber = sc.nextInt(); if (firstNumber < 0) { System.out.println("음수는 입력할 수 없습니다. 프로그램을 재시작합니다."); continue; } System.out.print("두 번째 숫자를 입력하세요: "); int secondNumber = sc.nextInt(); if (secondNumber < 0) { System.out.println("음수는 입력할 수 없습니다. 프로그램을 재시작합니다."); continue; } System.out.print("사칙연산 기호를 입력하세요 (+, -, *, /): "); char operator = sc.next().charAt(0); . . . . System.out.println("더 계산하시겠습니까? (exit 입력 시 종료)"); String answer = sc.next(); if ("exit".equals(answer)) { break;
String answer = sc.next(); String exit = "exit"; //<-이미 글자를 입력했으니 null이 될 수 없음 if ("exit".equals(answer))
앞으로 이렇게(=NullSafe) 작성하는 버릇을 들여야 한다.
String reply = sc.next(); if ("exit".equals(reply)) { keepRunning = false; }
lv2. 도 이걸 기반으로 했기 때문에 다 뜯어 고쳤다..^.^
나의 코드 (필드)
public class Calculator2 { private int number1; private String Operation; private int number2; private boolean keepRunning; private List<Double> records = new ArrayList<>(); . . . .
정답 코드
public class Calculator2 { private final List<Double> resultList = new ArrayList<>(); . . . .
비교하면 진짜 웃기다 왜 이렇게 길게 적었지
private List<Double> records = new ArrayList<>(); 2) final 사용
records.add(result); return result; /// 나의 코드resultList.add(result); return result; /// 강의 정답 코드 --> 강의 중 수정addResult(result); return result; /// 정답 코드(수정 후/아랫쪽에서 설명ㅇ)
사실 더 큰 문제는 따로 있다..
나는 패키지 분리를... 이걸 쓰면서 했다...^.^...

그냥 칼큘레이터.java, 칼큘레이터2.java <- 이게 한 패키지에.. 있었음...;)
나의 코드
public class App { public static void main(String[] args) { Calculator2 calculator = new Calculator2(); Scanner sc = new Scanner(System.in); boolean keepRunning = true; Double result = (double) 0;변치않는 나의 지저분한 코드...^.^
정답 코드
public class App { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Calculator2 calculator = new Calculator2();
나의 코드
result = calculator.calculate(number1, Operation, number2);
정답 코드
double result = calculator.calculate(firstNumber, secondNumber, operator);
나는 윗쪽에 따로 result를 Double로 선언해놨는데, 정답코드처럼 입력하는게 더 깔끔한 것 같다.
나의 코드
public List<Double> getRecords() { return records; } public void setRecords(Double records) { this.records.add(records); System.out.println("기록이 추가되었습니다.");
정답 코드
public List<Double> getResultList() { return resultList; } public void addResult(double result) { resultList.add(result); }
윗쪽 리스트 저장 코드
records.add(result); return result; /// 나의 코드resultList.add(result); // <- 이 부분이 setter 부분과 동일 return result; /// 강의 정답 코드 --> 강의 중 수정addResult(result); // 때문에 아래와 같이 수정됨 return result; /// 정답 코드(수정 후/아랫쪽에서 설명ㅇ)
나의 코드
System.out.println("전체 연산 기록 :" + calculator.getRecords());원하지 않아도 냅다 출력해줘버리기
정답 코드
System.out.println("저장된 연산결과를 조회하시겠습니까? (yes 입력 시 조회)"); if ("yes".equals(sc.next())) { List<Double> resultList = calculator.getResultList(); System.out.println("저장된 연산결과는 : " + resultList.toString());toString은.. 아직 나에게 조금의 더 시간이 필요하다.
컬렉션나의 코드(Calculator class)
public void removeResult(List<Double> records) { records.remove(0); System.out.println("최종 연산 기록 :"); }내가 봐도 뒤죽박죽이다... 내일 알라딘 가서 자바의 정석 사올거다...
정답 코드(Calculator class)
public void removeResult() { resultList.remove(0); }
나의 코드(App class)
System.out.println("첫 번째 연산 기록을 삭제합니다."); calculator.removeResult(calculator.getRecords());시키지도 않았는데 냅다 삭제해버리기..getRecords는 왜 여기있는지.. 눈물만 나온다..
정답 코드(App class)
System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (yes 입력 시 삭제)"); if ("yes".equals(sc.next())) { calculator.removeResult(); }
후기: 다음주 과제가 너무 무섭다..

그러니까 주말에 공부하기...
할게 쌓여만 간다..
3,4,5주차 강의 들어야하고 도서관 과제도 해야하고, 새 과제도 나오면 해야 한다..! ...어떻게든 하겠지...