Dart는 강력한 컬렉션 라이브러리를 제공하며, 특히 List에서 다양한 함수들을 활용할 수 있습니다. 그중에서도 where() 함수는 리스트에서 특정 조건을 만족하는 요소만 필터링하는 데 유용한 기능입니다. 이 글에서는 where() 함수의 사용법과 다양한 예제, 그리고 성능 최적화 방법을 소개하겠습니다.
1. where() 함수란?
where() 함수는 Dart의 List에서 제공하는 메서드로, 특정 조건을 만족하는 요소만 필터링하여 새로운 Iterable을 반환합니다.
2. 기본 사용 예제
void main() {
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// 짝수만 필터링
Iterable<int> evenNumbers = numbers.where((number) => number % 2 == 0);
print(evenNumbers.toList()); // [2, 4, 6, 8, 10]
}
위 코드에서는 where() 함수를 사용하여 짝수만 필터링했습니다.
3. 문자열 리스트 필터링 예제
void main() {
List<String> fruits = ['apple', 'banana', 'cherry', 'blueberry'];
// 'b'로 시작하는 과일 필터링
Iterable<String> filteredFruits = fruits.where((fruit) => fruit.startsWith('b'));
print(filteredFruits.toList()); // ['banana', 'blueberry']
}
where() 함수를 활용하면 문자열 리스트에서도 원하는 조건의 데이터를 쉽게 추출할 수 있습니다.
4. where() 함수의 성능 고려 사항
where() 함수는 지연 평가(lazy evaluation) 방식을 사용합니다. 즉, where() 함수는 리스트를 바로 필터링하지 않고, 데이터가 실제로 필요할 때 필터링을 수행합니다. 마치 필터링할 준비는 해두지만, 실제로 언제 필터링할지는 나중에 결정하는 구조라고 이해하면 됩니다!
따라서 .toList()를 호출해야 최종 리스트를 얻을 수 있습니다.
왜 지연 평가를 사용할까?
- 메모리 절약: 필요한 순간에만 데이터를 처리하므로, 불필요한 연산을 줄일 수 있음.
- 성능 최적화: 모든 데이터를 한꺼번에 처리하는 것이 아니라, 실제로 필요할 때 평가하기 때문에 속도가 향상됨.
void main() {
List<int> numbers = [1, 2, 3, 4, 5];
var result = numbers.where((n) {
print('Evaluating $n');
return n > 2;
});
print('--- Filtering done ---');
print(result.toList());
}
출력 결과는 다음과 같습니다.
--- Filtering done ---
Evaluating 1
Evaluating 2
Evaluating 3
Evaluating 4
Evaluating 5
[3, 4, 5]
리스트를 사용하기 전까지 where() 함수가 실행되지 않는 것을 알 수 있습니다.
5. map()과 함께 활용하기
where() 함수와 map() 함수를 함께 사용하면 필터링 후 데이터를 변환할 수 있습니다.
void main() {
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var squaredEvenNumbers = numbers.where((n) => n % 2 == 0).map((n) => n * n);
print(squaredEvenNumbers.toList()); // [4, 16, 36, 64, 100]
}
6. 결론
Dart의 where() 함수는 리스트에서 특정 조건을 만족하는 요소만 필터링하는 데 매우 유용합니다. 지연 평가 방식으로 동작하므로 최적의 성능을 유지할 수 있으며, map() 등 다른 함수와 조합하면 더욱 강력하게 활용할 수 있습니다.
여러분도 where() 함수를 활용하여 데이터를 효율적으로 필터링해 보세요! 😊