ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] 리스트의 합 구하기
    Java/Collection(컬렉션) 2024. 9. 27. 15:48
    반응형

    목차

       
      자바에서는 리스트의 합을 구하는 여러 가지 방법이 있습니다. 전통적인 for 문, 향상된 for 문, Stream API, 재귀 호출, 그리고 병렬 스트림을 사용하는 방법이 있습니다.
       

      1. 전통적인 for 문를 사용한 합 구하기

      전통적인 for 문를 사용하여 리스트의 합을 구하는 방법은 직관적이고 간단합니다.
      for 문를 사용한 방법
      /**
       * 리스트의 합을 전통적인 for 문을 사용
       *
       * @param list 합을 구할 리스트
       * @return 리스트 요소들의 합
       */
      public int sumUsingForLoop(List<Integer> list) {
        int sum = 0;
        for (int i = 0; i < list.size(); i++) {
          sum += list.get(i);
        }
        return sum;
      }
      단위 테스트
      @DisplayName("sumUsingForLoop: 리스트 요소들의 합")
      @Test
      public void testSumUsingForLoop() {
      
        // Given
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
      
        // When
        int result = listSum.sumUsingForLoop(list);
      
        // Then
        assertEquals(15, result);
      }
      장점 :
      - 직관적 : 이해하기 쉬운 간단한 방법입니다.
      단점 :
      - 코드 길이 : 다른 방법들에 비해 코드가 길어질 수 있습니다.
       

      2. 향상된 for 문를 사용한 합 구하기

      향상된 for 문를 사용하면 코드가 더 간결해집니다.
      향상된 for 문를 사용한 방법
      /**
       * 리스트의 합을 향상된 for 문을 사용
       *
       * @param list 합을 구할 리스트
       * @return 리스트 요소들의 합
       */
      public int sumUsingEnhancedForLoop(List<Integer> list) {
        int sum = 0;
        for (int num : list) {
          sum += num;
        }
        return sum;
      }
      단위 테스트
      @DisplayName("sumUsingEnhancedForLoop: 리스트 요소들의 합")
      @Test
      public void testSumUsingEnhancedForLoop() {
      
        // Given
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
      
        // When
        int result = listSum.sumUsingEnhancedForLoop(list);
      
        // Then
        assertEquals(15, result);
      }
      점 :
      - 간결함 : 코드가 더 간결해집니다.
      단점 :
      - 제어 및 변형 : 전통적인 for 문와 달리 인덱스 제어나 변형은 어렵습니다.

       

      3. Stream API를 사용한 합 구하기

      Java 8부터 도입된 스트림 API를 사용하면 더 간결하고 함수형 프로그래밍 스타일의 코드를 작성할 수 있습니다.
      스트림 API를 사용한 방법
      /**
       * 리스트의 합을 Stream API를 사용
       *
       * @param list 합을 구할 리스트
       * @return 리스트 요소들의 합
       */
      public int sumUsingStreams(List<Integer> list) {
        return list.stream()
            .mapToInt(Integer::intValue)
            .sum();
      }

      단위 테스트

      @DisplayName("sumUsingStreams: 리스트 요소들의 합")
      @Test
      public void testSumUsingStreams() {
      
        // Given
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
      
        // When
        int result = listSum.sumUsingStreams(list);
      
        // Then
        assertEquals(15, result);
      }

      장점 :

      - 가독성 : 코드가 매우 간결하고 읽기 쉽습니다.

      - 함수형 프로그래밍 : 최신 자바에서 선호되는 함수형 프로그래밍 패러다임을 활용합니다.

      단점 :

      - 성능 : 스트림은 약간의 성능 오버헤드를 수반하지만, 대부분의 경우 이는 무시할 수 있습니다.

       

      4. 스트림의 reduce 메서드를 사용한 합 구하기

      스트림의 reduce 메서드를 사용하면 더 제어된 방식으로 요소들을 합칠 수 있습니다.
      스트림의 reduce 메서드를 사용한 방법
      /**
       * 리스트의 합을 Stream의 reduce 메서드를 사용
       *
       * @param list 합을 구할 리스트
       * @return 리스트 요소들의 합
       */
      public int sumUsingStreamReduce(List<Integer> list) {
        return list.stream()
            .reduce(0, Integer::sum);
      }
      단위 테스트
      @DisplayName("sumUsingStreamReduce: 리스트 요소들의 합")
      @Test
      public void testSumUsingStreamReduce() {
      
        // Given
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
      
        // When
        int result = listSum.sumUsingStreamReduce(list);
      
        // Then
        assertEquals(15, result);
      }
       
      장점 :
      - 유연성 : 다양한 연산을 수행하는데 유연하게 사용할 수 있습니다.
      단점 :
      - 가독성 : 단순한 합계의 경우 다른 방식보다 이해하기 어려울 수 있습니다.

       

      5. 재귀 호출을 사용한 합 구하기

      재귀 호출을 사용하면 반복문 없이도 합을 구할 수 있지만, 스택 오버플로우와 같은 문제가 발생할 수 있습니다.
      재귀 호출을 사용한 방법
      /**
       * 리스트의 합을 재귀 호출을 사용
       *
       * @param list 합을 구할 리스트
       * @return 리스트 요소들의 합
       */
      public int sumUsingRecursion(List<Integer> list) {
        if (list.isEmpty()) {
          return 0;
        }
        return sumListRecursive(list, list.size() - 1);
      }
      
      /**
       * 재귀 호출을 통해 리스트의 인덱스까지의 합을 계산
       *
       * @param list 합을 구할 리스트
       * @param index 합을 계산할 마지막 인덱스
       * @return 지정된 인덱스까지의 리스트 요소들의 합
       */
      private int sumListRecursive(List<Integer> list, int index) {
        if (index == 0) {
          return list.get(index);
        }
        return list.get(index) + sumListRecursive(list, index - 1);
      }

      단위 테스트

      @DisplayName("sumUsingRecursion: 리스트 요소들의 합")
      @Test
      public void testSumUsingRecursion() {
      
        // Given
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
      
        // When
        int result = listSum.sumUsingRecursion(list);
      
        // Then
        assertEquals(15, result);
      }

      장점 :

      - 재귀적 사고 : 복잡한 문제를 쉽게 해결할 수 있습니다.

      단점 :

      - 성능 : 큰 리스트에서는 성능이 떨어지고 스택 오버플로우가 발생할 수 있습니다.

       

      6. 병렬 스트림을 사용한 합 구하기

      병렬 스트림을 사용하면 리스트 요소들의 합을 더 빠르게 구할 수 있습니다.
      병렬 스트림을 사용한 방법
      /**
       * 리스트의 합을 병렬 스트림(parallelStream)을 사용 
       *
       * @param list 합을 구할 리스트
       * @return 리스트 요소들의 합
       */
      public int sumUsingParallelStream(List<Integer> list) {
        return list.parallelStream()
            .mapToInt(Integer::intValue)
            .sum();
      }

      단위 테스트

      @DisplayName("sumUsingParallelStream: 리스트 요소들의 합")
      @Test
      public void testSumUsingParallelStream() {
      
        // Given
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
      
        // When
        int result = listSum.sumUsingParallelStream(list);
      
        // Then
        assertEquals(15, result);
      }

      장점 :

      - 성능 : 병렬 처리를 통해 성능 향상을 기대할 수 있습니다.

      단점 :

      - 복잡성 : 병렬 스트림의 사용법이 다소 복잡할 수 있으며, 작은 리스트에서는 오히려 성능이 저하될 수 있습니다.

       

      결론

      결론적으로, 자바에서 리스트의 합을 구하는 방법은 다양합니다. 상황에 따라 가장 적합한 방법을 선택하여 사용할 수 있습니다. 일반적으로 스트림 API는 간결성과 가독성 측면에서 많이 선호되며, 전통적인 for 문 또한 여전히 널리 사용됩니다.
       

      소스 코드는 Github Repository- https://github.com/tychejin1218/blog/tree/main/java-collection 프로젝트를 참조하세요.

      반응형

      댓글

    Designed by Tistory.