본문 바로가기
카테고리 없음

Dart에서 Map 함수, where 연산자, spread 연산자 알아보기

by 빛나는개발자 2023. 9. 1.
반응형

Dart에서 제공하는 고급 함수와 연산자들인 map(), where(), 그리고 spread 연산자는 리스트와 배열을 보다 효과적으로 다루기 위해 사용됩니다. 이 연산자들은 코드의 가독성을 높이고, 데이터를 효율적으로 처리할 수 있게 해주는 매우 유용한 도구들입니다. 이 글에서는 각 기능이 어떻게 동작하며, 이를 활용하여 리스트를 어떻게 다룰 수 있는지에 대해 상세히 설명하겠습니다.

1. map() 함수

Dart의 map() 함수는 리스트의 각 요소에 대해 특정 연산을 수행하고, 그 결과로 새로운 리스트를 반환하는 함수입니다. 이 함수는 고차 함수로, 리스트의 모든 요소에 대해 주어진 함수를 적용한 후 그 결과를 새로운 리스트로 반환합니다. 이 과정에서 원래 리스트는 변하지 않고, 변환된 새로운 리스트가 생성됩니다.

사용 방법

map() 함수는 다음과 같이 사용할 수 있습니다:

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

위 코드에서는 numbers 리스트의 각 요소에 대해 number * number 연산을 수행하여, 제곱된 값들을 담은 새로운 리스트 squaredNumbers를 반환합니다. 결과는 [1, 4, 9, 16, 25]입니다. map() 함수는 단순히 리스트의 모든 요소에 대해 특정 변환을 수행하고 싶을 때 매우 유용합니다.

예시

다음은 각 요소에 대해 문자열 변환을 수행하는 예시입니다:

List<int> numbers = [1, 2, 3];
List<String> stringNumbers = numbers.map((number) => 'Number $number').toList();
print(stringNumbers); // ['Number 1', 'Number 2', 'Number 3']

이 예시에서 각 숫자를 'Number '라는 문자열과 결합한 후 새로운 리스트를 반환합니다. 이처럼 map() 함수는 데이터를 변환하는 데 있어 매우 유용한 도구입니다.

장점:

  • 리스트의 요소들을 변환하는 과정에서 코드의 가독성을 높일 수 있습니다.
  • 데이터를 처리할 때 불변성을 유지하면서 새로운 리스트를 생성할 수 있습니다.
  • 다양한 데이터 타입 변환에 쉽게 적용 가능합니다.

단점:

  • 원본 리스트는 수정되지 않기 때문에, 새로운 리스트를 계속해서 생성할 경우 메모리 사용량이 늘어날 수 있습니다.

2. where() 연산자

Dart에서 where() 연산자는 리스트에서 특정 조건을 만족하는 요소만을 필터링하여 반환하는 함수입니다. where() 함수는 리스트의 요소를 순회하면서 조건을 확인하고, 그 조건을 만족하는 요소들로만 구성된 새로운 리스트를 생성합니다.

사용 방법

다음은 where() 함수의 기본 사용 예시입니다:

List<int> numbers = [1, 2, 3, 4, 5];
List<int> evenNumbers = numbers.where((number) => number % 2 == 0).toList();
print(evenNumbers); // [2, 4]

위 코드에서는 numbers 리스트에서 짝수만을 필터링하여 새로운 리스트 evenNumbers를 생성합니다. where() 함수는 조건식이 true를 반환하는 요소들만 선택해 반환합니다. 결과는 [2, 4]입니다.

예시

문자열 리스트에서 특정 길이를 가진 문자열만 필터링하는 예시입니다:

List<String> fruits = ['apple', 'banana', 'kiwi', 'pear'];
List<String> longFruits = fruits.where((fruit) => fruit.length > 4).toList();
print(longFruits); // ['apple', 'banana']

 

이 예시에서는 문자열의 길이가 4보다 큰 요소만 필터링하여 반환합니다. where() 함수는 리스트에서 원하는 조건에 맞는 요소만 선택하고자 할 때 유용합니다.

