develop/Flutter

Dart에서 `toList()`와 `toMap()` 사용법, 응용 하기

방뎁 2024. 11. 12. 22:31

Dart에서 toList()toMap() 메서드는

리스트와 맵 자료구조 간의 변환을 쉽게 할 수 있게 해주는 유용한 도구입니다.


이들은 데이터 구조를 필요에 따라 변경하고,
각 상황에 맞는 기능을 활용할 수 있도록 도와줍니다.
toList()toMap() 메서드의 기본 사용법부터 고급 활용법을 알아보겠습니다.

 

1. toList() 메서드: 리스트로 변환하기

toList() 메서드는 Dart의 다양한 컬렉션 타입을 List로 변환합니다.
주로 Set이나 Iterable 타입을 List로 바꿀 때 사용되며,
모든 요소를 포함하는 새로운 리스트를 생성하여 반환합니다.

1.1 toList() 기본 예제

void main() { 
    Set<String> fruits = {'Apple', 'Banana', 'Orange'}; // Set을 List로 변환 
    List<String> fruitList = fruits.toList(); 

    print(fruitList);  // 출력: [Apple, Banana, Orange] 
} 

이 예제에서는 Set 타입의 fruitstoList()를 사용하여

List 타입의 fruitList로 변환합니다.


결과적으로 fruitList

['Apple', 'Banana', 'Orange']라는 리스트가 됩니다.

 

1.2 Map에서 toList() 사용하기

Map에서 toList()를 사용하려면
keysvalues 속성을 통해 키나 값을 먼저 추출한 후
리스트로 변환해야 합니다.

void main() { 
    Map<String, int> scores = {'John': 90, 'Emma': 85, 'Alex': 88};     // Map의 키들을 List로 변환 
    List<String> keys = scores.keys.toList(); // Map의 값들을 List로 변환 
    List<int> values = scores.values.toList(); 
    print(keys); // 출력: [John, Emma, Alex] 
    print(values); // 출력: [90, 85, 88] 
} 

 

1.3 toList() 고급 활용: 필터링 후 리스트로 변환하기

where 메서드와 toList()를 함께 사용하면
필터링된 요소들만 리스트로 변환할 수 있습니다.
이는 특정 조건을 만족하는 데이터만 선별하여 리스트로 저장할 때 유용합니다.

void main() { 
    List<int> numbers = [1, 2, 3, 4, 5, 6]; // 짝수만 추출하여 List로 변환 
    List<int> evenNumbers = numbers.where((num) => num % 2 == 0).toList(); 
    print(evenNumbers); // 출력: [2, 4, 6] 
} 

이 예제에서는 numbers 리스트에서 짝수만 추출하고

toList()를 이용해 새로운 리스트로 변환합니다.


이렇게 하면 필터링된 리스트를 다른 작업에 즉시 활용할 수 있습니다.

 

2. toMap() 메서드: 맵으로 변환하기

toMap()은 리스트나 다른 형태의 컬렉션을 Map으로 변환하는 데 사용됩니다.
Dart에서 기본적으로 제공하는 메서드는 아니지만,
주로 리스트를 맵으로 변환할 때 특정 조건이나 규칙에 따라 사용자 정의 함수로 구현합니다.

 

2.1 리스트를 Map으로 변환하는 기본 예제

리스트의 각 요소를 인덱스를 키로,

요소 자체를 값으로 사용하여 Map으로 변환할 수 있습니다.

void main() { 
    List<String> names = ['John', 'Emma', 'Alex']; 
    Map<int, String> nameMap = {for (var i = 0; i < names.length; i++) i: names[i]}; 
    print(nameMap); // {0: John, 1: Emma, 2: Alex} 
} 

 

이 예제에서는 for 루프를 사용하여 names 리스트를 Map으로 변환합니다.
각 키는 리스트의 인덱스를, 값은 해당 인덱스의 요소를 나타냅니다.

 

2.2 MapEntry를 사용한 리스트 변환

Dart에서는 MapEntry 클래스를 활용하여 리스트 요소를 맵으로 변환할 수 있습니다.

void main() { 
    List<String> fruits = ['Apple', 'Banana', 'Orange']; 
    Map<String, int> fruitMap = {for (var fruit in fruits) fruit: fruit.length}; 
    print(fruitMap); // {Apple: 5, Banana: 6, Orange: 6} 
} 

이 예제에서는 각 과일 이름을 키로, 이름의 길이를 값으로 하는 맵을 생성합니다.
MapEntry를 사용하면 변환 규칙을 쉽게 적용할 수 있습니다.

2.3 리스트를 특정 규칙에 따라 Map으로 변환하는 고급 예제

복잡한 데이터를 특정 규칙에 따라 Map으로 변환할 수 있습니다.
예를 들어, 사용자 정보를 담은 리스트를 사용자 ID를 키로,
사용자 이름을 값으로 가지는 맵으로 변환할 수 있습니다.

class User { 
    final int id; 
    final String name; 
    User(this.id, this.name); 
}

void main() { 
    List<User> users = [ User(1, 'John'), User(2, 'Emma'), User(3, 'Alex') ]; 
    Map<int, String> userMap = {for (var user in users) user.id: user.name}; 
    print(userMap); // {1: John, 2: Emma, 3: Alex} 
} 

이 예제에서는 User 클래스의 인스턴스 리스트를 id를 키로,

name을 값으로 하는 맵으로 변환합니다.

이 방법을 사용하면 특정 객체의 필드를

키로 지정하여 Map을 쉽게 생성할 수 있습니다.

 

3. toList()toMap()을 활용한 응용 예제

toList()toMap()을 사용하여

데이터를 구조화하고, 필터링하며, 변환하는 복합 예제입니다.

 

3.1 상품 데이터 변환 예제

상품 리스트에서 재고가 있는 상품만 필터링하고,
상품 이름을 키로, 가격을 값으로 가지는 맵으로 변환해보겠습니다.

class Product { 
    final String name; 
    final double price; 
    final bool inStock; 
    Product(this.name, this.price, this.inStock); 
} 
void main() { 
    List<Product> products = [ Product('Laptop', 1500, true), 
                                Product('Phone', 800, false), 
                                Product('Tablet', 600, true) ]; // 재고가 있는 상품만 필터링하여 Map으로 변환
    Map<String, double> availableProducts = {
        for (var product in products.where((p) => p.inStock)) product.name: product.price
    };

    print(availableProducts); // {Laptop: 1500, Tablet: 600}
}

이 예제에서는 where 메서드를 활용하여

inStocktrue인 상품만을 선별하고,

이를 맵 형태로 변환합니다.

 

이러한 방식을 통해 재고가 있는 상품의 이름과 가격으로

구성된 맵을 손쉽게 생성할 수 있습니다.

 


결론

toList()toMap() 메서드는 데이터 변환을 간편하게 해주는 강력한 도구입니다.

단순히 컬렉션을 다른 형태로 바꾸는 것을 넘어서,

특정 조건에 따라 데이터를 필터링하거나 가공하여 활용할 수 있는 유연성을 제공합니다.