guricode

잘 모르면 애매한 Dart 간단 정리 - Collections (2) 본문

앱/Flutter&Dart

잘 모르면 애매한 Dart 간단 정리 - Collections (2)

agentrakugaki 2025. 6. 24. 12:23

이번엔 Dart 컬렉션 중에서 Set과 Map에 대해 정리해봤다. List와는 다른 특징들을 가지고 있어서 언제 쓰면 좋은지 구분할 수 있어야 한다.


 Set

어떤 친구인가요?

  • 중복되지 않은 값들의 집합
  • 수학의 집합 개념과 비슷함
  • 요소의 순서를 보장하지 않음
  • Index가 없음 (즉, set[0] 이런거 불가)

어떻게 생겼나요?

Set<int> numbers = {1, 2, 3, 4, 5};
Set<int> empty = {}; // 비어있는 Set
var numbers = {1, 2, 3}; // Set<int>로 추론
final numbers = {1, 2, 3};
const names = {'Alice', 'Bob'};
var names = <String>{}; // 명시적으로 빈 Set 생성

주의할 점

var numbers = {}; 
print(numbers.runtimeType); // LinkedHashMap<dynamic, dynamic>
  • 이렇게 선언하면 Map으로 인식되기 때문에 빈 Set은 var s = <Type>{}; 형태로 써야 함

타입 관련 특징

Set<String> fruits = {'사과', '파인애플', '오렌지', 8};
// Error: int 타입 요소는 허용 안 됨
  • Set은 요소 타입이 통일되어야 함
  • 타입을 명시하지 않으면 다양한 타입을 담을 수 있지만, 내부 타입은 Object로 추론됨
var fruits = {'사과', '파인애플', '오렌지', 8};
print(fruits.runtimeType); // _Set<Object>

중복 제거 기능

var fruits = {'사과', '파인애플', '사과'};
print(fruits); // {사과, 파인애플}
  • 중복된 요소는 자동으로 제거됨
  • 그래서 Set은 주로 "중복 제거" 용도로 많이 사용됨

메서드 및 속성들

final fruits = {'사과', '파인애플', '오렌지'};
print(fruits.length); // 3
print(fruits.isEmpty); // false
print(fruits.isNotEmpty); // true

fruits.add('복숭아');
fruits.addAll({'포도', '귤'});

fruits.remove('파인애플');

print(fruits.contains('사과')); // true
print(fruits.containsAll({'사과', '귤'})); // true or false
  • add(): 요소 하나 추가
  • addAll(): 여러 요소 추가
  • remove(): 특정 요소 삭제
  • contains(), containsAll(): 포함 여부 확인

 Map

어떤 친구인가요?

  • Key와 Value가 쌍으로 구성된 자료 구조
  • 각각의 Key는 고유해야 하며, Value는 중복 가능

선언 방식

Map<String, String> people = {'Alice': 'Teacher', 'Bob': 'Student'};
Map<String, String> empty = {};
var people = {'Alice': 'Teacher'};
final people = {'Alice': 'Teacher'};
const animals = {'Dog': 3, 'Cat': 5};
  • 빈 Map 생성 시도 시 주의:
var map = {}; // LinkedHashMap<dynamic, dynamic>

타입 관련 예시

Map<String, int> people = {'Alice': 25, 'Bob': 'Teacher'};
// Error: 'Teacher'는 int 타입이 아님
  • 타입 명시 안하면:
var people = {'Alice': 25, 45: 'Bob'};
print(people.runtimeType); // LinkedHashMap<Object, Object>

Key 중복 시

Map<String, int> people = {'Alice': 25, 'Bob': 25, 'Alice': 23};
print(people); // {Alice: 23, Bob: 25}
  • 나중에 등장한 값으로 덮어씀

메서드 및 속성들

Map<String, int> people = {'Alice': 25, 'Bob': 30};
print(people.length); // 2
print(people.isEmpty); // false
print(people.isNotEmpty); // true

print(people['Alice']); // 25
print(people['Paul']); // null

people['Alice'] = 28; // 값 수정
people['Charlie'] = 35; // 새로운 키-값 추가

people.remove('Bob');
print(people.containsKey('Alice')); // true
print(people.keys); // (Alice, Charlie)
print(people.values); // (28, 35)

✅ List vs Set 비교 정리

ListSet

순서 유무 O X
Index 유무 O X
중복 허용 O X