1. Question

외부 반복(external iteration)내부 반복(internal iteration)은 어떤 차이점이 있는가?

2. Answer

  • 외부 반복: 외부 반복은 전통적인 반복 방식으로, 사용자가 직접 컬렉션의 각 요소를 반복하고, 순회하며 처리한다. 이 방식에서 반복의 제어는 사용자의 코드에 의해 명시적으로 관리된다. 다음은 컬렉션을 사용한 외부 반복의 예시이다.
List<String> names = Arrays.asList("John", "Jane", "Jake", "Jill");

for(String name : names) {
  System.out.println(name);
}

이 코드에서는 for-each 루프를 사용하여 리스트의 각 요소를 순회하고 출력한다. 여기서 반복의 제어 로직은 명시적으로 코드에 나타나 있다.

  • 내부 반복: 내부 반복은 Stream API에서 도입된 개념으로, 반복을 추상화하고 반복되는 요소의 처리를 라이브러리에 위임한다. 사용자는 ‘무엇을’ 할지에 대해 정의하고 ‘어떻게’ 수행될지에 대한 세부 사항은 라이브러리에 의해 관리된다. 다음은 스트림을 사용한 내부 반복의 예시이다.
List<String> names = Arrays.asList("John", "Jane", "Jake", "Jill");

names.stream()
  .forEach(System.out.println);

이 코드에서는 스트림의 forEach 연산을 사용하여 각 요소를 출력한다. 반복의 로직은 스트림 라이브러리 내부에 캡슐화되어 있으며,사용자는 각 요소에 대해 수행될 작업만 정의한다.

3. Detail

A. 반복 제어

  • 외부 반복: 반복 메커니즘이 사용자에 의해 외부적으로 제어된다. 사용자는 for, while, do-while 루프를 사용하여 컬렉션의 각 요소를 순회하고, 각 요소에 대해 수행할 작업을 정의한다. 반복의 시작과 끝, 그리고 반복 중 발생하는 각 단계는 명시적으로 코드에 표현된다.

  • 내부 반복: 반복 매커니즘이 컬렉션 자체 또는 스트림 라이브러리에 의해 내부적으로 관리된다. 사용자는 각 요소에 대해 수행도리 작업만을 정의하고, 반복 방식과 그 세부 사항은 라이브러리가 자동으로 처리한다. 내부 반복은 라이브러리가 작업의 순서, 병렬성, 그리고 최적화를 결정할 수 있게 해주어, 코드의 간결성과 유연성을 제공한다.

B. 병렬 처리

  • 외부 반복: 병렬 처리를 구현하기 위해서는 사용자가 명시적으로 스레드를 관리하고, 동기화를 신경 써야 한다. 이로 인해 코드가 복잡해질 수 있고, 오류가 발생하기 쉬워질 수 있다.

  • 내부 반복: 스트림 API와 같은 라이브러리들은 병렬 처리를 내부적으로 지원한다. .parallelStream() 같은 메서드를 사용하여 간단히 병렬 처리를 활성화할 수 있으며, 라이브러리가 작업 분할, 스레드 관리, 작업 부하 균형 등을 자동으로 처리한다. 이는 코드를 간결하게 유지하면서도 병렬 처리의 이점을 쉽게 누릴 수 있게 해준다.

C. 코드의 간결성과 가독성

  • 외부 반복: 반복 제어 로직이 사용자의 코드에 명시적으로 포함되어 있어, 코드가 길고 복잡해질 수 있다. 반복 로직과 실제 비즈니스 로직이 혼재되어 코드의 가독성과 유지보수성이 떨어질 수 있다.

  • 내부 반복: 사용자는 ‘무엇을’ 할 것인지만 정의하고, ‘어떻게’ 수행할지는 라이브러리에 위임한다. 이로 인해 코드가 더 선언적이고 간결해지며, 비즈니스 로직에만 집중할 수 있게 된다. 결과적으로 코드의 가독성과 유지보수성이 향상된다.

4. Reference

  • “모던 자바 인 액션” (저자: 라울-게이브리얼 우르마, 마리오 푸스코, 앨런 마이크로프트)

태그:

카테고리:

업데이트:

댓글남기기