Flutter Study Day 4 Dart Collection

정정원·2023년 12월 4일
0

Flutter Study

목록 보기
7/17

컬렉션

Dart에는 목록, 집합 및 지도 컬렉션에 대한 지원이 내장되어 있습니다. 컬렉션에 포함된 유형 구성에 대해 자세히 알아보려면 Generics를 확인하세요.

  1. List : 순서 대로 쌓여있는 구조 (아이템의 중복 허용)
  2. Map : 키(key)와 값(value)의 쌍으로 저장 (키의 중복 불가)
  3. Set : 순서가 없는 집합 (중복 불가)

dart에는 List, Map, Set 3가지의 컬렉션 타입이 존재한다.
모든 컬렉션은 중첩으로 사용이 가능하다.

List

아마 모든 프로그래밍 언어에서 가장 흔한 컬렉션은 배열이나 정렬된 객체의 그룹일 겁니다. Dart에서 배열은 List 객체로 존재하며, 보통 list라고 부릅니다.

Dart는 var list = [1, 2, 3];List <int> 타입으로 추정한다. list에 정수가 아닌 값을 추가하고 싶다면, 애널라이저 또는 런타임이 에러를 발생시킨다.

var list = [
  'Car',
  'Boat',
  'Plane',
];

리스트는 0 부터 시작하는 제로 베이스 인덱싱을 사용하고, list.length - 1가 list의 마지막 인덱스다. .length 프로퍼티를 사용하여 list의 길이를 구할 수 있고, 서브스크립트 연산자 ([])를 사용하여 list의 값에 접근할 수 있다.

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

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

컴파일 타임 상수인 리스트를 생성하고 싶다면, list 리터럴 앞에 const를 추가하면 된다.

var constantList = const [1, 2, 3];
// constantList[1] = 1; // 이 라인은 에러를 발생시킵니다.

List의 탐색방법

for (int i = 0; i < names.length; i++) {
	print(names[i]);
}
for (final name in names) {
	print(name);
}
names.forEach((name) {
	print(name);
});
names.forEach(print);

Set

Dart의 set은 유니크한 항목들로 이루어진 정렬되지 않은 컬렉션입니다. Dart는 set 리터럴과 Set 타입을 지원합니다.

  • 중복 값을 허용하지 않는다.
  • List의 contains 보다 압도적으로 빠름

Dart는 var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};Set<String> 타입으로 추정한다. 알맞지 않는 타입을 set에 추가하면, analyzer 또는 런타임이 에러를 발생시킨다.

빈 set을 생성하고 싶다면, 타입 인자 앞에 {}을 사용하거나, Set 타입의 변수에 {}을 할당해야한다.

var names = <String>{};
// Set<String> names = {}; // 이 코드도 작동합니다.
// var names = {}; // Set이 아닌 map을 생성합니다.

! Set 또는 map? Map 리터럴 문법은 set 리터럴 문법과 유사합니다. Map 리터럴을 우선으로 고려하기 때문에, {}의 디폴트는 Map 타입입니다. 만약 {} 또는 이것이 할당될 변수에 타입을 명시하는 것을 잊었다면, Dart는 Map<dynamic, dynamic> 타입의 객체를 생성합니다.

add() 또는 addAll() 메서드를 사용해 존재하는 set에 요소 추가

var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);

Set에 있는 요소들의 수를 알고 싶다면, .length를 사용하기

var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
assert(elements.length == 5);

컴파일 타임 상수인 set을 생성하고 싶다면, set 리터럴 앞에 const를 추가하면 된다.

final constantSet = const {
 'fluorine',
 'chlorine',
 'bromine',
 'iodine',
 'astatine',
};
// constantSet.add('helium'); // 이 라인은 에러를 발생시킵니다.

Map

일반적으로, map은 키와 값으로 구성된 객체입니다. 키와 값 모두 어떤 타입의 객체든 할당이 가능합니다. 각 키들은 유일하지만 값은 중복될 수 있습니다. Dart는 map 리터럴과 Map 타입으로 map을 지원합니다.

  • 키(key) : 값(value) 의 쌍으로 이루어진 요소를 담는 자료구조 / 키의 중복은 허용되지 않음
  • Map은 순서를 보장하지 않기 때문에 매번 출력 결과의 순서가 다르게 표시 될 수 있음
var gifts = {
 // 키:    값
 'first': 'partridge',
 'second': 'turtledoves',
 'fifth': 'golden rings'
};
var nobleGases = {
 2: 'helium',
 10: 'neon',
 18: 'argon',
};

Dart는 gifts의 타입을Map<String, String>로 그리고 nobleGases의 타입을 Map<int, String>로 추정합니다. Map에 알맞지 않는 타입의 값을 추가하면, analyzer나 런타임이 에러를 발생시킨다.

Map 생성자를 사용하여 생성하는 것도 가능

var gifts = Map<String, String>();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';

var nobleGases = Map<int, String>();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';

Map에 존재하지 않는 키로 접근하면, null을 반환

var gifts = {'first': 'partridge'};
assert(gifts['fifth'] == null);

Map에 있는 키-값 쌍의 개수를 알고 싶다면, .length을 사용

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);

컴파일 타임 상수인 map을 생성하고 싶다면, map 리터럴 앞에 const를 추가하면 된다.

final constantMap = const {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

// constantMap[2] = 'Helium'; // 이 라인은 에러를 발생시킵니다.

컬렉션 선택

  • key, value 쌍 : Map
  • 중복 가능 : List
  • 중복 불가 : Set
  • 순서 중요 : List
  • 순서 안 중요 : Set
  • 검색 속도 중요 : Set

0개의 댓글