스프레드(...)로 Map,List에 항목추가

pharmDev·2024년 12월 16일

코드 분석: setState와 스프레드 연산자를 사용한 Map 항목 추가

setState(() {
  schedules = {
    ...schedules, // 기존의 모든 키-값 쌍을 유지
    schedule.date: [
      if (schedules.containsKey(schedule.date))
        ...schedules[schedule.date]!, // 기존 리스트 복사
    ]
  };
});

이 코드는 Map<DateTime, List<Schedule>> 타입인 schedules에 새로운 항목을 추가하거나 기존 항목을 업데이트하기 위해 작성되었습니다.
하나씩 분석하며, 스프레드 연산자와 조건문을 활용한 MapList 처리 방법도 설명합니다.

Map에서 스프레드로 항목추가시 key- value 쌍에서 key가 중복되면 value를 덮어씌운다. List에서 스프레드로 항목 추가시, 값 중복이 가능하다. 위 코드에서 if문을 살펴보면 입력받은 date의 key 값과 쌍을 이루는 value값이 list이므로 여기에 스프레드를 통해 값을 추가할때는 기존값이 삭제되는 것을 걱정하지 않아도 괜찮다


1. 주요 구성 요소와 사용 이유

1.1 setState

  • 역할:
    Flutter의 상태(State)를 변경하고, UI를 업데이트하는 함수입니다.
  • 왜 필요한가?
    • schedules라는 상태 변수가 업데이트되었음을 Flutter에 알리고, 변경된 상태에 따라 UI를 다시 렌더링합니다.
  • 사용법:
    setState(() {
      // 상태 변경 코드
    });

1.2 스프레드 연산자 (...)

  • 역할:
    기존 컬렉션(Map, List, Set)을 다른 컬렉션에 복사하거나 확장합니다.
  • 왜 필요한가?
    • 기존 데이터를 덮어쓰지 않고 유지하면서 새로운 데이터를 추가하기 위해 사용됩니다.
  • 사용법:
    List<int> numbers = [1, 2, 3];
    List<int> newNumbers = [...numbers, 4]; // 결과: [1, 2, 3, 4]

1.3 조건부 스프레드 (if와 함께 사용)

  • 역할:
    특정 조건이 참일 때만 데이터를 추가합니다.
  • 왜 필요한가?
    • 조건에 따라 데이터를 선택적으로 추가할 수 있습니다.
  • 사용법:
    List<int> numbers = [1, 2, 3];
    List<int> newNumbers = [
      ...numbers,
      if (numbers.contains(3)) 4 // 3이 포함된 경우에만 4 추가
    ]; // 결과: [1, 2, 3, 4]

1.4 Map과 List 구조

  • schedules 변수의 구조:
    • 키(DateTime) → 날짜.
    • 값(List<Schedule>) → 해당 날짜에 연결된 일정들의 리스트.
    • 예:
      schedules = {
        DateTime(2024, 3, 8): [Schedule1, Schedule2],
      };

2. 코드 분석

schedules = {
  ...schedules, // 기존의 모든 키-값 쌍 복사
  schedule.date: [ // 새로운 키-값 추가 또는 기존 키 업데이트
    if (schedules.containsKey(schedule.date))
      ...schedules[schedule.date]!, // 기존 일정 리스트 복사
  ]
};

2.1 ...schedules

  • 역할:
    기존 schedules의 모든 항목을 새로운 Map에 복사합니다.
    → 기존 데이터를 유지하면서 새로운 데이터를 추가하기 위해 사용.

  • 예시:

    Map<String, int> existingMap = {'a': 1, 'b': 2};
    Map<String, int> newMap = {
      ...existingMap, // 기존 항목 복사
      'c': 3, // 새로운 항목 추가
    };
    print(newMap); // 결과: {'a': 1, 'b': 2, 'c': 3}

2.2 schedule.date

  • 역할:
    schedule.date 키를 기준으로 새로운 항목을 추가하거나, 기존 항목을 업데이트합니다.

  • 키가 이미 존재하는 경우:
    기존 리스트를 유지하면서 새로운 항목을 추가.
    키가 존재하지 않는 경우:
    새로운 키와 값을 생성.


2.3 if (schedules.containsKey(schedule.date))

  • 역할:
    해당 날짜(schedule.date)에 이미 일정이 있는지 확인.

  • 조건이 참인 경우:
    기존 리스트를 복사하여 새로운 리스트에 포함.

  • 조건이 거짓인 경우:
    빈 리스트가 생성됩니다.


2.4 ...schedules[schedule.date]!

  • 역할:
    기존의 일정 리스트를 새로운 리스트에 복사합니다.

  • 예시:

    List<int> existingList = [1, 2, 3];
    List<int> newList = [
      ...existingList, // 기존 항목 복사
      4 // 새로운 항목 추가
    ];
    print(newList); // 결과: [1, 2, 3, 4]

3. Map에 항목 추가 (스프레드 연산자 활용)

사용법

Map<String, int> existingMap = {'a': 1, 'b': 2};
Map<String, int> updatedMap = {
  ...existingMap, // 기존 항목 복사
  'c': 3 // 새로운 항목 추가
};
print(updatedMap); // 결과: {'a': 1, 'b': 2, 'c': 3}

코드에서 Map 추가

schedules = {
  ...schedules, // 기존 항목 유지
  schedule.date: [ // 새로운 날짜의 리스트 추가
    if (schedules.containsKey(schedule.date))
      ...schedules[schedule.date]!, // 기존 리스트 복사
  ]
};

4. List에 항목 추가 (스프레드 연산자 활용)

사용법

List<int> existingList = [1, 2, 3];
List<int> updatedList = [
  ...existingList, // 기존 리스트 복사
  4, // 새로운 항목 추가
];
print(updatedList); // 결과: [1, 2, 3, 4]

5. Map과 List의 차이

항목MapList
구조키-값 쌍 (예: {'key': value})순차적 값 (예: [value1, value2])
중복키는 중복 불가, 값은 중복 가능값 중복 가능
추가 방식키를 지정해 추가순차적으로 추가
스프레드 사용기존 키-값 쌍 유지, 새로운 키 추가기존 리스트 복사, 새로운 값 추가

6. 최종 요약

Flutter 코드에서 스프레드 연산자를 활용하면 데이터를 간결하게 추가 및 확장할 수 있습니다.
위 코드는 기존의 schedules 데이터를 유지하면서 새로운 일정을 안전하게 추가하거나 업데이트하는 방법을 보여줍니다.

setState(() {
  schedules = {
    ...schedules,
    schedule.date: [
      if (schedules.containsKey(schedule.date))
        ...schedules[schedule.date]!,
      schedule // 새로운 일정 추가, 
    ]
  };
});
profile
코딩을 배우는 초보

0개의 댓글