[Dart] List, Set 개념 및 차이점
Dart 는 List, Set, Map 이라는 세 가지 Collection을 기본으로 지원한다.
이 중 유사한 개념인 List와 Set의 차이점을 확실히 정리했다.
List (배열)
:순서가 있는 값의 묶음
선언 규칙
List<[타입]> [변수 이름] = [요소];
List<String> colors = ['red', 'blue', 'green'];
[변수 이름] = [요소];
var numbers [1, 2, 3, 4, 5];
리스트 타입을 정해주지 않거나 var로 선언해도 된다.
위 코드의 경우 타입을 int로 추론한다.
리스트의 타입을 정한 경우, 다른 타입의 요소를 넣으면 오류가 발생한다.
타입을 정하지 않은 경우 모든 요소를 포함하는 상위 클래스로 타입을 추론한다.
List<String> colors = ['red', 'blue', 'green', 000];
//The element type 'int' can't be assigned to the list type 'String'
String 타입을 정해주었으므로 int 타입의 000을 넣으면 오류가 발생한다.
var numbers = [1, 2, 10, 3.14];
print(numbers.runtimeType);
CONSOLE
List<num>
타입을 정해주지 않았으므로 int와 double타입의 상위 타입인 Numbers로 추론한다.
Set (집합)
: 순서가 없는 중복되지 않은 값의 묶음
선언 규칙
Set<타입> [변수 이름] = {요소};
Set<String> fruits = {'apple', 'orange', 'banana'};
변수 이름 = {요소};
var numbers = {1, 2, 3, 4, 5};
List와 마찬가지로 타입을 정해 줄 수도, 정하지 않을 수도 있다.
타입을 정하지 않은 경우 모든 요소를 포함하는 상위 타입을 자동으로 추론한다.
단, Set안에 값을 넣지 않는 경우 타입 지정이 필요하다.
var names = <String>{};
print(names.runtimeType); // Set<String>
var names = {};
print(names.runtimeType); // Map<dynamic, dynamic>
타입 지정한 경우 Set, 지정하지 않은 경우 Map으로 선언됨
List와 Set의 차이점
한글명인 배열, 집합에서 알 수 있듯이
List는 순서가 정해진 값들의 묶음,
Set은 순서가 없는 값들의 묶음이다.
일반적인 리스트, 집합의 이미지를 떠올리면 이해가 쉽다.
리스트는 순서대로 작성되어 있고, 집합은 순서 없이 하나의 틀 안에 모여있을 뿐이다.
또한, '순서(index)' 가 있기 때문에 리스트는 같은 값이라도 순서에 따라 구별되지만, 집합에서는 같은 값은 하나로 처리된다.
따라서 List에서만 index 관련 기능을 사용할 수 있다.
List | Set | |
선언방법 | List<[타입]> [변수 이름] = [요소]; | Set<타입> [변수 이름] = {요소}; |
[변수 이름] = [요소]; | 변수 이름 = {요소}; | |
Index 유무 | O | X |
중복 허용 유무 | O | X |
공통 사용 가능한 코드 | .isEmpy, add(), addAll(), remove(), length, contains(), clear() | |
각 타입에서만 사용 가능한 코드 | indexOf(), removeAt() | containsAll() |