플러터 강좌: 13.2 컬렉션 타입

안녕하세요! 이번 글에서는 Flutter의 중요한 구성 요소인 컬렉션 타입에 대해 깊이 살펴보겠습니다. Flutter는 강력한 UI 툴킷일 뿐만 아니라, Dart 언어를 기반으로 하고 있습니다. Dart 언어에서 컬렉션 타입은 데이터 구조를 다루는 데 매우 중요한 역할을 합니다. 다양한 형식의 데이터를 효율적으로 처리하고 관리할 수 있도록 도와줍니다.

컬렉션 타입의 기본 개념

컬렉션 타입은 기본적으로 데이터를 그룹화하여 처리하는 방법입니다. Dart에서는 주로 List, Set, Map 의 세 가지 컬렉션 타입을 제공합니다.

  • List: 순서가 있는 데이터의 집합입니다. 중복된 값을 허용하며, 인덱스를 사용해 데이터에 접근합니다.
  • Set: 중복을 허용하지 않는 데이터의 집합입니다. 추가, 삭제 및 검색에 매우 유용합니다.
  • Map: 키-값 쌍으로 이루어진 데이터의 집합입니다. 각 키는 고유하며, 이를 통해 값에 접근합니다.

1. List

List는 데이터의 순서를 유지하면서 여러 데이터를 저장할 수 있는 컬렉션 타입입니다. List는 다음과 같은 방식으로 선언할 수 있습니다:

List numbers = [1, 2, 3, 4, 5];

위의 예제에서는 int 타입의 List를 생성하였습니다. List는 다양한 메서드를 제공하여 데이터를 처리할 수 있습니다. 예를 들어:

  • add(item): 리스트의 끝에 새로운 아이템을 추가합니다.
  • remove(item): 리스트에서 특정 아이템을 제거합니다.
  • contains(item): 리스트에 특정 아이템이 포함되어 있는지 확인합니다.

List에 대해 더 깊이 이해하기 위해 아래의 예를 살펴보겠습니다:


void main() {
    List fruits = ["사과", "바나나", "체리"];
    
    // 아이템 추가
    fruits.add("오렌지");
    
    // 아이템 제거
    fruits.remove("바나나");

    // 리스트 내용 출력
    print(fruits); // 출력: [사과, 체리, 오렌지]
    
    // 특정 아이템 포함 여부 확인
    if (fruits.contains("체리")) {
        print("체리가 리스트에 있습니다.");
    }
}

1.1 List의 반복 처리

List의 각 아이템에 접근하기 위해 반복문을 사용할 수 있습니다:


for (var fruit in fruits) {
    print(fruit);
}

또는 인덱스를 사용하여 직접 접근할 수도 있습니다:


for (int i = 0; i < fruits.length; i++) {
    print(fruits[i]);
}

2. Set

Set은 중복을 허용하지 않는 컬렉션입니다. 중복된 값을 저장하려고 하면 무시됩니다. Set은 다음과 같이 선언할 수 있습니다:

Set colors = {"빨강", "파랑", "초록"};

Set에서도 다양한 메서드를 사용할 수 있습니다:

  • add(item): Set에 아이템을 추가합니다. 중복된 경우에는 무시됩니다.
  • remove(item): Set에서 특정 아이템을 제거합니다.
  • contains(item): Set에 특정 아이템이 포함되어 있는지 확인합니다.

Set을 사용하는 예제는 다음과 같습니다:


void main() {
    Set animals = {"고양이", "개", "새"};
    
    // 아이템 추가
    animals.add("토끼");
    
    // 중복된 아이템 추가 (무시됨)
    animals.add("고양이");

    // Set 내용 출력
    print(animals); // 출력: {고양이, 개, 새, 토끼}
    
    // 특정 아이템 포함 여부 확인
    if (animals.contains("개")) {
        print("개가 Set에 있습니다.");
    }
}

3. Map

Map은 키-값 쌍으로 데이터를 저장하는 컬렉션입니다. 키는 각 값에 대한 고유 식별자 역할을 합니다. Map은 다음과 같이 선언할 수 있습니다:

Map studentGrades = {"홍길동": 85, "김철수": 90};

Map에서도 여러 가지 메서드를 제공하여 데이터를 관리합니다:

  • put(key, value): Map에 새로운 키-값 쌍을 추가합니다.
  • remove(key): 특정 키에 해당하는 아이템을 제거합니다.
  • containsKey(key): Map에 특정 키가 포함되어 있는지 확인합니다.

3.1 Map의 사용 예제

아래는 Map을 사용하는 간단한 예제입니다:


void main() {
    Map studentGrades = {"홍길동": 85, "김철수": 90};
    
    // 새로운 학생 추가
    studentGrades["이영희"] = 95;
    
    // 특정 학생의 성적 출력
    print("이영희의 성적: ${studentGrades["이영희"]}");
    
    // 모든 학생과 성적 출력
    studentGrades.forEach((name, grade) {
        print("$name: $grade");
    });
}

컬렉션 타입의 활용

컬렉션 타입을 활용한 실제 예제를 살펴보겠습니다. 이를 통해 실제 개발 상황에서 어떻게 데이터 구조를 사용할 수 있는지 이해할 수 있습니다.

예제: 사용자 정보 저장

사용자 정보를 저장하는 어플리케이션을 개발한다고 가정해봅시다. 이 경우, List와 Map을 활용할 수 있습니다:


class User {
    String name;
    int age;

    User(this.name, this.age);
}

void main() {
    List users = [];
    
    // 사용자 추가
    users.add(User("홍길동", 25));
    users.add(User("김철수", 30));

    // 사용자 정보 출력
    for (var user in users) {
        print("이름: ${user.name}, 나이: ${user.age}");
    }
    
    // 사용자 이름을 키로 하는 Map 생성
    Map userMap = {for (var user in users) user.name: user};

    // 사용자 검색
    String searchName = "홍길동";
    if (userMap.containsKey(searchName)) {
        User foundUser = userMap[searchName]!;
        print("${foundUser.name}의 나이는 ${foundUser.age}입니다.");
    }
}

6. 결론

이번 강좌에서는 Flutter에서 데이터 구조를 효과적으로 관리할 수 있는 컬렉션 타입인 List, Set, Map에 대해 자세히 살펴보았습니다. 각 컬렉션 타입은 서로 다른 특성을 가지고 있으며, 개발자는 필요한 상황에 따라 적절한 데이터를 선택하여 사용할 수 있습니다. 데이터 관리를 통해 개발자는 더 효율적이고, 유지보수가 쉬운 코드를 작성할 수 있습니다.

추가적으로 컬렉션 타입 사용 시 발생할 수 있는 성능 문제나 메모리 관리에 대한 부분도 신경 써야 합니다. 이런 점들까지 고려하여 나만의 적절한 데이터 구조를 설계하시길 바랍니다. 다음 강좌에서도 깊이 있는 내용을 다루기 위해 노력하겠습니다. 감사합니다!