본문 바로가기
Dart/Dart Programming language

[중급] Dart 컬렉션과 고차 함수/ Iterable과 고차 함수: map, filter, reduce 등 완벽 이해

by Maccrey Coding 2024. 9. 6.
반응형

 

Dart에서 Iterable은 반복 가능한 객체를 의미하며, 리스트(List), 맵(Map), 세트(Set)와 같은 컬렉션의 기반이 되는 핵심 개념입니다. Iterable은 요소들을 하나씩 순회할 수 있는 인터페이스를 제공합니다. 이번 글에서는 Iterable의 개념과 함께, 이를 활용하는 대표적인 고차 함수(map, filter, reduce 등)에 대해 알아보겠습니다.

1. Iterable의 개념

Iterable은 Dart에서 반복 가능한 객체를 의미합니다. 이는 iterator를 통해 요소를 하나씩 순회할 수 있다는 것을 뜻합니다.

Dart의 대부분의 컬렉션(List, Set, Map 등)은 Iterable을 상속받아 구현됩니다.

Iterable<int> numbers = [1, 2, 3, 4, 5];
for (var number in numbers) {
  print(number);
}

위 코드에서 numbers는 Iterable 객체로, for-in 구문을 통해 각 요소를 순회할 수 있습니다.

2. 고차 함수(Higher-Order Function)란?

고차 함수는 다른 함수를 인자로 받거나, 함수를 반환하는 함수입니다. Dart에서는 Iterable을 사용하여 다양한 고차 함수를 지원하며, 이를 통해 코드의 가독성을 높이고, 복잡한 로직을 간단하게 구현할 수 있습니다.

3. Iterable에서 자주 사용되는 고차 함수

3.1 map() 함수

map() 함수는 Iterable의 각 요소에 대해 주어진 함수를 적용하여 새로운 Iterable을 생성합니다. 이 함수는 원본 Iterable을 변형할 때 유용합니다.

Iterable<int> numbers = [1, 2, 3, 4, 5];
Iterable<int> squaredNumbers = numbers.map((num) => num * num);

print(squaredNumbers); // (1, 4, 9, 16, 25)

위 코드에서 map() 함수는 각 요소에 num * num 연산을 적용하여 새로운 Iterable을 반환합니다.

3.2 where() 함수 (Filter)

where() 함수는 조건을 만족하는 요소들만 필터링하여 새로운 Iterable을 반환합니다.

Iterable<int> numbers = [1, 2, 3, 4, 5];
Iterable<int> evenNumbers = numbers.where((num) => num.isEven);

print(evenNumbers); // (2, 4)

where() 함수는 주어진 조건(여기서는 num.isEven)을 만족하는 요소만 포함한 새로운 Iterable을 생성합니다.

3.3 reduce() 함수

reduce() 함수는 Iterable의 모든 요소를 하나의 값으로 축약합니다. 이 함수는 연산을 축적하며, 리스트의 값을 합치거나 곱할 때 유용합니다.

where() 함수는 주어진 조건(여기서는 num.isEven)을 만족하는 요소만 포함한 새로운 Iterable을 생성합니다.

3.3 reduce() 함수
reduce() 함수는 Iterable의 모든 요소를 하나의 값으로 축약합니다. 이 함수는 연산을 축적하며, 리스트의 값을 합치거나 곱할 때 유용합니다.

위 코드에서 reduce() 함수는 리스트의 모든 요소를 더해 총합을 반환합니다.

3.4 forEach() 함수

forEach() 함수는 Iterable의 각 요소에 대해 특정 작업을 수행합니다. 다른 함수들과 달리 새로운 Iterable을 반환하지 않고, 단순히 요소들을 순회하며 주어진 작업을 수행합니다.

Iterable<String> names = ['Alice', 'Bob', 'Charlie'];
names.forEach((name) => print('Hello, $name!'));

// Hello, Alice!
// Hello, Bob!
// Hello, Charlie!

3.5 any()와 every() 함수

  • any(): Iterable에 주어진 조건을 만족하는 요소가 하나라도 있는지 확인합니다.
  • every(): Iterable의 모든 요소가 주어진 조건을 만족하는지 확인합니다.
Iterable<int> numbers = [1, 2, 3, 4, 5];

bool hasEven = numbers.any((num) => num.isEven); // true
bool allEven = numbers.every((num) => num.isEven); // false

3.6 fold() 함수

fold() 함수는 reduce() 함수와 비슷하지만, 초기값을 설정할 수 있다는 점이 다릅니다. 초기값을 기반으로 연산을 축적하며, 이 초기값은 연산의 첫 번째 피연산자로 사용됩니다.

Iterable<int> numbers = [1, 2, 3];
int sum = numbers.fold(0, (prev, element) => prev + element);

print(sum); // 6

위 코드에서 fold()는 초기값 0부터 시작하여 모든 요소를 더한 결과를 반환합니다.

4. Iterable과 고차 함수의 활용 예제

Dart에서 Iterable과 고차 함수들을 조합하면 복잡한 로직을 간단하고 우아하게 구현할 수 있습니다. 예를 들어, 다음 코드는 짝수를 제곱하여 리스트로 반환하는 코드입니다.

List<int> numbers = [1, 2, 3, 4, 5, 6];
List<int> result = numbers
    .where((num) => num.isEven)  // 짝수 필터링
    .map((num) => num * num)     // 제곱
    .toList();                   // 리스트로 변환

print(result); // [4, 16, 36]

이 코드는 짧고 직관적이며, Dart의 고차 함수가 얼마나 유용한지 잘 보여줍니다.

5. 결론

Dart의 Iterable과 고차 함수는 코드를 간결하고 효율적으로 작성할 수 있는 강력한 도구입니다. 고차 함수들은 컬렉션을 처리할 때 매우 유용하며, 특히 map, where, reduce와 같은 함수들은 복잡한 로직을 쉽게 구현할 수 있게 해줍니다. Dart의 다양한 컬렉션과 Iterable을 활용하여 더 나은 코드를 작성해보세요!

구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

 

반응형