장점:

  • 리스트에서 조건에 맞는 요소만 간단하게 필터링할 수 있습니다.
  • 새로운 리스트를 반환하므로, 원본 리스트는 변경되지 않습니다.
  • 복잡한 조건을 where() 함수로 쉽게 처리할 수 있습니다.

단점:

  • 조건을 처리하는 데 시간이 많이 걸리는 경우 성능에 영향을 줄 수 있습니다.
  • 새로운 리스트를 생성하기 때문에, 자주 사용할 경우 메모리 소모가 발생할 수 있습니다.

3. spread 연산자

Dart에서 spread 연산자(...)는 하나 이상의 리스트를 다른 리스트 안에 삽입할 때 사용됩니다. 이는 여러 리스트를 하나로 결합하거나, 특정 리스트의 요소를 다른 리스트에 쉽게 삽입하고자 할 때 매우 유용합니다.

사용 방법

spread 연산자는 리스트를 쉽게 결합하는 데 사용할 수 있습니다. 예를 들어, 다음과 같이 두 리스트를 결합할 수 있습니다:

List<int> list1 = [1, 2, 3];
List<int> list2 = [4, 5, 6];
List<int> combined = [...list1, ...list2];
print(combined); // [1, 2, 3, 4, 5, 6]

위 코드에서는 list1과 list2를 결합하여 combined 리스트를 생성했습니다. spread 연산자를 통해 리스트의 요소를 새로운 리스트에 쉽게 삽입할 수 있습니다.

예시

기존 리스트에 추가적인 값을 삽입하는 예시입니다:

List<int> baseNumbers = [1, 2, 3];
List<int> extendedNumbers = [...baseNumbers, 4, 5, 6];
print(extendedNumbers); // [1, 2, 3, 4, 5, 6]

이 예시에서는 baseNumbers 리스트에 추가적인 숫자 4, 5, 6을 결합하여 새로운 리스트를 만들었습니다. 이 방식은 기존 리스트에 데이터를 추가하거나 결합하는 작업을 매우 간편하게 만듭니다.

또한, 조건부로 리스트를 확장할 수도 있습니다. 예를 들어, 특정 조건이 충족될 때만 추가적인 리스트를 삽입할 수 있습니다:

bool shouldAddMore = true;
List<int> numbers = [1, 2, 3];
List<int> finalList = [
  ...numbers,
  if (shouldAddMore) ...[4, 5, 6],
];
print(finalList); // [1, 2, 3, 4, 5, 6]

장점:

  • 여러 리스트를 하나로 결합하는 작업을 간단하게 처리할 수 있습니다.
  • 코드 가독성을 높이며, 리스트를 결합하거나 확장할 때 매우 유용합니다.
  • 조건부 리스트 확장도 가능하여, 동적으로 리스트를 구성할 수 있습니다.

단점:

  • 리스트를 결합하는 작업이 많아질 경우 메모리 사용량이 증가할 수 있습니다.
  • 결합되는 리스트가 커질수록 성능에 영향을 미칠 수 있습니다.

4. 세 가지 기능의 결합 사용

이 세 가지 기능을 결합하여 더 복잡한 작업을 수행할 수 있습니다. 예를 들어, 리스트의 요소를 변환하고, 특정 조건에 따라 필터링한 후, 다른 리스트와 결합할 수 있습니다.

List<int> numbers = [1, 2, 3, 4, 5];
List<int> transformed = numbers.map((number) => number * 2).where((number) => number > 5).toList();
List<int> finalList = [...transformed, 12, 14];
print(finalList); // [6, 8, 10, 12, 14]

위 코드에서는 map() 함수로 각 요소를 2배로 변환한 후, where() 연산자로 5보다 큰 숫자만 필터링했습니다. 마지막으로 spread 연산자를 사용하여 추가적인 값을 결합하여 최종 리스트를 생성했습니다.

결론

Dart의 map() 함수, where() 연산자, 그리고 spread 연산자는 리스트를 변환하고 필터링하며 결합하는 작업을 쉽게 처리할 수 있는 매우 유용한 도구들입니다. 이 세 가지 기능을 잘 이해하고 활용하면, 데이터 처리 및 변환 작업을 간단하게 수행할 수 있으며, 코드를 더욱 효율적이고 가독성 있게 작성할 수 있습니다.

반응형