- 평균 학점 계산 방법
= (학점 수 x 교과목 평점)의 합계 / 수강 신청 총 학점 수- 일급 컬렉션 사용
- 이수한 과목( 객체지향프로그래밍, 자료구조, 중국어회화 )
- 학점 계산기
- 이수한 과목을 전달하여 평균학점 계산 요청 ---> 학점 계산기
- 학점 계산기 ---> (학점 수 x 교과목 평점)의 합계 / 수강신청 총 학점 수
- (학점 수 x 교과목 평점)의 합계 & 수강신청 총 학점 수 ---> 과목(코스)
Course.java
public class Course {
private final String subject;
private final int credit;
private final String grade;
public Course(String subject, int credit, String grade) {
this.subject = subject;
this.credit = credit;
this.grade = grade;
}
public int getCredit() {
return credit;
}
public double getGradeToNumber() {
double gradeInt = 0;
switch (this.grade) {
case "A+":
gradeInt = 4.5;
break;
case "A":
gradeInt = 4.0;
break;
case "B+":
gradeInt = 3.5;
break;
case "B":
gradeInt = 3.0;
break;
case "C+":
gradeInt = 2.5;
break;
case "C":
gradeInt = 2.0;
break;
case "D+":
gradeInt = 1.5;
break;
case "D":
gradeInt = 1.0;
break;
case "F":
gradeInt = 0.0;
break;
}
return gradeInt;
}
}
CourseTest.java
public class CourseTest {
@DisplayName("과목(코스)를 생성한다.")
@Test
void createTest() {
assertThatCode(()-> new Course("OOP", 3, "A")).doesNotThrowAnyException();
}
}
GradeCalculator.java
public class GradeCalculator {
private final List<Course> coures;
public GradeCalculator(List<Course> courses) {
this.coures = courses;
}
// 전달 받은 이수 과목들의 학점 구하기
public double calculateGrade() {
// (학점 수 x 교과목 평점)의 합계
double multiplideCreditAndCourseGrade = 0;
for( Course course : coures){
multiplideCreditAndCourseGrade += course.getCredit() * course.getGradeToNumber();
}
// 수강신청 총학점 수
int totalCompletedCredit = coures.stream()
.mapToInt(Course::getCredit)
.sum();
return multiplideCreditAndCourseGrade / totalCompletedCredit;
}
}
GradeCalculatorTest.java
public class GradeCalculatorTest {
@DisplayName("평균 학점을 계산한다.")
@Test
void calculateGradeTest() {
List<Course> courses = List.of(new Course("OOP", 3, "A+"),
new Course("자료구조", 3, "A+"));
GradeCalculator gradeCalculator = new GradeCalculator(courses); // 이수한 과목 전달
double gradeResult = gradeCalculator.calculateGrade(); // 이수한 과목의 성적 계산
assertThat(gradeResult).isEqualTo(4.5);
}
}
Course는 학점과 성적이 변수로 선언
public class Course {
private final String subject;
private final int credit;
private final String grade;
...
}
(학점 수 x 교과목 평점)의 합계를 course가 계산하는 것이 아니라 getter로 가져와서 GradeCalculator에서 수행
public class GradeCalculator {
...
public double calculateGrade() {
// (학점 수 x 교과목 평점)의 합계
double multiplideCreditAndCourseGrade = 0;
for( Course course : coures){
multiplideCreditAndCourseGrade += course.getCredit() * course.getGradeToNumber();
}
// 수강신청 총학점 수
int totalCompletedCredit = coures.stream()
.mapToInt(Course::getCredit)
.sum();
return multiplideCreditAndCourseGrade / totalCompletedCredit;
}
}
// (학점 수 x 교과목 평점)의 합계
double multiplideCreditAndCourseGrade = 0;
for( Course course : coures){
multiplideCreditAndCourseGrade += course.getCredit() * course.getGradeToNumber();
}
public double multiplyCreditAndGrade() {
return credit * getGradeToNumber();
}
public double calculateGrade() {
double multiplideCreditAndCourseGrade = 0;
for( Course course : coures){
multiplideCreditAndCourseGrade += course.multiplyCreditAndGrade();
}
...
}
아직까지도 이 부분이 GradeCalculator에 존재!
public double calculateGrade() {
// (학점 수 x 교과목 평점)의 합계
double multiplideCreditAndCourseGrade = 0;
for( Course course : coures){
multiplideCreditAndCourseGrade += course.multiplyCreditAndGrade();
}
...
}
Courses.java
public class Courses {
private final List<Course> courses;
public Courses(List<Course> courses) {
this.courses = courses;
}
public double multipyCreditAndCourseGrade() {
return courses.stream()
.mapToDouble(Course::multiplyCreditAndGrade)
.sum();
}
public int calculateTotalCompletedCredit() {
return courses.stream()
.mapToInt(Course::getCredit)
.sum();
}
}
GradeCalculator.java
private final List courses; // Courses로 이동
private final Courses courses; // Field에 Courses 객체 선언
public class GradeCalculator {
private final Courses courses;
public GradeCalculator(List<Course> courses) {
this.courses = new Courses(courses);
}
//전달 받은 이수 과목들의 (학점 수 x 교과목 평점)의 합계 구하기
public double calculateGrade() {
// (학점 수 x 교과목 평점)의 합계
double totalMultipliedCreditAndCourseGrade = courses.multipyCreditAndCourseGrade();
// 수강신청 총학점 수
int totalCompletedCredit = courses.calculateTotalCompletedCredit();
return totalMultipliedCreditAndCourseGrade / totalCompletedCredit;
}
}
GradeCalculator에 있던 정보가 multipyCreditAndCourseGrade()이라는 Courses로 이동
이수한 과목을 전달하여 평균학점 계산 요청 ---> 학점 계산기
GradeCalculator gradeCalculator = new GradeCalculator(courses); // 이수한 과목 전달
double gradeResult = gradeCalculator.calculateGrade(); // 이수한 과목의 성적 계산
학점 계산기 ---> (학점 수 x 교과목 평점)의 합계 ---> 과목(코스)
학점 계산기 ---> (학점 수 x 교과목 평점)의 합계 ---> 과목(코스)
public double calculateGrade() {
// (학점 수 x 교과목 평점)의 합계
double totalMultipliedCreditAndCourseGrade = courses.multipyCreditAndCourseGrade();
// 수강신청 총학점 수
int totalCompletedCredit = courses.calculateTotalCompletedCredit();
return totalMultipliedCreditAndCourseGrade / totalCompletedCredit;
}
학점 수 교과목 평균의 합계를 구하기 위해 일급 컬렉션에게 메소드 전달하고 값을 받아온다!
과목 (코스) 일급 컬렉션에게 작업을 위임해서 값을 받아옴