배운 내용 🏃
개인과제 계산기 level 2를 진행했다.
요구사항 2-1
양의 정수 2개(0 포함)와 연산 기호를 매개변수로 받아 사칙연산(+,-,*,/) 기능을
수행한 후 결과 값을 반환하는 메서드와 연산 결과를 저장하는
컬렉션 타입 필드를 가진 Calculator 클래스를 생성합니다
• 나눗셈에서 분모에 0이 들어오거나 연산자 기호가 잘 못 들어온 경우
적합한 Exception 클래스를 생성하여 throw 합니다.
(매개변수로 해당 오류 내용을 전달합니다.)
요구사항 참고
public class Calculator {
/* 연산 결과를 저장하는 컬렉션 타입 필드 선언 및 생성 */
public 반환타입 calculate(...매개변수) {
/* 위 요구사항에 맞게 구현 */
/* return 연산 결과 */
}
}
구현 코드
적합한 Exception 클래스를 생성하여 throw 했다
public class InvalidCalculationException extends Exception {
public InvalidCalculationException(String message) {
super(message);
}
}
public class Calculator {
private List<Integer> results; // 연산 결과를 저장하는 리스트
public Calculator() {
results = new ArrayList<>();
}
// 사칙연산 메서드
public int calculate(int firstNumber, int secondNumber, char operator) throws InvalidCalculationException {
int result = 0;
switch (operator) {
case '+':
result = firstNumber + secondNumber;
break;
case '-':
result = firstNumber - secondNumber;
break;
case '*':
result = firstNumber * secondNumber;
break;
case '/':
if (secondNumber == 0) {
throw new InvalidCalculationException("계산불가");
}
result = firstNumber / secondNumber;
break;
default:
throw new InvalidCalculationException("연산기호가 잘못 됐습니다");
}
results.add(result);
return result;
}
public List<Integer> getResults() {
return results;
}
}
요구사항 2-2
Level 1에서 구현한 App 클래스의 main 메서드에
Calculator 클래스가 활용될 수 있도록 수정합니다.
• 연산 수행 역할은 Calculator 클래스가 담당합니다.
• 연산 결과는 Calculator 클래스의 연산 결과를 저장하는 필드에 저장됩니다
• 소스 코드 수정 후에도 수정 전의 기능들이 반드시 똑같이 동작해야합니다
요구사항 참고
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 입력 시 종료)");
...
/* 반복문 종료 */
}
}
구현코드
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Calculator calc = new Calculator(); // Calculator 인스턴스 생성
while (true) {
System.out.print("첫 번째 숫자를 입력하세요: ");
int firstNumber = sc.nextInt();
System.out.print("사칙연산 기호를 입력하세요: ");
char operator = sc.next().charAt(0);
System.out.print("두 번째 숫자를 입력하세요: ");
int secondNumber = sc.nextInt();
try {
int result = calc.calculate(firstNumber, secondNumber, operator);
System.out.println("결과: " + result);
} catch (InvalidCalculationException e) {
System.out.println(e.getMessage());
}
System.out.println("현재 저장된 결과의 수: " + calc.getResults().size() + " " + calc.getResults());
System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
String removeCmd = sc.next();
if (removeCmd.equalsIgnoreCase("remove")) {
if (!calc.getResults().isEmpty()) {
calc.getResults().remove(0);
System.out.println("첫 번째 결과가 삭제되었습니다.");
} else {
System.out.println("삭제할 결과가 없습니다.");
}
}
System.out.println("저장된 연산 결과를 조회하시겠습니까? (inquiry 입력 시 조회)");
String inquiryLook = sc.next();
if (inquiryLook.equalsIgnoreCase("inquiry")) {
if (!calc.getResults().isEmpty()) {
System.out.println("저장된 모든 결과:");
for (int res : calc.getResults()) {
System.out.println(res);
}
} else {
System.out.println("저장된 결과가 없습니다.");
}
}
System.out.println("더 계산하시겠습니까? ('exit'를 입력하면 종료합니다)");
String input = sc.next();
if (input.equalsIgnoreCase("exit")) {
break;
}
}
// 종료 시 최종 저장된 결과 출력
System.out.println("최종 저장된 결과:");
for (int res : calc.getResults()) {
System.out.println(res);
}
sc.close();
}
}
요구사항 2-3
App 클래스의 main 메서드에서 Calculator 클래스의 연산 결과를 저장하고 있는
컬렉션 필드에 직접 접근하지 못하도록 수정합니다. (캡슐화)
• 간접 접근을 통해 필드에 접근하여 가져올 수 있도록 구현합니다. (Getter 메서드)
• 간접 접근을 통해 필드에 접근하여 수정할 수 있도록 구현합니다. (Setter 메서드)
• 위 요구사항을 모두 구현 했다면 App 클래스의 main 메서드에서 위에서 구현한 메서드를 활용 해보자
요구사항 참고
public class Calculator {
/* 연산 결과를 저장하는 컬렉션 타입 필드를 외부에서 직접 접근 하지 못하도록 수정*/
public 반환타입 calculate(...매개변수) {
...
}
/* Getter 메서드 구현 */
/* Setter 메서드 구현 */
}
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 입력 시 종료)");
...
/* 반복문 종료 */
}
}
구현코드
public class Calculator {
private List<Integer> results;
public Calculator() {
results = new ArrayList<>();
}
public int calculate(int firstNumber, int secondNumber, char operator) throws InvalidCalculationException {
int result = 0;
switch (operator) {
case '+':
result = firstNumber + secondNumber;
break;
case '-':
result = firstNumber - secondNumber;
break;
case '*':
result = firstNumber * secondNumber;
break;
case '/':
if (secondNumber == 0) {
throw new InvalidCalculationException("계산불가");
}
result = firstNumber / secondNumber;
break;
default:
throw new InvalidCalculationException("연산기호가 잘못 됐습니다");
}
addResult(result); // 결과 추가
return result;
}
public List<Integer> getResults() {
return new ArrayList<>(results);
}
public void setResults(List<Integer> newResults) {
this.results = new ArrayList<>(newResults);
}
public void addResult(int result) {
results.add(result);
}
public void removeFirstResult() {
if (!results.isEmpty()) {
results.remove(0);
}
}
}
요구사항 2-4&5
Calculator 클래스에 저장된 연산 결과들 중 가장 먼저
저장된 데이터를 삭제하는 기능을 가진 메서드를 구현한 후
App 클래스의 main 메서드에 삭제 메서드가 활용될 수 있도록 수정합니다.
Calculator 클래스에 저장된 연산 결과들을 조회하는 기능을 가진 메서드를 구현한 후
App 클래스의 main 메서드에 조회 메서드가 활용될 수 있도록 수정합니다.
요구사항 참고
public class Calculator {
/* 연산 결과를 저장하는 컬렉션 타입 필드를 외부에서 직접 접근 하지 못하도록 수정*/
public 반환타입 calculate(...매개변수) {
...
}
...
public void removeResult() {
/* 구현 */
}
}
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 입력 시 종료)");
...
/* 반복문 종료 */
}
}
구현코드
public class App {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Calculator calc = new Calculator();
while (true) {
System.out.print("첫 번째 숫자를 입력하세요: ");
int firstNumber = sc.nextInt();
System.out.print("사칙연산 기호를 입력하세요: ");
char operator = sc.next().charAt(0);
System.out.print("두 번째 숫자를 입력하세요: ");
int secondNumber = sc.nextInt();
try {
int result = calc.calculate(firstNumber, secondNumber, operator);
System.out.println("결과: " + result);
} catch (InvalidCalculationException e) {
System.out.println(e.getMessage());
}
System.out.println("현재 저장된 결과의 수: " + calc.getResults().size() + " " + calc.getResults());
System.out.println("가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)");
String removeCmd = sc.next();
if (removeCmd.equalsIgnoreCase("remove")) {
calc.removeFirstResult();
System.out.println("첫 번째 결과가 삭제되었습니다.");
}
System.out.println("저장된 연산 결과를 조회하시겠습니까? (inquiry 입력 시 조회)");
String inquiryLook = sc.next();
if (inquiryLook.equalsIgnoreCase("inquiry")) {
calc.inquiryResults(); // 변경
}
System.out.println("더 계산하시겠습니까? ('exit'를 입력하면 종료합니다)");
String input = sc.next();
if (input.equalsIgnoreCase("exit")) {
break;
}
}
// 종료 시 최종 저장된 결과 출력
System.out.println("최종 저장된 결과:");
for (int res : calc.getResults()) {
System.out.println(res);
}
sc.close();
}
}
public class Calculator {
private List<Integer> results;
public Calculator() {
results = new ArrayList<>();
}
public int calculate(int firstNumber, int secondNumber, char operator) throws InvalidCalculationException {
int result = 0;
switch (operator) {
case '+':
result = firstNumber + secondNumber;
break;
case '-':
result = firstNumber - secondNumber;
break;
case '*':
result = firstNumber * secondNumber;
break;
case '/':
if (secondNumber == 0) {
throw new InvalidCalculationException("계산불가");
}
result = firstNumber / secondNumber;
break;
default:
throw new InvalidCalculationException("연산기호가 잘못 됐습니다");
}
addResult(result); // 결과 추가
return result;
}
public List<Integer> getResults() {
return new ArrayList<>(results);
}
public void setResults(List<Integer> newResults) {
this.results = new ArrayList<>(newResults);
}
public void addResult(int result) {
results.add(result);
}
public void removeFirstResult() {
if (!results.isEmpty()) {
results.remove(0);
}
}
public void inquiryResults() { //추가
if (!results.isEmpty()) {
System.out.println("저장된 모든 결과:");
for (int res : results) {
System.out.println(res);
}
} else {
System.out.println("저장된 결과가 없습니다.");
}
}
}
마무리🔥
개인과제에서 계산기 level 2-10 까지 있다
2-5까지는 쉬웠지만 그 이후부터는 어려울거 같다
어찌저찌 잘 마무리 하고
해설과 튜터님의 피드백을 보며 코드를 바꿔야겠다
5월9일에 블로그를 쓰고 10일에 수정하고 발행일을 잠깐 만졌는데
10일로 쓴걸로 됐다 ㅠㅠ 블로그를 잘 보고 고쳐야겠다..
'TIL' 카테고리의 다른 글
TIL - 2024/05/13 (4) | 2024.05.13 |
---|---|
TIL - 2024/05/10 (0) | 2024.05.10 |
TIL - 2024/05/08 (2) | 2024.05.08 |
TIL - 2024/05/07 (0) | 2024.05.07 |
TIL - 2024/05/03 (0) | 2024.05.03 |