티스토리 뷰

반응형

컬렉션

다트는 리스트(List), 셋(Set), 맵(Map) 컬렉션을 기본으로 지원한다.

 

 

 

리스트(List)

다트에서 여러 개의 값을 가지는 배열인 리스트(list)를 제공한다. 리스트 리터널은 대괄호([ ])로 둘러싸인 쉼표로 구분된 식 또는 값 목록으로 표시된다. 

var list = [1, 2, 3];

 

위의 코드에서 list 변수는 List<int> 타입으로 추론된다. 만일 선언 이후 list에 int가 아닌 값을 추가하면 에러가 발생한다.

 

리스트의 마지막 아이템에 콤마를 추가할 수 있다. 마지막 콤마는 아무런 의미가 없다. 이 콤마는 다음 아이템을 추가할 때 콤마를 빼먹지 않을 수 있기 때문에 에러를 방지한다.

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

 

리스트의 인덱스는 0부터 시작된다. length 프로퍼티를 사용하여 리스트의 길이를 얻을 수 있다. 그러므로 인덱스 0은 첫 아이템이 되고, list.length - 1은 마지막 아이템이 된다. 

 

리스트의 서브스트립트 연산자([ ])를 사용하여 리스트의 값에 접근할 수 있다.

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

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

 

const를 사용해서 컴파일-타임 상수인 리스트를 만들 수 있다.

var constantList = const [1, 2, 3];
constantList[1] = 1; // 에러 발생, constantList의 값은 const [1, 2, 3]이므로 값을 바꿀 수 없다.

 

 

 

셋(Set)

다트의 셋은 순서가 없고, 유일한 항목들의 모음이다. 다트는 셋 타입과 셋 리터럴을 통해 셋을 만들 수 있다. 

 

다음은 셋 리터럴을 이용해서 만든 셋이다. halogens 변수의 타입을 Set으로 추론된다.

var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
// halogerns는 Set<String> 타입이다.

 

 

빈 셋을 만들려면, 타입 인수와 {}를 사용하거나, Set 타입의 변수에 {}를 할당하면 된다.

var names1 = <String>{};  // 빈 Set
Set<String> names2 = {};  // 빈 Set

var names3 = {}; // Set이 아닌 Map<dynamic, dynamic>이다.

 

맵 리터럴은 셋 리터럴과 유사하다. 그러나 맵 리터럴이 먼저 나왔기 때문에 {}는 기본적으로 맵 타입이 된다. 

 

아이템을 추가하려면 add()와 addAll() 메서드를 사용하면 된다. 

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

 

length을 사용해서 아이템 갯수를 얻을 수 있다.

assert(elements.length == 5);

 

const를 사용해서 컴파일-타임 상수를 만들 수 있다.

final constantSet = const {
  'fluorine',
  'chlorine',
  'bromine',
  'iodine',
  'astatine',
};
// constantSet.add('helium'); // This line will cause an error.

 

 

 

맵(Map)

맵은 키와 값을 연결하는 컬렉션이다. 키와 값은 모든 타입이 될 수 있다. 각 키는 유일해야 하지만 값을 중복이 되어도 된다. 

 

맵은 맵 타입과 맵 리터럴로 만들 수 있다. 다음은 맵 리터럴을 사용하여 만든 예제이다. gifts는 Map<String, String> 타입이고, nobleGases는 Map<int, String> 타입이 된다. 

var gifts = {
  // Key:    Value
  'first': 'partridge',
  'second': 'turtledoves',
  'fifth': 'golden rings'
};

var nobleGases = {
  2: 'helium',
  10: 'neon',
  18: 'argon',
};

 

다음처럼 기존 맵에 새로운 키-값 쌍을 추가할 수 있다.

gifts['fourth'] = 'calling birds'; // 키-값 쌍 추가

 

 

대괄호([ ])와 키를 사용해서 값을 검색할 수 있다.

assert(gifts['first'] == 'partridge');

 

맵에서 존재하지 않는 키를 조회하면 null을 반환한다.

assert(gifts['five'] == null);

 

length를 사용하여 키-값 쌍의 개수를 얻을 수 있다.

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

 

컴파일-타임 상수 맵을 생성하려면 const를 사용하자.

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

// constantMap[2] = 'Helium'; // 이 줄은 오류를 발생시킵니다.

 

 

 

스프레드 연산자

컬렉션에 스프레드 연산자(...)와 널 안전 스프레드 연산자(...?)를 사용할 수 있다. 스프레드 연산자는 여러 값을 컬렉션에 삽입하는 방법이다. 

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

 

만약 스프레드 연산자의 오른쪽 표현식이 null일 수 있는 경우, 널 안전 스프레드 연산자(...?)를 사용하여 에러를 방지할 수 있다.

var list2 = [0, ...?list];
assert(list2.length == 1);

 

 

 

컨트롤-제어 연산자

컬렉션에 컨트롤-제어 연산자인 컬렉션 if와 컬렉션 for를 제공한다. 이 연산자를 사용하여 조건부와 반복을 활용하여 컬렉션을 구성할 수 있다.

 

다음은 컬렉션 if를 사용하여 promoActive에 따라서 항목의 수가 3개이거나 4개가 되는 리스트를 생성하는 예제가 된다.

var promoActive = true;
var nav = ['Home', 'Furniture', 'Plants', if (promoActive) 'Outlet'];

 

if-case도 지원한다.

var login = 'Manager';
  var nav = [
    'Home',
    'Furniture',
    'Plants',
    if (login case 'Manager') 'Inventory'
  ];

 

다음은 컬렉션 for를 사용하여 리스트의 항목을 조작한 후 다른 리스트에 추가하는 예제이다.

var listOfInts = [1, 2, 3];
var listOfStrings = ['#0', for (var i in listOfInts) '#$i'];
assert(listOfStrings[1] == '#1');
반응형
댓글
공지사항