[Dart 언어강좌] 011. Dart에서 사용되는 콜렉션, List, Set, Map의 사용법

Dart 언어는 강력한 타입 시스템과 함께 매우 뛰어난 콜렉션 라이브러리를 제공합니다.
Dart에서의 콜렉션이란 데이터를 저장하고 조작할 수 있는 객체를 의미합니다.
본 글에서는 List, Set, Map이라는 세 가지 주요 콜렉션에 대해 자세히 알아보고, 다양한 사용법과 예제를 통해 각 콜렉션의 특징을 설명하겠습니다.

1. List

List는 순서가 있는 데이터를 저장하는 콜렉션입니다.
Dart의 List는 배열(array)와 유사하게 동작하지만, 크기가 동적으로 변경될 수 있습니다.
List는 같은 데이터 타입의 객체 뿐만 아니라 다양한 데이터 타입의 객체도 저장할 수 있습니다.

1.1. List 생성

void main() {
    // 빈 리스트 생성
    List<int> numbers = [];
    
    // 초기 값으로 리스트 생성
    List<String> fruits = ['Apple', 'Banana', 'Cherry'];
    
    // 리스트의 크기 지정
    List<double> temperatures = List.filled(5, 0.0);
    
    print(numbers); // []
    print(fruits); // [Apple, Banana, Cherry]
    print(temperatures); // [0.0, 0.0, 0.0, 0.0, 0.0]
}

1.2. List의 주요 메서드

List 객체에는 데이터 조작을 위한 여러 가지 메서드가 있습니다.
몇 가지 주요 메서드와 그 사용 예제를 소개합니다.

void main() {
    List<String> fruits = ['Apple', 'Banana', 'Cherry'];

    // 추가
    fruits.add('Dragonfruit');
    print(fruits); // [Apple, Banana, Cherry, Dragonfruit]

    // 여러 개 추가
    fruits.addAll(['Elderberry', 'Fig']);
    print(fruits); // [Apple, Banana, Cherry, Dragonfruit, Elderberry, Fig]

    // 삭제
    fruits.remove('Banana');
    print(fruits); // [Apple, Cherry, Dragonfruit, Elderberry, Fig]

    // 인덱스 사용
    String firstFruit = fruits[0];
    print(firstFruit); // Apple

    // 길이
    int length = fruits.length;
    print(length); // 5
}

1.3. List의 반복 처리

List에 저장된 데이터에 대한 반복 처리는 for 루프, forEach 메서드를 통해 수행할 수 있습니다.

void main() {
    List<String> fruits = ['Apple', 'Banana', 'Cherry'];

    // for 루프 사용
    for (var fruit in fruits) {
        print(fruit);
    }

    // forEach 메서드 사용
    fruits.forEach((fruit) {
        print(fruit);
    });
}

2. Set

Set은 중복되지 않는 유일한 객체의 모음입니다.
Set 콜렉션은 요소의 순서에 의존하지 않으며, 값의 존재 유무만으로 데이터를 관리합니다.
Dart에서 Set은 추가, 삭제, 포함 여부 확인 등을 빠르게 수행할 수 있습니다.

2.1. Set 생성

void main() {
    // 빈 세트 생성
    Set<int> uniqueNumbers = {};
    
    // 초기 값으로 세트 생성
    Set<String> uniqueFruits = {'Apple', 'Banana', 'Cherry'};
    
    print(uniqueNumbers); // {}
    print(uniqueFruits); // {Apple, Banana, Cherry}
}

2.2. Set의 주요 메서드

Set 객체에도 다양한 메서드가 존재합니다.

void main() {
    Set<String> uniqueFruits = {'Apple', 'Banana', 'Cherry'};

    // 추가
    uniqueFruits.add('Dragonfruit');
    print(uniqueFruits); // {Apple, Banana, Cherry, Dragonfruit}

    // 중복 추가는 무시됨
    uniqueFruits.add('Apple');
    print(uniqueFruits); // {Apple, Banana, Cherry, Dragonfruit}

    // 삭제
    uniqueFruits.remove('Banana');
    print(uniqueFruits); // {Apple, Cherry, Dragonfruit}
    
    // 길이
    int length = uniqueFruits.length;
    print(length); // 3
}

2.3. Set의 반복 처리

Set도 List와 마찬가지로 반복 처리를 지원합니다.

void main() {
    Set<String> uniqueFruits = {'Apple', 'Banana', 'Cherry'};

    // for 루프 사용
    for (var fruit in uniqueFruits) {
        print(fruit);
    }

    // forEach 메서드 사용
    uniqueFruits.forEach((fruit) {
        print(fruit);
    });
}

3. Map

Map은 키와 값의 쌍으로 데이터에 접근하는 유용한 콜렉션입니다.
키는 고유해야 하며, 각각의 키는 하나의 값에만 연결될 수 있습니다.
Map을 사용하면 데이터의 빠른 검색 및 관리를 할 수 있습니다.

3.1. Map 생성

void main() {
    // 빈 맵 생성
    Map<String, int> fruitPrices = {};
    
    // 초기 값으로 맵 생성
    Map<String, String> countryCapitals = {
        'USA': 'Washington D.C.',
        'France': 'Paris',
        'Japan': 'Tokyo',
    };
    
    print(fruitPrices); // {}
    print(countryCapitals); // {USA: Washington D.C., France: Paris, Japan: Tokyo}
}

3.2. Map의 주요 메서드

Map에서도 다양한 메서드를 통해 데이터 조작이 가능합니다.

void main() {
    Map<String, int> fruitPrices = {
        'Apple': 3,
        'Banana': 1,
        'Cherry': 5,
    };

    // 추가
    fruitPrices['Dragonfruit'] = 4;
    print(fruitPrices); // {Apple: 3, Banana: 1, Cherry: 5, Dragonfruit: 4}

    // 수정
    fruitPrices['Banana'] = 2;
    print(fruitPrices); // {Apple: 3, Banana: 2, Cherry: 5, Dragonfruit: 4}

    // 삭제
    fruitPrices.remove('Cherry');
    print(fruitPrices); // {Apple: 3, Banana: 2, Dragonfruit: 4}

    // 키 존재 여부 확인
    bool hasBanana = fruitPrices.containsKey('Banana');
    print(hasBanana); // true

    // 길이
    int length = fruitPrices.length;
    print(length); // 3
}

3.3. Map의 반복 처리

Map의 모든 키와 값에 대한 반복 처리는 다음과 같이 수행할 수 있습니다.

void main() {
    Map<String, int> fruitPrices = {
        'Apple': 3,
        'Banana': 1,
        'Cherry': 5,
    };

    // keys() 메서드로 반복
    for (var key in fruitPrices.keys) {
        print('Fruit: $key, Price: ${fruitPrices[key]}');
    }

    // entries() 메서드로 반복
    fruitPrices.forEach((key, value) {
        print('Fruit: $key, Price: $value');
    });
}

결론

Dart의 List, Set, Map은 각각의 특성과 장점을 가지고 있어 다양한 상황에서 효과적으로 데이터를 관리할 수 있습니다.
List는 순서가 있는 데이터 컬렉션, Set은 고유성을 보장하는 컬렉션, Map은 키-값 쌍으로 데이터를 관리하는 데 적합하다는 점을 이해하는 것이 중요합니다.
이를 통해 다양한 프로그래밍 문제를 해결하고, 깔끔하고 효율적인 코드를 작성할 수 있습니다.