#18 oop : grade calculator

This commit is contained in:
haerong22
2022-08-30 02:31:07 +09:00
parent 57eb21d6a9
commit f0570d855a
5 changed files with 137 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
package org.example.grade;
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 double multiplyCreditAndCourseGrade() {
return credit * getGradeToNumber();
}
public int getCredit() {
return credit;
}
public double getGradeToNumber() {
double grade = 0;
switch (this.grade) {
case "A+":
grade = 4.5;
break;
case "A":
grade = 4.0;
break;
case "B+":
grade = 3.5;
break;
case "B":
grade = 3.0;
break;
case "C+":
grade = 2.5;
break;
case "C":
grade = 2.0;
break;
}
return grade;
}
}

View File

@@ -0,0 +1,24 @@
package org.example.grade;
import java.util.List;
public class Courses {
private final List<Course> courses;
public Courses(List<Course> courses) {
this.courses = courses;
}
public double multiplyCreditAndCourseGrade() {
return courses.stream()
.mapToDouble(Course::multiplyCreditAndCourseGrade)
.sum();
}
public int calculateTotalCompletedCredit() {
return courses.stream()
.mapToInt(Course::getCredit)
.sum();
}
}

View File

@@ -0,0 +1,18 @@
package org.example.grade;
import java.util.List;
public class GradeCalculator {
private final Courses courses;
public GradeCalculator(List<Course> courses) {
this.courses = new Courses(courses);
}
public double calculateGrade() {
double multiplyCreditAndCourseGrade = courses.multiplyCreditAndCourseGrade();
int totalCompletedCredit = courses.calculateTotalCompletedCredit();
return multiplyCreditAndCourseGrade / totalCompletedCredit;
}
}

View File

@@ -0,0 +1,16 @@
package org.example.grade;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThatCode;
public class CourseTest {
@DisplayName("과목(코스)를 생성한다.")
@Test
void createTest() {
assertThatCode(() -> new Course("OOP", 3, "A+"))
.doesNotThrowAnyException();
}
}

View File

@@ -0,0 +1,30 @@
package org.example.grade;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.List;
import static org.assertj.core.api.Assertions.*;
/**
* 평균학점 계산 방법 = (학점 * 성적)의 합계 / 수강신청 총학점 수
* 일급 컬렉션 사용
*/
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);
}
}