Map에 항목을 추가하는 2가지 방법 (스프레드를 사용해서)

pharmDev·2024년 12월 17일

두 코드의 역할은 같지만, 첫 번째 코드가 더 안전하고 직관적입니다. 반면 두 번째 코드는 일부 문제를 일으킬 수 있습니다. 차이점과 문제점을 상세하게 설명드릴게요.


첫 번째 코드 분석

final dateExists = schedules.containsKey(schedule.date);

final List<Schedule> existingSchedules =
    dateExists ? schedules[schedule.date]! : [];

existingSchedules.add(schedule);

setState(() {
  schedules = {
    ...schedules,
    schedule.date: existingSchedules,
  };
});

동작 원리

  1. dateExists 확인

    • schedules.containsKey(schedule.date)를 사용해 해당 날짜에 이미 일정이 있는지 확인합니다.
    • true인 경우: schedules[schedule.date]!를 가져옵니다 (이미 존재하는 리스트).
    • false인 경우: 빈 리스트 []를 사용합니다.
  2. 리스트에 일정 추가

    • existingSchedules.add(schedule);를 통해 일정 리스트에 새로운 일정을 추가합니다.
  3. 스프레드 연산자(...)를 사용해 기존 Map 유지

    • ...schedules는 기존의 schedules Map에 있는 모든 키-값 쌍을 복사합니다.
    • schedule.date: existingSchedules를 통해 해당 날짜에 새 리스트를 추가 또는 업데이트합니다.

중요한 부분: 기존 항목은 지워지지 않나?

  • 안 지워집니다.
    • 스프레드 연산자 ...를 사용하면 기존의 Map 내용이 그대로 복사됩니다.
    • 특정 키(여기서는 schedule.date)의 값만 업데이트됩니다.

두 번째 코드 분석

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

문제점: 추가할 일정이 누락됨

  1. 목적

    • 기존의 일정 리스트가 있으면 복사(...schedules[schedule.date]!)해서 유지하려고 합니다.
  2. 문제

    • 이 코드에는 새로 추가할 일정(schedule)을 넣는 코드가 없습니다.
    • 즉, 기존 일정을 복사한 리스트만 다시 schedules에 저장됩니다.

결과

  • schedule이 추가되지 않고 기존 일정만 유지됩니다.
    새로운 일정이 들어가지 않는 문제가 발생합니다.

두 코드 비교 정리

구분첫 번째 코드두 번째 코드
역할기존 일정을 유지하면서 새 일정 추가기존 일정만 복사(새로운 일정 추가 안 됨)
기존 항목 유지기존 항목을 유지하고 새 항목 추가기존 항목은 유지하지만 새 항목을 추가 안 함
문제 발생 여부문제 없음새로운 일정이 누락됨

올바른 코드 (첫 번째 코드 기준)

새로운 일정을 추가하면서 기존 일정도 유지하려면 첫 번째 코드처럼 작성해야 합니다:

final dateExists = schedules.containsKey(schedule.date);

final List<Schedule> existingSchedules =
    dateExists ? schedules[schedule.date]! : []; // 기존 리스트 또는 빈 리스트 가져오기

existingSchedules.add(schedule); // 새로운 일정 추가

setState(() {
  schedules = {
    ...schedules, // 기존 맵 복사
    schedule.date: existingSchedules, // 해당 날짜의 리스트 업데이트
  };
});

결론

  • 첫 번째 코드: 올바르게 동작하며 기존 일정을 유지하면서 새로운 일정을 추가합니다.
  • 두 번째 코드: 새 일정이 추가되지 않는 문제가 있습니다. 해당 코드는 수정이 필요합니다.
    만약 두 번째 코드에 새 일정을 추가하고 싶다면 이렇게 수정해야 합니다:
setState(() {
  schedules = {
    ...schedules,
    schedule.date: [
      if (schedules.containsKey(schedule.date))
        ...schedules[schedule.date]!, // 기존 리스트 복사
      schedule, // 새로운 일정 추가
    ],
  };
});

이제 기존 일정도 유지되고 새로운 일정도 추가됩니다! 😊

profile
코딩을 배우는 초보

0개의 댓글