Dart에서 map내부의 print가 작동되는 시점
void main() {
const list = ['apples', 'bananas', 'oranges'];
// map 함수를 사용하되, toList를 호출하지 않음
var mappedList = list.map((item) {
print('$item: ${item.length}');
return item.toUpperCase();
});
// 이 시점에서는 아직 print 구문이 실행되지 않음
// toList를 호출하여 변환을 실제로 수행
var finalList = mappedList.toList();
// 이제 변환이 수행되었으므로 print 구문이 실행됨
print(finalList);
}
.toList()를 사용하니 내부의 print가 작동한 이유는 map 함수 자체가 lazy evaluation(지연 평가)을 사용하기 때문입니다. 즉, map 함수는 변환을 정의하지만 실제로 변환을 수행하지 않습니다. 변환된 리스트에 접근하거나 toList()와 같은 메서드를 호출하여 변환을 명시적으로 요구할 때 변환이 실제로 실행됩니다.
좀 더 자세히 설명하면:
- map 함수는 Iterable을 반환하는데, 이 Iterable은 실제로 변환 작업을 수행하지 않습니다. 대신, 필요할 때마다 변환을 수행할 준비가 된 '게으른' Iterable을 반환합니다.
- toList()를 호출하면, 이 게으른 Iterable이 실제로 평가되고 변환 작업이 수행되므로, print 구문이 실행됩니다.
즉, toList()를 호출하면 map 함수가 정의된 변환 작업이 즉시 수행되고, 그 과정에서 print 함수도 실행됩니다.
이 코드에서 mappedList는 지연 평가된 Iterable을 반환합니다. toList()를 호출하기 전까지는 변환 작업이 수행되지 않으므로 print 구문이 실행되지 않습니다. 하지만 toList()를 호출하면 변환이 실제로 수행되고 print 구문이 실행됩니다.
이러한 특성은 메모리 효율성을 높이기 위해 사용됩니다. 큰 데이터셋을 변환할 때 지연 평가를 통해 필요할 때만 변환을 수행하여 메모리 사용을 최적화할 수 있습니다.