ð Chapter 12: ë€íì±
ð ë€íì±â
- ê°ì²Žì§í¥ íë¡ê·žëë°ìì ì¬ì©ëë ë€íì±ì ì ëë²ì ë€íì±ê³Œ ìì(Ad Hoc) ë€íì±ìŒë¡ ë¶ë¥í ì ìë€.
- ì ëë²ì ë€íì±ì ë€ì 맀ê°ë³ì ë€íì±ê³Œ í¬íš ë€íì±ìŒë¡ ë¶ë¥í ì ìë€. ìì ë€íì±ì ì€ë²ë¡ë© ë€íì±ê³Œ ê°ì ë€íì±ìŒë¡ ë¶ë¥í ì ìë€.
- íëì íŽëì€ ìì ëìŒí ë©ìëê° ì¡Žì¬íë ê²œì° ì€ë²ë¡ë© ë€íì±ìŽëŒê³ ë¶ë¥žë€.
public class Money {
public Money plus(Money amount) {...}
public Money plus(BigDecimal amount) {...}
public Money plus(long amount) {...}
}
- ê°ì ë€íì±ì ìžìŽê° ì§ìíë ìëì ìž íì
ë³íìŽë ì¬ì©ìê° ì§ì 구íí íì
ë³íì ìŽì©íŽ ëìŒí ì°ì°ì륌 ë€ìí íì
ì ì¬ì©í ì ìë ë°©ììŽë€. ì륌 ë€ìŽ ìŽí ì°ì°ììž
+
ë íŒì°ì°ìê° ëªšë ì ììŒ ê²œì°ìë ë§ì ì°ì°ìë¡ ëìíì§ë§ íëë ì ìíìŽê³ ë€ë¥ž íëë 묞ììŽìž 겜ì°ìë ì°ê²° ì°ì°ìë¡ ëìíë€. ìŽë ì ìí íŒì°ì°ìë 묞ììŽ íì ìŒë¡ ê°ì íë³íëë€. - 맀ê°ë³ì ë€íì±ì ì ë€ëŠ íë¡ê·žëë°ê³Œ êŽë šìŽ ëìë° íŽëì€ì ìžì€íŽì€ ë³ìë ë©ìëì 맀ê°ë³ì íì
ì ììì íì
ìŒë¡ ì ìží í ì¬ì©íë ìì ì 구첎ì ìž íì
ìŒë¡ ì§ì íë ë°©ìì ê°ëŠ¬íšë€. ì륌 ë€ìŽ, ìë°ì
List
ìží°íìŽì€ë 컬ë ì ì 볎êŽí ììì íì ì ììì íì ìŒë¡T
ë¡ ì§ì íê³ ììŒë©° ì€ì ìžì€íŽì€ë¥Œ ìì±íë ìì ìT
륌 구첎ì ìž íì ìŒë¡ ì§ì í ì ìê² íê³ ìë€. ë°ëŒì ë€ìí íì ì ìì륌 ë€ë£šêž° ìíŽ ëìŒí ì€íŒë ìŽì ì ì¬ì©í ì ìë€. - í¬íš ë€íì±ì ë©ìì§ê° ëìŒíëëŒë ìì í ê°ì²Žì íì ì ë°ëŒ ì€ì ë¡ ìíëë íëìŽ ë¬ëŒì§ë ë¥ë ¥ì ì믞íë€. í¬íš ë€íì±ì ìëžíì ë€íì±ìŽëŒê³ ë ë¶ë¥žë€. ë³Žíµ ê°ì²Žì§í¥ íë¡ê·žëë°ìì ë€íì±ìŽëŒê³ ë¶ë¥Žë ê²ìŽ í¬íš ë€íì±ì ì믞íë€.
public class Movie {
private DiscountPolicy discountPolicy;
public Money calculateMovieFee(Screening screening) {
return fee.minus(discountPolicy.calculateDiscountAmount(screening));
}
}
- í¬íš ë€íì±ì 구ííë ê°ì¥ ìŒë°ì ìž ë°©ë²ì ììì ì¬ì©íë ê²ìŽë€. ë íŽëì€ì ìì êŽê³ë¡ ì°ê²°íê³ ìì íŽëì€ìì ë¶ëªš íŽëì€ì ë©ìë륌 ì€ë²ëŒìŽë©í í íŽëŒìŽìžížë ë¶ëªš íŽëì€ë§ ì°žì¡°íë©Ž ëë€.
- í¬íš ë€íì±ì ìí ì ì 조걎ì ìì íŽëì€ê° ë¶ëªš íŽëì€ì ìëžíì ìŽìŽìŒ íë€ë ê²ìŽë€. ê·žëŠ¬ê³ ììì ì§ì í 목ì ì ìœë ì¬ì¬ì©ìŽ ìëëŒ ë€íì±ì ìí ìëžíì ê³ìžµì 구ì¶íë ê²ìŽë€.
- í¬íš ë€íì±ì ìíŽ ììì ì¬ì©íë ê°ì¥ í° ìŽì ë ìììŽ íŽëì€ë€ì ê³ìžµìŒë¡ ìì ì¬ëŠ° í ìí©ì ë°ëŒ ì ì í ë©ìë륌 ì íí ì ìë ë©ì»€ëìŠì ì ê³µíêž° ë묞ìŽë€.
ð ììì ìë©Žì±â
ð ììì ì¬ì©í ê°ì íê°â
ð¶ Lecture íŽëì€ ìŽíŽë³Žêž°â
- ìê°ìë€ì ì±ì ì ê³ì°íë ê°ëší ìì íë¡ê·žëš 구í
public class Lecture {
private int pass; // ìŽì ì¬ë¶ë¥Œ íëší êž°ì€ ì ì
private String title;
private List<Integer> scores = new ArrayList<>();
public Lecture(String title, int pass, List<Integer> scores) {
this.title = title;
this.pass = pass;
this.scores = scores;
}
public double average() {// ì 첎 íìë€ì íê·
return scores.stream()
.mapToInt(Integer::intValue)
.average().orElse(0);
}
public List<Integer> 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();
}
}
- ë€ìì ìŽì êž°ì€ìŽ 70ì ìž ê°ì²Žì§í¥ íë¡ê·žëë° ê³Œëª©ì ìê°ì 5ëª ì ëí ì±ì íµê³ë¥Œ 구íë ìœëìŽë€.
Lecture lecture = new Lecture("ê°ì²Žì§í¥ íë¡ê·žëë°", 70, Arrays.asList(81, 95, 75, 50, 45));
String evaluation = lecture.evaluate(); // "Pass: 3 Fail: 2"
ð¶ ììì ìŽì©íŽ Lecture íŽëì€ ì¬ì¬ì©íêž°â
- ìíë êž°ë¥ì
Lecture
ì ì¶ë ¥ 결곌ì ë±êžë³ íµê³ë¥Œ ì¶ê°íë ê²ìŽë€.
public class GradeLecture extends Lecture {
private List<Grade> grades;
public GradeLecture(String name, int pass, List<Grade> grades, List<Integer> scores) {
super(name, pass, scores);
this.grades = grades;
}
}
Grade
íŽëì€ë ë±êžì ìŽëŠê³Œ ê° ë±êž ë²ì륌 ì ìíë ìµì ì±ì 곌 ìµë ì±ì ì ìžì€íŽì€ ë³ìë¡ í¬íšíë€.
public class Grade {
private String name;
private int upper, lower;
private Grade(String name, int upper, int lower) {
this.name = name;
this.upper = upper;
this.lower = lower;
}
public String getName() {
return name;
}
public boolean isName(String name) {
return this.name.equals(name);
}
public boolean include(int score) { // ìê°ìì ì±ì ìŽ ë±êžì í¬íšëëì§ë¥Œ ê²ì¬íë€.
return score >= lower && score <= upper;
}
}
- ìŽì
GradeLecture
íŽëì€ì íìë€ì ìŽì ì¬ë¶ì ë±êžë³ íµê³ë¥Œ íšê» ë°ííëë¡evaluate
ë©ìë륌 ì ì ìíë€.
public class GradeLecture extends Lecture {
// ...
@Override
public String evaluate() {
return super.evaluate() + ", " + gradesStatistics();
}
private String gradesStatistics() {
return grades.stream()
.map(grade -> format(grade))
.collect(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();
}
}
- ì¬êž°ì 죌목í ë¶ë¶ì
GradeLecture
ìLecture
ì 구íë ëevaluate
ë©ìëì ìê·žëì²ê° ìì í ëìŒíë€. ë¶ëªš íŽëì€ì ìì íŽëì€ì ëìŒí ìê·žëì²ë¥Œ ê°ì§ ë©ìëê° ì¡Žì¬í ê²œì° ìì íŽëì€ì ë©ìëê° ì°ì ììê° ë ëë€. ìŠ, ìì íŽëì€ì ë©ìëê° ì€íëë€. - ìŽì²ëŒ ìì íŽëì€ ìì ììë°ì ë©ìëì ëìŒí ìê·žëì²ì ë©ìë륌 ì¬ì ìíŽì ë¶ëªš íŽëì€ì 구íì ìë¡ìŽ 구íìŒë¡ ë첎íë ê²ì ë©ìë ì€ë²ëŒìŽë©ìŽëŒê³ ë¶ë¥žë€.
Lecture lecture = 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)
);
// 결곌 => "Pass: 3 Fail: 2, A:1 B:1 C:1 D:1 F:1"
lecture.evaluate();
- ìì íŽëì€ì ë¶ëªš íŽëì€ìë ìë ìë¡ìŽ ë©ìë륌 ì¶ê°íë ê²ë ê°ë¥íë€.
public class GradeLecture extends Lecture {
// ...
public double average(String gradName) {
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);
}
}
GradeLecture
ìaverage
ë©ìëë ë¶ëªš íŽëì€ìžLecture
ì ì ìëaverage
ë©ìëì ìŽëŠì ê°ì§ë§ ìê·žëì²ë ë€ë¥Žë€. ë ë©ìëë ìê·žëì²ê° ë€ë¥Žêž° ë묞ì ë©ìë륌 ë첎íì§ ììŒë©°, 결곌ì ìŒë¡ ë ë©ìëë 공졎í ì ìë€. ìŽì²ëŒ ë¶ëªš íŽëì€ìì ì ìí ë©ìëì ìŽëŠì ëìŒíì§ë§ ìê·žëì²ë ë€ë¥ž ë©ìë륌 ìì íŽëì€ì ì¶ê°íë ê²ì ë©ìë ì€ë²ë¡ë©ìŽëŒê³ ë¶ë¥žë€.
ð ë°ìŽí° êŽì ì ììâ
Lecture
ì ìžì€íŽì€ë¥Œ ìì±íë©Ž ìì€í ì ìžì€íŽì€ ë³ìtitle
,pass
,scores
륌 ì ì¥í ì ìë ë©ëªšëŠ¬ ê³µê°ì í ë¹íê³ ìì±ìì 맀ê°ë³ì륌 ìŽì©íŽ ê°ì ì€ì í í ìì±ë ìžì€íŽì€ì 죌ì륌lecture
ëŒë ìŽëŠì ë³ìì ëì íë€.
Lecture lecture = new Lecture(
"ê°ì²Žì§í¥ íë¡ê·žëë°",
70,
Arrays.asList(81, 95, 75, 50, 45)
);
GradeLecture
íŽëì€ì ìžì€íŽì€ë ì§ì ì ìí ìžì€íŽì€ ë³ìë¿ë§ ìëëŒ ë¶ëªš íŽëì€ìžLecture
ê° ì ìí ìžì€íŽì€ ë³ìë íšê» í¬íšíë€.
Lecture lecture = 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)
);
- ììì ìžì€íŽì€ êŽì ìì ë°ëŒë³Œ ëë ê°ë ì ìŒë¡ ìì íŽëì€ì ìžì€íŽì€ ìì ë¶ëªš íŽëì€ì ìžì€íŽì€ê° í¬íšëë ê²ìŒë¡ ìê°íë ê²ìŽ ì ì©íë€.
ð íë êŽì ì ììâ
- íë êŽì ì ììì ë¶ëªš íŽëì€ê° ì ìí ìŒë¶ ë©ìë륌 ìì íŽëì€ì ë©ìëë¡ í¬íšìí€ë ê²ì ì믞íë€.
- ë¶ëªš íŽëì€ì 몚ë íŒëžëŠ ë©ìëë ìì íŽëì€ì íŒëžëŠ ìží°íìŽì€ì í¬íšëë€.
- ë°íì ìì€í ìŽ ìì íŽëì€ì ì ìëì§ ìì ë©ìëê° ìì ê²œì° ìŽ ë©ìë륌 ë¶ëªš íŽëì€ ììì íìíë€.
- ì± 401~403 ì°žê³