Justin의 개발 로그
//[Before]

public class Calculator {
    public static void main(String[] args) {
        List<Person> people = List.of(
                new Person("kim", 18, 28000000),
                new Person("lee", 19, 30000000),
                new Person("park", 20, 35000000)
        );

        var averageAge = 0;
        var averageSalary = 0;

        for(Person person : people) {
            averageAge += person.getAge();
            averageSalary += person.getSalary();
        }

        averageAge = averageAge / people.size();
        averageSalary = averageSalary / people.size();

        System.out.println(String.format("average Age: %d, average Salary: %d", averageAge, averageSalary));

    }

}

 

위와 같은 코드에서 Salary의 합, Age의 합을 출력하는 요구사항이 추가되었다고 했을 때 

// Step1 : 각 메서드 분리 & 파이프라인(스트림) 이용
public class CalculatorStep01 {
    public static void main(String[] args) {
        List<Person> people = List.of(
                new Person("kim", 18, 28000000),
                new Person("lee", 19, 30000000),
                new Person("park", 21, 35000000)
        );

        var averageAge = getAverageAge(people);

        var averageSalary = getAverageSalary(people);

        System.out.println(String.format("average Age: %.2f, average Salary: %.2f", averageAge, averageSalary));

    }

    private static double getAverageSalary(List<Person> people) {
        return people.stream()
                .mapToInt(Person::getSalary)
                .average().orElse(0);
    }

    private static double getAverageAge(List<Person> people) {
        return people.stream()
                .mapToInt(Person::getAge)
                .average().orElse(0);
    }

}

 

//Step2 : 메서드를 Class로 이동

public class CalculatorStep02 {
    public static void main(String[] args) {
        List<Person> people = List.of(
                new Person("kim", 18, 28000000),
                new Person("lee", 19, 30000000),
                new Person("park", 21, 35000000)
        );

        var peopleStatistics = new PeopleStatistics(people);
        System.out.println(String.format("average Age: %.2f, average Salary: %.2f", peopleStatistics.getAverageAge(), peopleStatistics.getAverageSalary()));

    }

    private static class PeopleStatistics {
        private List<Person> people;

        public PeopleStatistics(List<Person> people) {
            this.people = people;
        }

        public double getAverageSalary() {
            return people.stream()
                    .mapToInt(Person::getSalary)
                    .average().orElse(0);
        }

        public double getAverageAge() {
            return people.stream()
                    .mapToInt(Person::getAge)
                    .average().orElse(0);
        }
    }

 

//Step3 : 
//	파라미터를 생성자로 이동
//	반복 연산을 초기화로 변경
//  토탈, 평균 등 메서드 추가
public class CalculatorStep03 {
    public static void main(String[] args) {
        List<Person> people = List.of(
                new Person("kim", 18, 28000000),
                new Person("lee", 19, 30000000),
                new Person("park", 21, 35000000)
        );

        var peopleStatistics = new PeopleStatistics(people);
        System.out.println(String.format("average Age: %.2f, average Salary: %.2f", peopleStatistics.getAverageAge(), peopleStatistics.getAverageSalary()));

        System.out.println(String.format("Total Age: %d, Total Salary: %d", peopleStatistics.getTotalAge(), peopleStatistics.getTotalSalary()));
    }

    private static class PeopleStatistics {
        private List<Person> people;
        private int totalAge;
        private int totalSalary;

        public int getTotalAge() {
            return totalAge;
        }

        public int getTotalSalary() {
            return totalSalary;
        }

        public PeopleStatistics(List<Person> people) {
            this.people = people;
            totalAge();
            totalSalary();
        }

        private void totalAge() {
            totalAge = people.stream()
                    .mapToInt(Person::getAge)
                    .sum();
        }

        private void totalSalary() {
            totalSalary = people.stream()
                    .mapToInt(Person::getSalary)
                    .sum();
        }

        public double getAverageSalary() {
            return (double) totalSalary / people.size();
        }

        public double getAverageAge() {
            return (double) totalAge / people.size();
        }
    }

 

profile

Justin의 개발 로그

@라이프노트

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!