๐Ÿต java

JAVA | ํ•™์  ๊ณ„์‚ฐ๊ธฐ ์‹ค์Šต - (2)

c0zi 2023. 9. 6. 10:05
ํ•™์  ๊ณ„์‚ฐ๊ธฐ ์‹ค์Šต - (1)

 

์š”๊ตฌ์‚ฌํ•ญ

  • ํ‰๊ท ํ•™์  ๊ณ„์‚ฐ ๋ฐฉ๋ฒ• = (ํ•™์ ์ˆ˜×๊ต๊ณผ๋ชฉ ํ‰์ )์˜ ํ•ฉ๊ณ„/์ˆ˜๊ฐ•์‹ ์ฒญ ์ดํ•™์  ์ˆ˜ โ˜‘๏ธ
  • MVCํŒจํ„ด(Model-View-Controller) ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค. โ˜‘๏ธ
  • ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ โ˜‘๏ธ

 

์ด๋ฒˆ์—๋Š” ์ €๋ฒˆ ์‹œ๊ฐ„์— ์ด์–ด ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ชจ๋‘ ์ถฉ์กฑ์‹œ์ผœ ๋ณด๋„๋ก ํ•œ๋‹ค.


ํ•™์  ๊ณ„์‚ฐ๊ธฐ ์‹ค์Šต์„ ๋‹ค์Œ์˜ ๊ฐ์ฒด์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋”ฐ๋ผ ๊ตฌํ˜„ํ•ด๋ณด๋ก ํ•œ๋‹ค.

 

๊ฐ์ฒด์ง€ํ–ฅ ํŒจ๋Ÿฌ๋‹ค์ž„

1. ๋„๋ฉ”์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ์ฒด์—๋Š” ์–ด๋–ค ๊ฒƒ๋“ค์ด ์žˆ๋Š”์ง€ ๊ณ ๋ฏผ
2. ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ณ ๋ฏผ
3. ๋™์ ์ธ ๊ฐ์ฒด๋ฅผ ์ •์ ์ธ ํƒ€์ž…์œผ๋กœ ์ถ”์ƒํ™”ํ•ด์„œ ๋„๋ฉ”์ธ ๋ชจ๋ธ๋ง ํ•˜๊ธฐ
4. ํ˜‘๋ ฅ์„ ์„ค๊ณ„
5. ๊ฐ์ฒด๋“ค์„ ํฌ๊ด„ํ•˜๋Š” ํƒ€์ž…์— ์ ์ ˆํ•œ ์ฑ…์ž„์„ ํ• ๋‹น
6. ๊ตฌํ˜„ํ•˜๊ธฐ

 

5. ๊ฐ์ฒด๋“ค์„ ํฌ๊ด„ํ•˜๋Š” ํƒ€์ž…์— ์ ์ ˆํ•œ ์ฑ…์ž„์„ ํ• ๋‹น

⇒ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ์ฑ…์ž„ ํ• ๋‹น

 

+) ํ•œ๊ธ€ ์ธ์ฝ”๋”ฉ ๋ฌธ์ œ ๋‹ค์‹œ ๋ฐœ์ƒ

๐Ÿ“ ์ง„ํ–‰ ๊ณผ์ •

 

์ด๋ฒˆ ํ•™์  ๊ณ„์‚ฐ๊ธฐ ์—ญ์‹œ TDD ๋ฐฉ๋ฒ•๋ก ์„ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์Šต์„ ์ง„ํ–‰ํ•˜์˜€๋‹ค.

 

โ˜‘๏ธ ๊ฐ์ฒด์—๊ฒŒ ์ž‘์—… ํ• ๋‹น

 

calculateGrade()

public double calculateGrade() {
    // (ํ•™์ ์ˆ˜×๊ต๊ณผ๋ชฉ ํ‰์ )์˜ ํ•ฉ๊ณ„
    double MultipliedCreditAndCourseGrade = 0;

    for (Course course: courses) {
        // ๊ธฐ์กด ๋ฐฉ๋ฒ•
        // MultipliedCreditAndCourseGrade += course.getcredit() * course.getGradeToNumber;
        // -> course ๋‚ด์—์„œ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‘์ง‘๋„๊ฐ€ ๋‚ฎ์Œ
        // -> ๋น„์Šทํ•œ ์ฝ”๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ์—์„œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๋•Œ ์ˆ˜์ • ์‹œ์— ๋ฒˆ๊ฑฐ๋กœ์›€

        // ์ˆ˜์ •ํ•œ ๋ฐฉ๋ฒ• : ๊ฐ์ฒด์—๊ฒŒ ์ž‘์—… ์œ„์ž„
        MultipliedCreditAndCourseGrade += course.multiplyCreditAndCourseGrade();
    }

    int totalCompletedCredit = courses.stream()
            .mapToInt(Course::getCredit)
            .sum();

    return MultipliedCreditAndCourseGrade / totalCompletedCredit;
}

 

๋จผ์ €, ํ•™์  ๊ณ„์‚ฐ๊ธฐ ์‹ค์Šต - (1)์—์„œ calculateGrade()๋ฅผ ๊ตฌํ˜„ํ–ˆ๋˜ ๊ฒƒ๋ณด๋‹ค ๋” ๊ฐœ์„ ํ•œ ์ฝ”๋“œ์ด๋‹ค.

 

