Dart에서 컬렉션 마스터하기: List, Set, Map 완벽 가이드

2024. 6. 25. 17:02Flutter/Dart Language

반응형

 

플러터는 다양한 데이터 구조를 다루기 위한 강력한 컬렉션 라이브러리를 제공합니다.

이 가이드에서는 플러터에서 가장 많이 사용되는 세 가지 컬렉션인 List, Set, Map에 대해 심층적으로 살펴보고, 각 컬렉션의 특징, 사용법, 장점과 단점을 비교 분석합니다.

또한, 실제 개발에서 활용 가능한 다양한 예시 코드와 함께 컬렉션 관련 팁과 최고의 관행을 소개합니다.

 

1. List: 순서 있는 데이터 집합

  • 특징
    • 순서가 있는 데이터를 저장합니다.
    • 중복된 값을 허용합니다.
    • 다양한 데이터 타입을 저장할 수 있습니다.
    • 인덱싱을 사용하여 원하는 요소에 직접 접근할 수 있습니다.
  • 사용법
    List<String> names = ["Alice", "Bob", "Charlie"];
    print(names[0]); // 출력: Alice
    
     
  • 장점
    • 순서가 중요한 데이터를 저장하는 데 적합합니다.
    • 인덱싱을 사용하여 원하는 요소에 빠르게 접근할 수 있습니다.
  • 단점
    • Set과 Map에 비해 검색 속도가 느릴 수 있습니다.
    • 중복된 값을 허용하기 때문에 데이터 관리가 복잡해질 수 있습니다.

2. Set: 고유한 값만 저장하는 집합

  • 특징
    • 모든 값이 고유해야 합니다.
    • 순서는 유지되지 않습니다.
    • 중복된 값을 자동으로 제거합니다.
  • 사용법
    Set<String> fruits = {"apple", "banana", "orange"};
    fruits.add("grape"); // 중복된 값이 아니므로 추가됩니다.
    print(fruits.contains("apple")); // 출력: true
    
     
  • 장점
    • 고유한 값만 저장해야 하는 경우 유용합니다.
    • 중복된 값을 자동으로 제거하여 데이터 관리가 용이합니다.
  • 단점
    • 인덱싱을 사용하여 원하는 요소에 직접 접근할 수 없습니다.
    • 순서가 유지되지 않기 때문에 순서가 중요한 데이터에는 적합하지 않습니다.

3. Map: 키-값 쌍으로 구성된 데이터 구조

  • 특징
    • 키-값 쌍으로 데이터를 저장합니다.
    • 키는 고유해야 하며, 값은 다양한 데이터 타입을 가질 수 있습니다.
    • 키를 사용하여 원하는 값에 직접 접근할 수 있습니다.
  • 사용법
    Map<String, String> countries = {"KR": "Korea", "US": "United States", "JP": "Japan"};
    print(countries["KR"]); // 출력: Korea
    countries["CN"] = "China"; // 새로운 키-값 쌍 추가
    
     
  • 장점
    • 키-값 쌍으로 구성된 데이터를 효율적으로 저장하고 관리할 수 있습니다.
    • 키를 사용하여 원하는 값에 빠르게 접근할 수 있습니다.
  • 단점
    • 순서가 유지되지 않습니다.
    • List에 비해 메모리 사용량이 더 많을 수 있습니다.

4. 컬렉션 관련 팁과 최고의 관행

  • 적절한 컬렉션 선택: 문제 해결에 가장 적합한 컬렉션을 선택하는 것이 중요합니다. 순서가 중요한 데이터는 List, 고유한 값만 저장해야 하는 경우는 Set, 키-값 쌍으로 구성된 데이터는 Map을 사용하는 것이 좋습니다.
  • 컬렉션 크기 최적화: 불필요한 메모리 사용을 줄이기 위해 컬렉션 크기를 최적화하는 것이 중요합니다. 예를 들어, List의 경우 필요 없는 요소는 제거하고, Set의 경우 이미 존재하는 값을 추가하지 않도록 합니다.
  • 불변성 사용: 컬렉션을 불변으로 만들면 데이터 변경으로 인한 예상치 못한 오류를 방지할 수 있습니다.
  • null 처리: 컬렉션에서 null 값을 처리할 때 주의가 필요합니다. null 값을 허용하지 않는 경우, 요소를 추가하기 전에 null인지 확인해야 합니다. 또한, null 값을 처리하기 위한 코드를 작성해야 할 수도 있습니다.
  • 코드 가독성 향상: 컬렉션을 사용할 때 명확하고 간결한 코드를 작성하는 것이 중요합니다. 변수 이름, 함수 이름, 주석을 사용하여 코드를 명확하게 표현하고, 복잡한 코드는 작은 함수로 나누는 것이 좋습니다.

5. 실제 개발에서 활용 가능한 예시 코드

  • List를 사용한 동물 목록 관리
class Animal {
  String name;
  int age;

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

void main() {
  List<Animal> animals = [
    Animal("dog", 3),
    Animal("cat", 2),
    Animal("rabbit", 1),
  ];

  // animals 리스트에 새 동물 추가
  animals.add(Animal("hamster", 0.5));

  // animals 리스트에서 특정 동물 찾기
  Animal? foundAnimal = animals.firstWhere((animal) => animal.name == "rabbit");
  if (foundAnimal != null) {
    print("${foundAnimal.name}의 나이는 ${foundAnimal.age}살입니다.");
  } else {
    print("찾을 수 없는 동물입니다.");
  }
}
 
  • Set을 사용한 고유한 사용자 ID 목록 관리
void main() {
  Set<String> userIds = {"user123", "user456", "user789"};

  // 특정 사용자 ID가 존재하는지 확인
  bool isUserExist = userIds.contains("user456");
  print("사용자 ID 'user456' 존재 여부: $isUserExist");

  // 새로운 사용자 ID 추가
  userIds.add("user000");

  // 중복된 사용자 ID 추가 시 에러 발생
  userIds.add("user123"); // 중복된 값이므로 에러 발생
}
 
  • Map을 사용한 개인 정보 저장
void main() {
  Map<String, String> userInfo = {
    "name": "John Doe",
    "age": "30",
    "email": "johndoe@example.com",
  };

  // 특정 정보 접근
  String name = userInfo["name"];
  print("이름: $name");

  // 새로운 정보 추가
  userInfo["address"] = "Seoul, Korea";

  // 정보 변경
  userInfo["age"] = "31";
}
 

6. 맺음말

 

플러터에서 제공하는 컬렉션은 다양한 데이터를 효율적으로 관리하고 사용하는 데 매우 유용한 도구입니다.

List, Set, Map의 특징과 사용법을 이해하고, 적절한 컬렉션을 선택하며, 팁과 최고의 관행을 따르면 플러터 앱 개발에서 컬렉션을 효과적으로 활용할 수 있을 것입니다.

반응형