Lv 2. 클래스를 적용해 기본적인 연산을 수행할 수 있는 계산기 만들기
- [ ] 사칙연산을 수행 후, 결과값 반환 메서드 구현 & 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성
- [ ] 사칙연산을 수행한 후, 결과값을 반환하는 메서드 구현
- [ ] 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성
- [ ] 1) 양의 정수 2개(0 포함)와 연산 기호를 매개변수로 받아 사칙연산(➕,➖,✖️,➗) 기능을 수행한 후 2) 결과 값을 반환하는 메서드와 연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성합니다.
- [ ] Lv 1에서 구현한 App 클래스의 main 메서드에 Calculator 클래스가 활용될 수 있도록 수정
- [ ] 연산 수행 역할은 Calculator 클래스가 담당
- [ ] 연산 결과는 Calculator 클래스의 연산 결과를 저장하는 필드에 저장
- [ ] 소스 코드 수정 후에도 수정 전의 기능들이 반드시 똑같이 동작해야합니다.
- [ ] 연산 수행 역할은 Calculator 클래스가 담당
-
-
- [ ] 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 입력 시 종료)"); ... /* 반복문 종료 */ } }
- [ ] Calculator 클래스에 저장된 연산 결과들 중 가장 먼저 저장된 데이터를 삭제하는 기능을 가진 메서드를 구현한 후 App 클래스의 main 메서드에 삭제 메서드가 활용될 수 있도록 수정
- [ ] 키워드 : 컬렉션
- [ ] App 클래스의 main 메서드에서 Calculator 클래스의 연산 결과를 저장하고 있는 컬렉션 필드에 직접 접근하지 못하도록 수정 (캡슐화)
-
더보기
더보기
더보기
package caculator;
import java.sql.SQLOutput;
import java.util.Scanner;
import java.util.InputMismatchException;
public class App {
public static void main(String[] args) {
Calculator calculator = new Calculator();
Scanner sc = new Scanner(System.in);
while (true) {
try {
System.out.println("첫 번째 정수를 입력해 주세요");
int num1 = sc.nextInt();
System.out.println("사칙연산 기호를 입력하세요");
char op = sc.next().charAt(0);
System.out.println("두 번째 정수를 입력해 주세요:");
int num2 = sc.nextInt();
if (num2 == 0) {
System.out.println(" 0은 입력할 수 없습니다. 다시 입력해 주세요:");
num2 = sc.nextInt();
}
int result = calculator.calculate(num1, num2, op);
System.out.println("결과 값 :" + result);
sc.nextLine();
}catch(InputMismatchException e){
System.out.println("숫자만 입력해주세요");
sc.nextLine(); // 이거 없으면 무한 바복
}
System.out.println("더 계산하시겠습니까? 아무 글자나 입력해주세요.(exit 입력 시 종료)");
String end = sc.nextLine();
if (end.equals("exit")) {
break;
}
}
System.out.println("값 :" + calculator.getResult());
calculator.removeResult();
System.out.println("현재 값 :" + calculator.getResult());
//calculator.clearResult();
// System.out.println("값 초기화 :" + calculator.getResult());
}
}
package caculator; // 쓰일 멤버변수 // 사칙연산을 수행하는 메서드
import java.util.ArrayList;
import java.util.List;
public class Calculator {
private List<Integer> results = new ArrayList<>();// 연산결과를 저장하는컬렉션 타입 필드 선언 및 생성
public int calculate(int num1, int num2, char op) {
int result;
switch (op) {
case '+':
result = num1 + num2;
results.add(result);//인덱스 넣기
return result ;
case '-':
result = num1 - num2;
results.add(result);
return result;
case '*':
result = num1 * num2;
results.add(result);
return result ;
case '/':
if (num2!= 0) {
result = num1 / num2;
results.add(result);
return result ;
} else {
System.out.println("0은 입력하실 수 없습니다.");
}
default :
throw new IllegalArgumentException("지원하지 않는 연산자입니다.");
}
}
public List<Integer> getResult() {
return results;
}
//public void clearResult(){ 값 초기화 메서드
// results.clear();
// }
public void removeResult() {
// 삭제된 값을 보여주기 위해 변수에 저장.
if (!results.isEmpty()) {
int removedValue = results.remove(0);
System.out.println("삭제된 값 : " + removedValue);
//먼저 입력된 값 삭제 list.remove(인덱스 번호)
}
}
}
트러블 슈팅 : 처음에 연산기호를 입력할 때 System.out.println("사칙연산 기호를 입력하세요");char op = sc.next(); 여기에서 자꾸 오류가 났다. 스캐너에서 사용자에게 입력을 받을때 보통 단어, 문장으로입력을 받지만 글자 하나만입력 받는 경우는 없기 때문에 난 오류라고 한다.
charAt()은 스캐너에서도 char타입의 문자를 받을 수 있도록 해준다. 그래서
char op = sc.next().charAt(0); 사용자에게 입력받은글자중에 첫번째만(0번째 인덱스)에 것을 받아온다는 의미로
charAt()을 사용했더니 문제해결이 되었음. (설명에 charAt())을 사용해 받으라고 했지만 정확하게 왜 안되는지가 궁금했음.
'BACK-END > JAVA' 카테고리의 다른 글
| JAVA | 20251118 연산자 (0) | 2025.11.19 |
|---|---|
| JAVA | 20251117 (0) | 2025.11.17 |
| [자바 프로그래밍 기초] 예외(Exception)와 예외처리 (try- catch) (0) | 2025.04.17 |
| [자바 프로그래밍 기초] scanner 메소드 next(), nextLine() (0) | 2025.04.16 |
| 1. Java란 ? (0) | 2025.03.27 |