24.07.29

윤지현·2024년 7월 29일

TIL

목록 보기
26/75

개인과제 6~8까지 풀었다.

  • 6번 Calculator 인스턴스를 생성(new)할 때 생성자를 통해 연산 결과를 저장하고 있는 컬렉션 필드가 초기화 되도록 수정
    • 생성자란?
      ➡ 객체가 생성할 때 자동으로 호출되는 특정 메소드
      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<>();
    }
  • 7번 Calculator 클래스에 반지름을 매개변수로 전달받아 원의 넓이를 계산하여 반환해주는 메서드를 구현
    public class Calculator {
    		/* static, final 활용 */
    		/* 원의 넓이 결과를 저장하는 컬렉션 타입의 필드 선언 및 생성 */
    		/* 생성자 수정 */
    		...
    		/* 원의 넓이를 구하는 메서드 선언*/
    		public 반환타입 calculateCircleArea(매배변수) {
            /* 원의 넓이 계산 구현 */
        }
    		/* 원의 넓이 저장 필드 Getter, Setter, 조회 메서드 구현 */
    }

먼저 나는 App.java에서 사칙연산, 원의 넓이 둘 중에 하나를 선택해야하므로 if문으로 만들었다.

  • getValidSelection 메서드 : 1 또는 2가 입력될 때까지 반복
// 계산 선택(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
프로그램을 종료하겠습니다.

다행히 잘된다!!!

  • 8번 사칙연산을 수행하는 계산기 ArithmeticCalculator 클래스와 원과 관련된 연산을 수행하는 계산기 CircleCalculator 클래스 2개를 구현

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();
}

휴~ 다행히 작동이 잘 된다.

profile
첫 시작

0개의 댓글