> For the complete documentation index, see [llms.txt](https://gump.gitbook.io/a-tour-of-the-dart-language/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://gump.gitbook.io/a-tour-of-the-dart-language/built-in-types/sets.md).

# Set

> [A tour of the Dart language](https://dart.dev/guides/language/language-tour) 페이지를 공부하면서 정리한 내용입니다.

**집합**은 정렬되지 않은 고유한 항목들로 이루어진 컬렉션입니다. <mark style="color:green;">`Set`</mark> 타입을 통해 제공되며 <mark style="color:green;">`{...}`</mark> 표현식으로 리터럴을 지원합니다.  아래 코드에서 <mark style="color:green;">`halogens`</mark> 변수는 <mark style="color:green;">`Set<String>`</mark> 타입으로 추론됩니다. <mark style="color:green;">`Set`</mark>에 다른 타입을 추가할 경우 컴파일 타임 또는 런타임 오류가 발생합니다. 타입 인수를 <mark style="color:green;">`{}`</mark>앞에 사용하거나 <mark style="color:green;">`Set`</mark> 변수에 할당하면 빈 <mark style="color:green;">`Set`</mark>을 생성합니다.

```dart
void main() {
  var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};

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

  var names = <String>{};
  // 위와 동일한 표현식입니다.
  // Set<String> names = {};

  // 타입 어노테이션 없이 {}만 사용하면 Map 객체가 생성됩니다.
  var empty = {};
  print(empty.runtimeType);
}

```

{% embed url="<https://dartpad.dev/?id=d152c2d66f7e90e2769fd0519bd38afb>" %}

<mark style="color:green;">`Map`</mark> 리터럴 표현식은 <mark style="color:green;">`Set`</mark> 리터럴과 문법이 유사합니다. <mark style="color:green;">`Map`</mark> 리터럴이 더 먼저 지원되기 시작해서 <mark style="color:green;">`{}`</mark>의 기본 타은 <mark style="color:green;">`Map`</mark>입니다. <mark style="color:green;">`{}`</mark> 리터럴 사용 시 타입 어노테이션이 타입 인수를 선언하지 않으면 <mark style="color:green;">`Map<dynamic, dynamic>`</mark> 타입의 객체가 생성됩니다.

<mark style="color:green;">`Set`</mark>에 항목을 추가할 때는 <mark style="color:green;">`add()`</mark> 또는 <mark style="color:green;">`addAll()`</mark> 메서드 사용합니다. 또한 <mark style="color:green;">`length`</mark> 속성을 이용하여 항목의 수를 구합니다.

```dart
void main() {
  var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
  var elements = <String>{};
  elements.add('fluorine');
  elements.addAll(halogens);
  assert(elements.length == 5);
}
```

{% embed url="<https://dartpad.dev/?id=bf4b46ec86d9d5cbb824aba208bcbda9>" %}

<mark style="color:green;">`Set`</mark> 리터럴 앞에 <mark style="color:green;">`const`</mark> 키워드를 붙이면 컴파일 타임 상수로 선언할 수 있습니다. <mark style="color:green;">`Set`</mark> 타입도 <mark style="color:green;">`List`</mark> 타입과 같이 **전개 연산자**와 **collection if, for**를 사용할 수 있습니다.

```dart
void main() {
  final constantSet = const {
    'fluorine',
    'chlorine',
    'bromine',
    'iodine',
  };

  // Unsupported operation: Cannot change an unmodifiable set
  constantSet.add("astatine");

  Set<int> set = {for (int i = 0; i < 5; i++) i};
  print(set);
}

```

{% embed url="<https://dartpad.dev/?id=a4b7b52c2c5e9b4c8f44612833094659>" %}

<mark style="color:green;">`Set`</mark> 타입은 다양한 속성과 메서드를 제공하고 있습니다.

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

  set.add("Owen");
  print("Set: $set");

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

  set.add("Gump");
  print("Set: $set");

  print("알파벳 B로 시작하는 이름 존재 확인: ${set.any((item) => item.startsWith("B"))}");
  print("알파벳 B로 시작하는 이름 찾기: ${set.where((item) => item.startsWith("B"))}");
  print("Bob 존재 확인: ${set.contains("Bob")}");
  print("Bob, Binary 존재 확인: ${set.containsAll(["Bob", "Binary"])}");

  var set2 = <String>{"Bob", "Binary", "Boo", "Foo"};
  print("교집합 조회: ${set.intersection(set2)}");

  var set3 = <String>{"Boo", "Foo"};
  print("합집합 조회: ${set.union(set3)}");

  var dynamicSet = <dynamic>{...set};
  print("String 리스트로 변환: ${dynamicSet.cast<String>()}");
  print("List으로 변환: ${set.toList()}");

  set.remove("Gump");
  print("Set: $set");

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

{% embed url="<https://dartpad.dev/?id=c958cbd57659a1ecb9114daeef92ac63>" %}
