List

A tour of the Dart language 페이지를 공부하면서 정리한 내용입니다.

Dart에서는 배열은 List 타입으로 제공됩니다. 리스트 리터럴은 JavaScript의 배열과 유사항 방식으로 생성합니다. 아래 코드에서 list의 타입은 List<int> 타입으로 추론됩니다. List<int> 타입에 다른 타입을 추가하려고 시도하면 컴파잁 타임 또는 런타임 오류가 발생합니다. 보다 자세한 내용은 여기를 참고해주세요.

Dart 컬렉션 리터럴의 마지막 항목 뒤에 쉼표(,)를 추가할 수 있습니다. 후행 쉼표(Trailing comma)는 컬렉션에 영향을 미치지 않지만, 복사-붙여넣기 시 오류를 방지할 수 있습니다. List 리터럴 앞에 const 키워드를 붙이면 컴파일 타임 상수로 선언할 수 있습니다.

void main() {
  // List<int> type
  var list1 = [1, 2, 3];
  
  list1.add(4);

  // Error: The argument type 'String' can't be assigned to the parameter type 'int'.
  // list1.add("String");

  var list2 = [
    'Car',
    'Boat',
    'Plane', // 리스트 요소 끝내 콤마를 추가할 수 있습니다.
  ];
  
  var constantList = const [1, 2, 3];
  // Error: Unsupported operation: indexed set
  // constantList[1] = 1;
}

List 객체의 인덱스는 0부터 시작하고 list.length - 1은 마지막 인덱스입니다. length 속성을 이용해 리스트의 길이를 알 수 있으며, 인덱스를 이용해 리스트 값을 참조할 수 있습니다.

void main() {
  var list = [1, 2, 3];
  assert(list.length == 3);
  assert(list[1] == 2);

  list[1] = 1;
  assert(list[1] == 1);
}

Dart 2.3부터 전개 연산자(Spread operator, ...)와 Null-aware 전개 연산자(...?)를 도입하여 여러 값을 컬렉션에 삽입하는 편리한 방법을 제공하기 시작했습니다. 보다 자세한 내용은 여기를 참고해주세요.

void main() {
  // list2에 list의 각 항목을 추가합니다.
  var list = [1, 2, 3];
  var list2 = [0, ...list];
  assert(list2.length == 4);

  List<int>? list3 = nullableList();
  
  // list3이 null이 아닌 경우에만 list3의 항목을 전개합니다.
  var list4 = [0, ...?list3];
  assert(list4.length == 1);
}

List<int>? nullableList() => null;

Dart는 조건부와 반복을 사용하여 컬렉션을 생성할 수 있도록 해주는 collection ifcollection for를 제공합니다.

  • collection if : 조건식을 평가하여 true인 경우 표현식을 평가하여 컬렉션에 항목을 추가합니다.

  • collection for : 루프를 순회하며 표현식을 평하여 컬렉션에 항목을 추가합니다.

collection if와 for에 대한 자세한 내용은 여기를 참고해주세요. 제네릭컬렉션에 대한 자세한 내용은 링를 참고해주세요.

void main() {
  // promoActive가 true 일때 리스트에 'Outlet'을 추가합니다.
  bool promoActive = true;
  var nav = ['Home', 'Furniture', 'Plants', if (promoActive) 'Outlet'];
  print(nav);

  // listOfInts의 각 요소를 순회하면서 우측 표현식을 평가하여 리스트에 항목을 추가합니다.
  var listOfInts = [1, 2, 3];
  var listOfStrings = ['#0', for (var i in listOfInts) '#$i'];
  print(listOfStrings);
}

<출력결과>
[Home, Furniture, Plants, Outlet]
[#0, #1, #2, #3]

List 타입은 다양한 속성과 메서드를 제공하고 있습니다.

void main() {
  var list = <String>["Gump", "Bob", "Edgar"];
  print("List: $list");
  print("타입: ${list.runtimeType}, 항목수: ${list.length}");
  print("첫번째 아이템: ${list.first}, 마지막 아이템: ${list.last}");
  print("빈 List 확인: ${list.isEmpty}, 아이템이 하나 이상 존재하는지 확인: ${list.isNotEmpty}");

  list.add("Owen");
  print("List: $list");

  list.addAll(["Binary", "Johnny"]);
  print("List: $list");
  print("List 줄단위 출력:");
  list.forEach(print);

  list.sort();
  print("List 정렬: $list");
  print("List 역순: ${list.reversed}");

  list.shuffle();
  print("List 셔플: $list");

  print("알파벳 B로 시작하는 이름 존재 확인: ${list.any((item) => item.startsWith("B"))}");
  print("알파벳 B로 시작하는 이름 찾기: ${list.where((item) => item.startsWith("B"))}");
  print("Bob 존재 확인: ${list.contains("Bob")}");
  print("Bob 인덱스 확인: ${list.indexOf("Bob")}");

  var dynamicList = <dynamic>[...list];
  print("String List로 변환: ${dynamicList.cast<String>()}");

  list.add("Gump");
  print("Map으로 변환: ${list.asMap()}");
  print("Set으로 변환: ${list.toSet()}");

  list.remove("Gump");
  print("List: $list");

  list.removeAt(1);
  print("List: $list");

  list.removeRange(1, 3);
  print("List: $list");

  list.clear();
  print("빈 List 확인: ${list.isEmpty}, 아이템이 하나 이상 존재하는지 확인: ${list.isNotEmpty}");
}

Last updated