๊ธฐ์กด์˜ ๊ณ„์‚ฐ ๋ฐฉ๋ฒ•์€ course ๊ฐ์ฒด์—์„œ getter๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•™์ ์ˆ˜์™€ ๋“ฑ๊ธ‰์„ ๊ฐ€์ ธ์˜ค๊ณ  calculate ๋‚ด์—์„œ ๋‘ ๊ฐ’์„ ๊ณฑํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ course ๊ฐ์ฒด ๋ฐ–์—์„œ ๊ณ„์‚ฐ์„ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‘์ง‘๋„๊ฐ€ ๋‚ฎ๋‹ค๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค.

 

* ์‘์ง‘๋„ : ๋ชจ๋“ˆ ๋‚ด๋ถ€์˜ ๊ธฐ๋Šฅ์ ์ธ ์‘์ง‘ ์ •๋„

 

์ด๋ ‡๊ฒŒ ์‘์ง‘๋„๊ฐ€ ๋‚ฎ์€ ๊ฒฝ์šฐ์—๋Š” ์—ฐ์‚ฐ ๊ณผ์ •์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ด์šฉํ•œ ๋ชจ๋“  ๋ถ€๋ถ„์„ ์ผ์ผํžˆ ๊ณ ์ณ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‘์ง‘๋„๋ฅผ ๋†’๊ฒŒ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ฝ”๋“œ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ์„ ์„ ์œ„ํ•ด ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•˜์—ฌ course ๋‚ด์—์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ž‘์—…์„ ์œ„์ž„ํ•˜๊ณ  ์ด๋ฅผ ๋ฐ˜ํ™˜ ๋ฐ›๋„๋ก ์ˆ˜์ •ํ•˜์˜€๋‹ค. course ๊ฐ์ฒด ๋‚ด์—๋„ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

 

Course

public double multiplyCreditAndCourseGrade() {
    // getter๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ํ•ด๋‹น ๊ฐ์ฒด์—๊ฒŒ ์ž‘์—…์„ ์œ„์ž„
    return (credit * getGradeToNumber());
}

 

โ˜‘๏ธ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ

 

์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์ด๋ž€ ?

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ List ํ˜•ํƒœ๋กœ ๋œ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋งŒ์„ ๊ฐ€์ง€๋Š” ํด๋ž˜์Šค
-> ๋ณ€์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ x, ํ•ด๋‹น ์ •๋ณด๋งŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด์„œ List ํ˜•ํƒœ๋กœ ์ฒ˜๋ฆฌ

 

GradeCalculator

public class GradeCalculator {

    private final Courses courses;

    // List๋กœ ๋ฐ›๋”๋ผ๋„ ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์œผ๋กœ ์ „๋‹ฌํ•˜๋„๋ก ๋ณ€๊ฒฝ
    public GradeCalculator(List<Course> courses) {
        this.courses = new Courses(courses);
    }


    /*
 ์š”๊ตฌ์‚ฌํ•ญ
  - ํ‰๊ท ํ•™์  ๊ณ„์‚ฐ ๋ฐฉ๋ฒ• = (ํ•™์ ์ˆ˜×๊ต๊ณผ๋ชฉ ํ‰์ )์˜ ํ•ฉ๊ณ„/์ˆ˜๊ฐ•์‹ ์ฒญ ์ดํ•™์  ์ˆ˜
  - MVCํŒจํ„ด(Model-View-Controller) ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„ํ•œ๋‹ค.
  - ์ผ๊ธ‰ ์ปฌ๋ ‰์…˜ ์‚ฌ์šฉ
 */

    public double calculateGrade() {

        // (ํ•™์ ์ˆ˜×๊ต๊ณผ๋ชฉ ํ‰์ )์˜ ํ•ฉ๊ณ„
        double totalMultipliedCreditAndCourseGrade = courses.multiplyCreditAndCourseGrade();

        // ์ˆ˜๊ฐ•์‹ ์ฒญ ์ดํ•™์  ์ˆ˜
        int totalCompletedCredit = courses.calculateTotalCompletedCredit();

        return totalMultipliedCreditAndCourseGrade / totalCompletedCredit;
    }
}

 

์ผ๊ธ‰ ์ปฌ๋ ‰์…˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด List ํ˜•ํƒœ๋กœ ์ „๋‹ฌํ•œ๋‹ค.

 

Courses 

package org.example;

import java.util.List;

public class Courses {
    private final List<Course> courses;

    public Courses(List<Course> courses) {
        this.courses = courses;
    }

    public double multiplyCreditAndCourseGrade() {
        // refactoring
        return courses.stream()
                .mapToDouble(Course::multiplyCreditAndCourseGrade)
                .sum();

//        double multipliedCreditAndCourseGrade = 0;
//        for (Course course: courses) {
//            multipliedCreditAndCourseGrade += course.multiplyCreditAndCourseGrade();
//        }
//        return multipliedCreditAndCourseGrade;

    }

    public int calculateTotalCompletedCredit() {
        return courses.stream()
                .mapToInt(Course::getCredit)
                .sum();

    }
}

 

stream ๋ณต์Šต์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

 


์ฐธ๊ณ  ๋ธ”๋กœ๊ทธ

https://velog.io/@seongwon97/%EC%9D%BC%EA%B8%89-%EC%BB%AC%EB%A0%89%EC%85%98%EC%9D%B4%EB%9E%80
https://tecoble.techcourse.co.kr/post/2020-05-08-First-Class-Collection/