집합은 정렬되지 않은 고유한 항목들로 이루어진 컬렉션입니다. Set 타입을 통해 제공되며 {...} 표현식으로 리터럴을 지원합니다. 아래 코드에서 halogens 변수는 Set<String> 타입으로 추론됩니다. Set에 다른 타입을 추가할 경우 컴파일 타임 또는 런타임 오류가 발생합니다. 타입 인수를 {}앞에 사용하거나 Set 변수에 할당하면 빈 Set을 생성합니다.
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);
}
Map 리터럴 표현식은 Set 리터럴과 문법이 유사합니다. Map 리터럴이 더 먼저 지원되기 시작해서 {}의 기본 타은 Map입니다. {} 리터럴 사용 시 타입 어노테이션이 타입 인수를 선언하지 않으면 Map<dynamic, dynamic> 타입의 객체가 생성됩니다.
Set에 항목을 추가할 때는 add() 또는 addAll() 메서드 사용합니다. 또한 length 속성을 이용하여 항목의 수를 구합니다.
void main() {
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
assert(elements.length == 5);
}
Set 리터럴 앞에 const 키워드를 붙이면 컴파일 타임 상수로 선언할 수 있습니다. Set 타입도 List 타입과 같이 전개 연산자와 collection if, for를 사용할 수 있습니다.
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);
}
Set 타입은 다양한 속성과 메서드를 제공하고 있습니다.
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}");
}