Iterator 및 Iterable 인터페이스는 Java에서 Collection을 다루는데 꼭 필요한 기본 구성 요소입니다.
실제로 각 인터페이스는 요소를 탐색하는 방법을 제공하지만, 목적과 사용 시나리오가 다릅니다.
여기에서는 Iterator.forEachReamining()과 Iterable.forEach()의 차이점을 살펴보도록 하겠습니다.
Iterator.forEachRemaining() 메서드
Iterrator 인터페이스는 요소 컬렉션을 순차적으로 반복하는 방법을 제공합니다. Iterator 인터페이슨의 forEachRemaining()메서드는 Java8에서 도입되었습니다.
또한 반복자에서 남은 각 요소에 대해 간결하게 작업할 수 있는 방법을 제공합니다. 그리고 Consumer 함수형 인터페이스를 인수로 사용하여 각 요소에 수행되는 작업을 나타냅니다.
다음과 같은 직원의 세부 정보가 있다고 가정하겠습니다.
private final List<String> employeeDetails = Arrays.asList(
"Alice Johnson, 30, Manager",
"Bob Smith, 25, Developer",
"Charlie Brown, 28, Designer"
);
위 정보를 다음과 같은 간단한 출력(보고서)을 생성하고 싶습니다.
String expectedReport =
"Employee: Alice Johnson, 30, Manager\n" +
"Employee: Bob Smith, 25, Developer\n" +
"Employee: Charlie Brown, 28, Designer\n";
여기서 직원 세부 정보 목록을 초기화하고 각 직원의 정보를(직원: 이름, 나이, 역할 - Employee: Name, Age, Role) 형식으로 지정한 예상 출력(보고서) 형식을 지정하였습니다.
이제 Iterator.forEachRemaining() 메서드를 활용하여 emplyeeDetails 목록을 반복하고 보고서를 생성하겠습니다.
@Test
public void givenEmployeeDetails_whenUsingIterator_thenGenerateEmployeeReport() {
StringBuilder report = new StringBuilder();
employeeDetails.iterator().forEachRemaining(employee ->
report.append("Employee: ").append(employee).append("\n")
);
assertEquals(expectedReport, report.toString());
}
이 테스트 메서드에서 우리는 반복자의 각 요소를 처리하고, StringBuilder에 포멧된 직원 정보를 추가합니다. employeeDetails 목록의 각 직원 세부 정보 문자열에 대해 메서드는 접두사 "직원(Employee)"를 추가하고 그 뒤에 직원 세부 정보와 줄 바꿈 문자를 추가합니다.
출력을 생성한 후 assertEquals() 메서드를 이용하여 출력(report)이 예상 출력(expectedReport)와 일치하는지 확인할 수 있습니다.
Iterable.forEach() 메서드
Java의 Iterable인터페이스는 반복 가능한 객체 컬렉션을 나타냅니다. Iterable 인터페이스의 forEach()메서드도 Java8에 도입이 되었습니다.
기본 메서드는 컬렉션의 각 요소로 작동할 수 있게 해줍니다. Iterator.forEachRemaining() 처럼 Consumer 함수형 인터페이스를 인수로 사용합니다.
맥락을 제공하기 위해 예제를 살펴보겠습니다.
@Test
public void givenEmployeeDetails_whenUsingForEach_thenGenerateEmployeeReport() {
StringBuilder report = new StringBuilder();
employeeDetails.forEach(employee ->
report.append("Employee: ").append(employee).append("\n")
);
assertEquals(expectedReport, report.toString());
}
forEach()메서드 내에서 람다 표현식을 사용하여 각 포멧된 직원 세부 정보를 StringBuilder의 출력(보고서)에 추가합니다.
Iterator.forEachRemaining()과 유사하게 이 람다 표현식은 각 요소를 입력으로 받고 접두사(Employee: )와 직원 세부 정보, 줄 바꿈 문자를 붙여 동일한 포멧팅 작업을 수행합니다.
차이점 (Iterator.forEachRemaining() vs Iterable.forEach())
주요 차이점 | iterator.forEachRemaining() | iterable.forEach() |
용법 | 이를 사용하면 iterator의 나머지 각 요소에 대해 작업을 수행한다. | iterator를 명시적으로 사용하지 않고도 이를 사용하여 각 컬렉션 요소에 직접 작업을 수행할 수 있다. |
구현 | Iterator 인터페이스에만 적용 되며 iterator 인스턴스에서 직접 작동한다. | iterable 인터페이스의 기본 메서드는 iterable 컬렉션에서 직접 작동한다. |
유연성 | iterator를 사용하여 컬렉션의 요소 하위 집합을 반복할때 유용하다. | 특히 람다 표현식을 사용할 때 컬렉션으로 직접 작업하는 것이 더 편리하다. |
결론
iterator나 컬렉션(collection)을 직접 다루는지에 따라 적절한 메서드를 선택하는 것은 사용자선호도에 따라 달라질 수 있습니다.
전체코드
package com.liooos.example.other.iterator;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
class DifferenceForEachRemainingAndForEachTest {
// 직원 정보 배열
private final List<String> employeeDetails = Arrays.asList(
"Alice Johnson, 30, Manager",
"Bob Smith, 25, Developer",
"Charlie Brown, 28, Designer"
);
// 예상 출력
String expectedReport =
"Employee: Alice Johnson, 30, Manager\n" +
"Employee: Bob Smith, 25, Developer\n" +
"Employee: Charlie Brown, 28, Designer\n";
// iterator.forEachRemaining() 활용
@Test
public void givenEmployeeDetails_whenUsingIterator_thenGenerateEmployeeReport() {
StringBuilder report = new StringBuilder();
employeeDetails.iterator().forEachRemaining(employee ->
report.append("Employee: ").append(employee).append("\n")
);
assertEquals(expectedReport, report.toString());
}
// iterable.forEach() 활용
@Test
public void givenEmployeeDetails_whenUsingForEach_thenGenerateEmployeeReport() {
StringBuilder report = new StringBuilder();
employeeDetails.forEach(employee ->
report.append("Employee: ").append(employee).append("\n")
);
assertEquals(expectedReport, report.toString());
}
}
잘못된 내용이나 오타가 있을 경우 댓글로 알려주세요.
감사합니다.
출처: https://www.baeldung.com/java-iterator-foreachremaining-vs-iterable-foreach
'Development > Java' 카테고리의 다른 글
[Java] 정규식을 사용하여 문자열 바꾸기(back referece와 lookaround 비교) - spring boot gradle (0) | 2024.08.19 |
---|---|
[JAVA] 배열의 정렬된 인덱스 가져오기(배열 보존) (0) | 2024.08.13 |
[JAVA] 배열에서 0에 가장 가까운 숫자 찾기 (0) | 2024.08.07 |
[JAVA] CLOB과 String(문자열)간의 변환 (0) | 2024.08.07 |
[JAVA] 정렬할 때 NullPointerException 방지 - Comparator.nullsLast() 활용 (0) | 2024.08.02 |