컬렉션
사칙연산을 수행한 후, 결과값을 반환하는 메서드 구현
연산 결과를 저장하는 컬렉션 타입 필드를 가진 Calculator 클래스를 생성
중복 저장 필요. 순서는 굳이? ⇒ List
ArrayList: 단방향 포인터 구조 → 각 데이터에 대한 인덱스를 가지고 있어 조회 성능이 뛰어남.LinkedList: 양방향 포인터 구조 → 데이터의 삽입과 삭제가 빈번할 경우 데이터의 위치정보만 수정하면 됨.삽입은 빈번하지만, 삭제가 필요한가? → 일단 ArrayList로 진행
ArrayList<Integer> results = new ArrayList<Integer>();
① 양의 정수 2개(0 포함)와 연산 기호를 매개변수로 받아 사칙연산(➕,➖,✖️,➗) 기능을 수행 → ② 결과 값을 반환하는 메서드
연산 수행 역할 : Calculator 클래스가 담당
연산 결과 : Calculator 클래스의 연산 결과를 저장하는 필드에 저장
<aside>
결과값만 저장되는 것이 아니라 수식도 같이 저장되게 하고 싶은데 어떻게 하지?
→ 컬렉션의 자료형을 String으로 지정하면 수식을 저장할 수 있음.
프린트한 문장을 변수에 담을 수 있나?
→ 애초에 String 변수에 프린트할 내용을 담고, 그 변수를 출력하면 됨.
</aside>
컬렉션 필드 캡슐화 시키기
public class Calculator {
private ArrayList<String> results = new ArrayList<String>();
...
간접 접근을 통해 필드에 접근하여 가져올 수 있도록 구현(Getter 메서드)
ArrayList<String> getResult() {
return results;
}
<aside> ❗
getter의 반환자료형을 컬렉션으로 지정해줘야 results 컬렉션을 그대로 받아올 수 있음
</aside>
간접 접근을 통해 필드에 접근하여 수정할 수 있도록 구현합니다. (Setter 메서드)
void setResult(String result) {
results.add(result);
}
위 요구사항을 모두 구현 했다면 App 클래스의 main 메서드에서 위에서 구현한 메서드를 활용 해봅니다.
String printing_result = num1 + " " + mark + " " + num2 + " = " + result;
calculator.setResult(printing_result);
System.out.println("현재까지 진행된 계산: " + calculator.getResult());
가장 먼저 저장된 데이터를 삭제하는 기능을 가진 메서드 구현
void removeResult() {
results.remove(0);
}
main 메서드에 삭제 메서드 활용하기
→ 컬렉션 안의 내용이 3개가 넘어갈 경우, 첫번째 데이터를 삭제하여 매번 3개의 내용만 출력되도록 진행
스캐너에 잘못된 값 입력 시 예외 처리
나눗셈 분모 0인 경우
나눗셈 결과가 소수인 경우 처리
calculate() 메서드의 반환 자료형을 double로 바꾸기
→ 애초에 num2가 int이기에 결과가 소수로 안나옴