[Java] Lambda - Foreach Iteration
- Java
- 2020. 8. 17.
이번 글에서는 lambda를 사용한 foreach iteration에 대해 알아보도록 하겠습니다.
1. Foreach Iteration
java8에서는 collections을 looping하는 방법으로 lambda를 사용한 foreach 방법이 새롭게 등장했습니다.
1-1) external iterator
예를 들어 아래와 같은 List가 존재할때
List<Person> people = Arrays.asList(
new Person("Charles", "Dickens", 60),
new Person("Lewis", "Carroll", 42),
new Person("Thomas", "Carlyle", 51),
new Person("Charlotte", "Bronte", 45),
new Person("Matthew", "Arnold", 39)
);
기존 java7에서는 다음과 같이 2가지 방법의 looping 문을 개발자가 직접 작성했습니다.
// using for loop
for(int i=0; i<people.size(); i++){
System.out.println(people.get(i));
}
// using for each loop
for(Person p : people){
System.out.println(p);
}
위와 같이 작성된 looping 문을 external iterator 라고 부르며
출력 결과는 다음과 같습니다.
이때 'external iterator'란 iteration을 위한 code를 개발자가 작성해 iteration의 로직을 통제하며, compiler는 단지 작성된 로직에 맞게 동작하는 역할만 수행하는 iterator를 의미합니다.
간단히 이해하자면.. iteration의 control이 사용자에게 있는 looping? 정도로 생각 할 수 있을 것 같습니다. 😅
1-2) internal iterator
반면 java8에서는 lambda를 사용해 다음과 같이 작성할 수 있습니다.
// foreach
people.forEach(System.out::println);
이때 forEach 메서드는 input 인자로 Consumer Functional Interface를 사용합니다.
출력 결과는 다음과 같이 동일합니다.
음.. 뭔가 다른거죠? 😅
결과는 동일하지만, 위의 foreach 메서드를 사용하면 iteration의 control을 더이상 개발자가 아닌 iterator 스스로가 가지게 됩니다.
따라서 개발자는 단순히 "모든 elements에 어떠한 작업이 수행되면 좋겠어!"라고 선언하는 역할만 수행하게 됩니다.
이후 Runtime 시점에 iterator가 해당 function을 해석해 작업을 수행하게 됩니다.
따라서 개발자는 lambda를 사용해 짧고 간결하게, iteration 작업을 수행할 수 있게 되었습니다. 👏👏👏
++ interanl iterator를 사용하면, lambda를 사용하는 것 이외에도 손쉽게 병렬 처리를 할 수 있다는 장점이 있습니다.
기존 extenal iterator는 개발자가 작성한 logic을 따르기 때문에, 다음과 같이 sequential 하게 작업이 수행되었습니다.
반면, internal iterator를 사용하면 작업을 Runtime 시점에 iterator가 알아서 수행하기 때문에.. 하나의 작업을 여러 core에 나눠서 병렬로 처리할 수 있게됩니다.
만약 core가 3개라면 위와 같은 방법으로 쪼개서 작업을 수행할 수 있습니다.
iterator가 어떻게 작업을 수행하는지는 다음에 한번 공부해보도록 하겠습니다. 😅
추천서적
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
'Java' 카테고리의 다른 글
[Java] Lambda - Stream (0) | 2020.08.17 |
---|---|
[Java] Lambda - Method Reference (0) | 2020.08.16 |
[Java] Lambda - This Reference (0) | 2020.08.16 |
[Java] Lambda - Closure (0) | 2020.08.16 |
[Java] Lambda - Exception Handling (0) | 2020.08.16 |