From ba8ae736c1e913782fdb5857319cde346803b634 Mon Sep 17 00:00:00 2001 From: John Grib Date: Sun, 12 Apr 2020 23:04:45 +0900 Subject: [PATCH 01/10] =?UTF-8?q?Lecture=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=98=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../johngrib/objects/_12_lecture/Lecture.java | 47 +++++++++++++++++++ .../objects/_12_lecture/LectureTest.java | 33 +++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 src/main/java/com/johngrib/objects/_12_lecture/Lecture.java create mode 100644 src/test/java/com/johngrib/objects/_12_lecture/LectureTest.java diff --git a/src/main/java/com/johngrib/objects/_12_lecture/Lecture.java b/src/main/java/com/johngrib/objects/_12_lecture/Lecture.java new file mode 100644 index 0000000..154930f --- /dev/null +++ b/src/main/java/com/johngrib/objects/_12_lecture/Lecture.java @@ -0,0 +1,47 @@ +package com.johngrib.objects._12_lecture; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Lecture { + /** 이수 여부를 판단할 기준 점수. */ + private int pass; + + private String title; + private List scores = new ArrayList<>(); + + public Lecture(String title, int pass, List scores) { + this.title = title; + this.pass = pass; + this.scores = scores; + } + + /** 전체 학생들의 평균 성적을 리턴한다. */ + public double average() { + return scores.stream() + .mapToInt(Integer::intValue) + .average() + .orElse(0); + } + + /** 전체 학생들의 성적을 리턴한다. */ + public List getScores() { + return Collections.unmodifiableList(scores); + } + + /** 강의를 이수한 학생의 수와 낙제한 학생의 수를 형식에 맞게 구성한 문자열을 리턴한다. */ + public String evaluate() { + return String.format("Pass:%d Fail:%d", passCount(), failCount()); + } + + private long passCount() { + return scores.stream() + .filter(score -> score >= pass) + .count(); + } + + private long failCount() { + return scores.size() - passCount(); + } +} diff --git a/src/test/java/com/johngrib/objects/_12_lecture/LectureTest.java b/src/test/java/com/johngrib/objects/_12_lecture/LectureTest.java new file mode 100644 index 0000000..8c46b3c --- /dev/null +++ b/src/test/java/com/johngrib/objects/_12_lecture/LectureTest.java @@ -0,0 +1,33 @@ +package com.johngrib.objects._12_lecture; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("Lecture") +class LectureTest { + Lecture givenLecture() { + return new Lecture( + "객체지향 프로그래밍", + 70, + Arrays.asList(81, 95, 75, 50, 45) + ); + } + + @Nested + @DisplayName("evaluate 메소드") + class Describe_evaluate { + @Test + @DisplayName("이수한 학생의 수와 낙제한 학생의 수를 표현하는 문자열을 리턴한다") + void it_returns_formatted_string() { + final String result = givenLecture().evaluate(); + + Assertions.assertEquals(result, "Pass:3 Fail:2"); + } + } +} \ No newline at end of file From 78328ddef65b311756538afdbec993995e4dbbd9 Mon Sep 17 00:00:00 2001 From: John Grib Date: Mon, 13 Apr 2020 23:10:59 +0900 Subject: [PATCH 02/10] =?UTF-8?q?Grade=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=98=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../johngrib/objects/_12_lecture/Grade.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/johngrib/objects/_12_lecture/Grade.java diff --git a/src/main/java/com/johngrib/objects/_12_lecture/Grade.java b/src/main/java/com/johngrib/objects/_12_lecture/Grade.java new file mode 100644 index 0000000..e9f0623 --- /dev/null +++ b/src/main/java/com/johngrib/objects/_12_lecture/Grade.java @@ -0,0 +1,23 @@ +package com.johngrib.objects._12_lecture; + +import lombok.Getter; + +public class Grade { + @Getter + private String name; + private int upper, lower; + + public Grade(String name, int upper, int lower) { + this.name = name; + this.upper = upper; + this.lower = lower; + } + + public boolean isName(String name) { + return this.name.equals(name); + } + + public boolean include(int score) { + return lower <= score && score <= upper; + } +} From b8ca56de642e73d87b60958aaef9a750d14b735c Mon Sep 17 00:00:00 2001 From: John Grib Date: Mon, 13 Apr 2020 23:11:17 +0900 Subject: [PATCH 03/10] =?UTF-8?q?Lecture=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EB=A5=BC=20=EC=9E=AC=EC=82=AC=EC=9A=A9=ED=95=98=EB=8A=94=20Gra?= =?UTF-8?q?deLecture=20=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=ED=95=98=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../johngrib/objects/_12_lecture/GradeLecture.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java diff --git a/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java b/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java new file mode 100644 index 0000000..eeebc3c --- /dev/null +++ b/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java @@ -0,0 +1,12 @@ +package com.johngrib.objects._12_lecture; + +import java.util.List; + +public class GradeLecture extends Lecture { + private List grades; + + public GradeLecture(String title, int pass, List grades, List scores) { + super(title, pass, scores); + this.grades = grades; + } +} From 4a10e2178e91347a7d3cdf252c42cb4bd43a6166 Mon Sep 17 00:00:00 2001 From: John Grib Date: Mon, 13 Apr 2020 23:16:37 +0900 Subject: [PATCH 04/10] =?UTF-8?q?=ED=95=99=EC=83=9D=EB=93=A4=EC=9D=98=20?= =?UTF-8?q?=EC=9D=B4=EC=88=98=20=EC=97=AC=EB=B6=80=EC=99=80=20=EB=93=B1?= =?UTF-8?q?=EA=B8=89=EB=B3=84=20=ED=86=B5=EA=B3=84=EB=A5=BC=20=ED=95=A8?= =?UTF-8?q?=EA=BB=98=20=EC=B6=9C=EB=A0=A5=ED=95=98=EA=B2=8C=20=ED=95=98?= =?UTF-8?q?=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objects/_12_lecture/GradeLecture.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java b/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java index eeebc3c..6308d08 100644 --- a/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java +++ b/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java @@ -1,6 +1,7 @@ package com.johngrib.objects._12_lecture; import java.util.List; +import java.util.stream.Collectors; public class GradeLecture extends Lecture { private List grades; @@ -9,4 +10,25 @@ public GradeLecture(String title, int pass, List grades, List sc super(title, pass, scores); this.grades = grades; } + + @Override + public String evaluate() { + return super.evaluate() + ", " + gradeStatistics(); + } + + private String gradeStatistics() { + return grades.stream() + .map(grade -> format(grade)) + .collect(Collectors.joining(" ")); + } + + private String format(Grade grade) { + return String.format("%s:%d", grade.getName(), gradeCount(grade)); + } + + private long gradeCount(Grade grade) { + return getScores().stream() + .filter(grade::include) + .count(); + } } From f0025b761134ddda939027bbcd1ba92209a52718 Mon Sep 17 00:00:00 2001 From: John Grib Date: Mon, 13 Apr 2020 23:21:24 +0900 Subject: [PATCH 05/10] =?UTF-8?q?GradeLecture=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=EC=9D=98=20evaluate=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=20=EB=B0=A9=EB=B2=95=EC=9D=84=20=EA=B8=B0?= =?UTF-8?q?=EB=A1=9D=ED=95=98=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objects/_12_lecture/GradeLectureTest.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/test/java/com/johngrib/objects/_12_lecture/GradeLectureTest.java diff --git a/src/test/java/com/johngrib/objects/_12_lecture/GradeLectureTest.java b/src/test/java/com/johngrib/objects/_12_lecture/GradeLectureTest.java new file mode 100644 index 0000000..583f55f --- /dev/null +++ b/src/test/java/com/johngrib/objects/_12_lecture/GradeLectureTest.java @@ -0,0 +1,38 @@ +package com.johngrib.objects._12_lecture; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("GradeLecture") +class GradeLectureTest { + Lecture givenLecture() { + return new GradeLecture( + "객체지향 프로그래밍", + 70, + Arrays.asList( + new Grade("A", 100, 95), + new Grade("B", 94, 80), + new Grade("C", 79, 70), + new Grade("D", 69, 50), + new Grade("F", 49, 0)), + Arrays.asList(81, 95, 75, 50, 45)); + } + + @Nested + @DisplayName("evaluate 메소드") + class Describe_evaluate { + @Test + @DisplayName("이수한 학생의 수와 낙제한 학생의 수를 표현하는 문자열을 리턴한다") + void it_returns_formatted_string() { + final String result = givenLecture().evaluate(); + + Assertions.assertEquals(result, "Pass:3 Fail:2, A:1 B:1 C:1 D:1 F:1"); + } + } +} \ No newline at end of file From ede7302b7a65570044c1a4417f19afdf404e4ffa Mon Sep 17 00:00:00 2001 From: John Grib Date: Tue, 14 Apr 2020 23:47:05 +0900 Subject: [PATCH 06/10] =?UTF-8?q?average=20=EB=A9=94=EC=86=8C=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=98=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objects/_12_lecture/GradeLecture.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java b/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java index 6308d08..7d9770f 100644 --- a/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java +++ b/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java @@ -31,4 +31,20 @@ private long gradeCount(Grade grade) { .filter(grade::include) .count(); } + + public double average(String gradeName) { + return grades.stream() + .filter(each -> each.isName(gradeName)) + .findFirst() + .map(this::gradeAverage) + .orElse(0d); + } + + private double gradeAverage(Grade grade) { + return getScores().stream() + .filter(grade::include) + .mapToInt(Integer::intValue) + .average() + .orElse(0); + } } From 2ac40fd02b57a309a417d31e81677a1766c336d9 Mon Sep 17 00:00:00 2001 From: John Grib Date: Tue, 14 Apr 2020 23:51:38 +0900 Subject: [PATCH 07/10] =?UTF-8?q?=EA=B0=81=20=EA=B5=90=EC=88=98=EB=B3=84?= =?UTF-8?q?=EB=A1=9C=20=EA=B0=95=EC=9D=98=20=EC=84=B1=EC=A0=81=20=ED=86=B5?= =?UTF-8?q?=EA=B3=84=20=EA=B3=84=EC=82=B0=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=ED=95=98=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../johngrib/objects/_12_lecture/Professor.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/test/java/com/johngrib/objects/_12_lecture/Professor.java diff --git a/src/test/java/com/johngrib/objects/_12_lecture/Professor.java b/src/test/java/com/johngrib/objects/_12_lecture/Professor.java new file mode 100644 index 0000000..1fc12f4 --- /dev/null +++ b/src/test/java/com/johngrib/objects/_12_lecture/Professor.java @@ -0,0 +1,16 @@ +package com.johngrib.objects._12_lecture; + +public class Professor { + private String name; + private Lecture lecture; + + public Professor(String name, Lecture lecture) { + this.name = name; + this.lecture = lecture; + } + + public String compileStatistics() { + return String.format("[%s] %s - Avg: %.1f", + name, lecture.evaluate(), lecture.average()); + } +} From 58dad9bb18f25308a5aeb2a2ccf6efdc89108c5d Mon Sep 17 00:00:00 2001 From: John Grib Date: Wed, 15 Apr 2020 16:35:23 +0900 Subject: [PATCH 08/10] =?UTF-8?q?Professor=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EC=9D=98=20=EC=82=AC=EC=9A=A9=20=EB=B0=A9=EB=B2=95=EC=9D=84=20?= =?UTF-8?q?=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=EB=A1=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=A1=9D=ED=95=98=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objects/_12_lecture/ProfessorTest.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/test/java/com/johngrib/objects/_12_lecture/ProfessorTest.java diff --git a/src/test/java/com/johngrib/objects/_12_lecture/ProfessorTest.java b/src/test/java/com/johngrib/objects/_12_lecture/ProfessorTest.java new file mode 100644 index 0000000..7fae285 --- /dev/null +++ b/src/test/java/com/johngrib/objects/_12_lecture/ProfessorTest.java @@ -0,0 +1,59 @@ +package com.johngrib.objects._12_lecture; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.*; + +@DisplayName("Professor") +class ProfessorTest { + + @Nested + @DisplayName("compileStatistics 메소드") + class Describe_compileStatistics { + @Nested + @DisplayName("다익스트라 교수의 알고리즘 Lecture 라면") + class Context_with_dijkstra { + Professor givenProfessor() { + return new Professor("다익스트라", + new Lecture("알고리즘", 70, Arrays.asList(81, 95, 75, 50, 45))); + } + + @Test + @DisplayName("이수한 학생의 수, 낙제한 학생의 수, 평균을 표현하는 문자열을 리턴한다") + void it_returns_statistics() { + final String result = givenProfessor().compileStatistics(); + + assertEquals(result, "[다익스트라] Pass:3 Fail:2 - Avg: 69.2"); + } + } + + @Nested + @DisplayName("다익스트라 교수의 알고리즘 GradeLecture 라면") + class Context_with_dijkstra_grade_lecture { + Professor givenProfessor() { + return new Professor("다익스트라", + new GradeLecture("알고리즘", 70, + Arrays.asList( + new Grade("A", 100, 95), + new Grade("B", 94, 80), + new Grade("C", 79, 70), + new Grade("D", 69, 50), + new Grade("F", 49, 0)), + Arrays.asList(81, 95, 75, 50, 45))); + } + + @Test + @DisplayName("이수한 학생의 수, 낙제한 학생의 수, 각 학점별 수, 평균을 표현하는 문자열을 리턴한다") + void it_returns_statistics() { + final String result = givenProfessor().compileStatistics(); + + assertEquals(result, "[다익스트라] Pass:3 Fail:2, A:1 B:1 C:1 D:1 F:1 - Avg: 69.2"); + } + } + } + +} \ No newline at end of file From f0c8d9a71251fbe00963882bfcaa645e92b1835d Mon Sep 17 00:00:00 2001 From: John Grib Date: Wed, 15 Apr 2020 16:49:01 +0900 Subject: [PATCH 09/10] =?UTF-8?q?=ED=8F=89=EA=B0=80=20=EA=B8=B0=EC=A4=80?= =?UTF-8?q?=EC=97=90=20=EB=8C=80=ED=95=9C=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20?= =?UTF-8?q?=EB=A6=AC=ED=84=B4=ED=95=98=EB=8A=94=20stat=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=98?= =?UTF-8?q?=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/johngrib/objects/_12_lecture/GradeLecture.java | 5 +++++ .../java/com/johngrib/objects/_12_lecture/Lecture.java | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java b/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java index 7d9770f..42792e8 100644 --- a/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java +++ b/src/main/java/com/johngrib/objects/_12_lecture/GradeLecture.java @@ -47,4 +47,9 @@ private double gradeAverage(Grade grade) { .average() .orElse(0); } + + @Override + public String getEvaluationMethod() { + return "Grade"; + } } diff --git a/src/main/java/com/johngrib/objects/_12_lecture/Lecture.java b/src/main/java/com/johngrib/objects/_12_lecture/Lecture.java index 154930f..c55ff81 100644 --- a/src/main/java/com/johngrib/objects/_12_lecture/Lecture.java +++ b/src/main/java/com/johngrib/objects/_12_lecture/Lecture.java @@ -44,4 +44,12 @@ private long passCount() { private long failCount() { return scores.size() - passCount(); } + + public String stats() { + return String.format("Title: %s, Evaluation Method: %s", title, getEvaluationMethod()); + } + + public String getEvaluationMethod() { + return "Pass or Fail"; + } } From 7376262d2cc403e277c8bd0ab97b9e407caa83be Mon Sep 17 00:00:00 2001 From: John Grib Date: Wed, 15 Apr 2020 16:56:33 +0900 Subject: [PATCH 10/10] =?UTF-8?q?FormattedGradeLecture=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EB=A5=BC=20=EC=B6=94=EA=B0=80=ED=95=98?= =?UTF-8?q?=EB=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../objects/_12_lecture/FormattedGradeLecture.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/com/johngrib/objects/_12_lecture/FormattedGradeLecture.java diff --git a/src/main/java/com/johngrib/objects/_12_lecture/FormattedGradeLecture.java b/src/main/java/com/johngrib/objects/_12_lecture/FormattedGradeLecture.java new file mode 100644 index 0000000..9da67e5 --- /dev/null +++ b/src/main/java/com/johngrib/objects/_12_lecture/FormattedGradeLecture.java @@ -0,0 +1,13 @@ +package com.johngrib.objects._12_lecture; + +import java.util.List; + +public class FormattedGradeLecture extends GradeLecture { + public FormattedGradeLecture(String name, int pass, List grades, List scores) { + super(name, pass, grades, scores); + } + + public String formatAverage() { + return String.format("Avg: %1.1f", super.average()); + } +}