개인과제 6~8까지 풀었다.
- 생성자란?
➡ 객체가 생성할 때 자동으로 호출되는 특정 메소드 public class Car { public Car(String model) {} // 생성자 선언 // 생성자가 한개 이상 선언되었기 때문에 기본 생성자를 추가하지 않음. }
먼저 Calculator.java에서 아래처럼 생성자를 구현했다. Calculator라는 클래스 이름으로 생성자를 만들었는데 지금 보면 매개변수가 없는 생성자 1개만 있었어도 된 것 같다.
public class Calculator {
/* 연산 결과를 저장하는 컬렉션 타입 필드 선언 및 생성 (접근 제어)*/
private static List<Double> results = new ArrayList<>();
private int num1;
private int num2;
private char operator;
/* 연산 결과를 저장하는 컬렉션 타입 필드가 생성자를 통해 초기화 되도록 변경 */
/* 생성자 구현 */
public Calculator(int num1, int num2, char op) throws BadException {
this.num1 = num1;
this.num2 = num2;
this.operator = op;
}
public Calculator() {
results = new ArrayList<>();
}
public class Calculator { /* static, final 활용 */ /* 원의 넓이 결과를 저장하는 컬렉션 타입의 필드 선언 및 생성 */ /* 생성자 수정 */ ... /* 원의 넓이를 구하는 메서드 선언*/ public 반환타입 calculateCircleArea(매배변수) { /* 원의 넓이 계산 구현 */ } /* 원의 넓이 저장 필드 Getter, Setter, 조회 메서드 구현 */ }
먼저 나는 App.java에서 사칙연산, 원의 넓이 둘 중에 하나를 선택해야하므로 if문으로 만들었다.
// 계산 선택(getValidSelection를 메서드를 이용하여 사칙연산할지, 원의넓이를 계산할지 선택)
int selection = getValidSelection(sc, "사칙연산[1], 원의 넓이[2] : ");
일단 statiic, final를 이용하여 필드를 만들고 넓이 구하는 메서드를 구현했다.
public class Calculator {
private static List<Double> circleList = new ArrayList<>(); // 원의 넓이 결과를 저장하는 컬렉션 타입
private static final double PI = 3.14; // 원주율을 고정되어 있으므로 final를 이용하여 상수로 지정
private double radius; // 원의 반지름
// 원의 넓이 Setter 메서드
public void setCircle(double circleRadius) {
this.radius = circleRadius;
}
// 원의 넓이를 구하는 메서드
public double circleCalculate(double radius) {
return PI * radius * radius;
}
나머지 (삭제, 조회, 종료 등)도 그대로 가져왔다.
// 원의 넓이 저장리스트 Getter 메서드
public List<Double> circleGetResult() {
return circleList;
}
// 원의 넓이 결과값을 리스트에 저장하는 Setter 메서드
public void circleAddResult(double result) {
this.circleList.add(result);
}
// 원의 넓이 결과가 저장된 리스트에서 가장 먼저 저장된 데이터를 삭제하는 메서드
public void circleRemoveResult() {
double removeResult = circleList.get(0);
circleList.remove(0);
System.out.println("삭제된 값 : " + removeResult);
}
// 원의 넓이 결과가 저장된 연산결과를 조회하는 메서드
public void circleInquiryResult() {
System.out.print("저장된 연산 결과 : ");
for (double value : circleList) {
System.out.print(value + " ");
}
System.out.println();
}
한 번 실행해보자!
사칙연산[1], 원의 넓이[2] :
1
첫 번째 숫자를 입력하세요: 5
두 번째 숫자를 입력하세요: 3
사칙연산 기호를 입력하세요: +
결과 : 8.0
가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)
no
저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)
no
더 계산하시겠습니까? (exit 입력 시 종료)
no
사칙연산[1], 원의 넓이[2] :
1
첫 번째 숫자를 입력하세요: 3
두 번째 숫자를 입력하세요: 9
사칙연산 기호를 입력하세요: +
결과 : 12.0
가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)
no
저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)
inquiry
저장된 연산 결과 : 8.0 12.0
더 계산하시겠습니까? (exit 입력 시 종료)
no
사칙연산[1], 원의 넓이[2] :
1
첫 번째 숫자를 입력하세요: 2
두 번째 숫자를 입력하세요: 7
사칙연산 기호를 입력하세요: +
결과 : 9.0
가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)
remove
삭제된 값 : 8.0
저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)
inquiry
저장된 연산 결과 : 12.0 9.0
더 계산하시겠습니까? (exit 입력 시 종료)
yes
사칙연산[1], 원의 넓이[2] :
2
반지름을 입력하세요(cm) :
3
결과 : 28.259999999999998
가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)
no
저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)
no
더 계산하시겠습니까? (exit 입력 시 종료)
no
사칙연산[1], 원의 넓이[2] :
2
반지름을 입력하세요(cm) :
5
결과 : 78.5
가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)
no
저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)
inquiry
저장된 연산 결과 : 28.259999999999998 78.5
더 계산하시겠습니까? (exit 입력 시 종료)
no
사칙연산[1], 원의 넓이[2] :
2
반지름을 입력하세요(cm) :
9
결과 : 254.34
가장 먼저 저장된 연산 결과를 삭제하시겠습니까? (remove 입력 시 삭제)
remove
삭제된 값 : 28.259999999999998
저장된 연산결과를 조회하시겠습니까? (inquiry 입력 시 조회)
inquiry
저장된 연산 결과 : 78.5 254.34
더 계산하시겠습니까? (exit 입력 시 종료)
exit
프로그램을 종료하겠습니다.
다행히 잘된다!!!
App.java에서 ArithmeticCalculator 클래스와 CircleCalculator 클래스 객체를 생성
ArithmeticCalculator arithmeticCalculator = new ArithmeticCalculator();
CircleCalculator circleCalculator = new CircleCalculator();
ArithmeticCalculator와 CircleCalculator 클래스는 Calculator 클래스에서 만든 필드와 메서드를 옮긴다.
ArithmeticCalculator
import java.util.*;
public class ArithmeticCalculator extends Calculator {
// 필드
private static ArrayList<Double> arithmeticList;
private int num1; // 첫 번째 정수
private int num2; // 두 번째 정수
private char operator; // 연산자
// 생성자
public ArithmeticCalculator() {
this.arithmeticList = new ArrayList<>();
}
// Setter 메서드
public void setArithmetic(int num1, int num2, char op) {
this.num1 = num1;
this.num2 = num2;
this.operator = op;
}
// 사칙연산 메서드
@Override
public double calculate() throws BadException {
double result = 0;
switch (this.operator) {
case '+':
result = this.num1 + this.num2;
break;
case '-':
result = this.num1 - this.num2;
break;
case '*':
result = this.num1 * this.num2;
break;
case '/':
if (this.num2 == 0) {
throw new BadException("분모가 0이 아닌 양의 정수");
} else {
result = this.num1 / this.num2;
}
break;
default:
throw new BadException("사칙연산자[+, -, *, /]");
}
return result;
}
// Getter 메서드
@Override
public ArrayList<Double> getResult() {
return arithmeticList;
}
// 결과값을 리스트에 저장하는 메서드
@Override
public void addResult(double result) {
this.arithmeticList.add(result);
}
// 저장된 리스트에서 가장 먼저 저장된 데이터를 삭제하는 메서드
@Override
public void removeResult() {
double removeResult = arithmeticList.get(0);
arithmeticList.remove(0);
System.out.println("삭제된 값 : " + removeResult);
}
// 결과가 저장된 연산결과를 조회하는 메서드
@Override
public void inquiryResult() {
System.out.print("저장된 연산 결과 : ");
for (double value : arithmeticList) {
System.out.print(value + " ");
}
System.out.println();
}
}
CircleCalculator
import java.util.*;
public class CircleCalculator extends Calculator {
// 필드
private static ArrayList<Double> circleList;
private static final double PI = 3.14;
private double radius;
// 생성자
public CircleCalculator() {
this.circleList = new ArrayList<>();
}
// Setter 메서드
public void setCircle(double circleRadius) {
this.radius = circleRadius;
}
// 원의 넓이 메서드
@Override
public double calculate() {
return PI * radius * radius;
}
// Getter 메서드
@Override
public ArrayList<Double> getResult() {
return circleList;
}
// 결과값을 리스트에 저장하는 메서드
@Override
public void addResult(double result) {
this.circleList.add(result);
}
// 저장된 리스트에서 가장 먼저 저장된 데이터를 삭제하는 메서드
@Override
public void removeResult() {
double removeResult = circleList.get(0);
circleList.remove(0);
System.out.println("삭제된 값 : " + removeResult);
}
// 결과가 저장된 연산결과를 조회하는 메서드
@Override
public void inquiryResult() {
System.out.print("저장된 연산 결과 : ");
for (double value : circleList) {
System.out.print(value + " ");
}
System.out.println();
}
}
- @Override?
➡ 메서드 오버라이딩을 명시하는 주석 장점 : 컴파일 타임 체크, 코드 가독성 향상, 버그방지
Calculator의 자식 클래스인 CircleCalculator와 ArithmeticCalculator에는 공통된 메서드가 있으므로 Calculator를 추상 클래스 변경
import java.util.*;
public abstract class Calculator {
// 추상 메서드로 정의
public abstract double calculate() throws BadException;
public abstract ArrayList<Double> getResult();
public abstract void addResult(double result);
public abstract void removeResult();
public abstract void inquiryResult();
}
휴~ 다행히 작동이 잘 된다.