Flutter/Dart - Map 선언 및 초기화

Map(HashMap) 선언 및 초기 값으로 초기화하는 방법을 소개합니다.

1. Map(HashMap) 선언

아래 예제와 같이 Map을 선언할 수 있습니다.

  • Map을 사용하려면 'dart:collection' 라이브러리가 import로 선언되어야 함
  • 생성할 때 new HashMap<>처럼 new를 붙여도 되고, HashMap<>처럼 생략해도 됨
import 'dart:collection';

void main() {

    HashMap hashMap1 = new HashMap<int, String>();

    HashMap hashMap2 = HashMap<int, String>();
}

1.1 다른 종류의 Map

HashMap 외에, 아래와 같이 LinkedHashMap 또는 SplayTreeMap를 선언할 수도 있습니다.

Map<>으로 선언하면 기본적으로 LinkedHashMap으로 생성됩니다. Type을 확인해보면 알 수 있습니다.

import 'dart:collection';

void main() {

    Map map1 = LinkedHashMap<int, String>();
    Map map2 = SplayTreeMap<int, String>();
    Map map3 = Map<int, String>();

    print(map1.runtimeType);
    print(map2.runtimeType);
    print(map3.runtimeType);
}

Output:

_InternalLinkedHashMap<int, String>
SplayTreeMap<int, String>
_InternalLinkedHashMap<int, String>

LinkedHashMapHashMap은 비슷한 자료구조입니다. 차이점은 HashMap은 요소를 순회할 때 출력되는 순서가 저장 순서와 다르지만, LinkedHashMap은 저장 순서와 출력 순서가 같습니다.

2. Map 선언 및 초기 값 설정

아래와 같이 선언과 동시에 초기 값을 설정할 수 있습니다.

  • {key:value, ...} 처럼 초기 값으로 초기화 할 수 있으며, LinkedHashMap으로 생성 됨
  • 타입은 초기 값에서 추론할 수 있기 때문에, 선언 부분에서 var을 사용하여 타입을 생략할 수 있음
  • 아래 예제의 Type을 확인해보면 <String, int> 타입의 Map으로 생성됨
import 'dart:collection';

void main() {

    Map<String, int> map1 = {'a': 0, 'b': 1, 'c': 2};
    print(map1.runtimeType);
    print(map1);

    var map2 = {'a': 0, 'b': 1, 'c': 2};
    print(map2.runtimeType);
    print(map2);
}

Output:

_InternalLinkedHashMap<String, int>
{a: 0, b: 1, c: 2}
_InternalLinkedHashMap<String, int>
{a: 0, b: 1, c: 2}

만약 LinkedHashMap가 아닌 HashMap의 객체를 생성하면서 초기 값을 입력하고 싶다면, HashMap.from()을 사용하여 아래와 같이 초기 값을 입력하면 됩니다.

import 'dart:collection';

void main() {

    HashMap<String, int> map = HashMap.from({'a': 0, 'b': 1, 'c': 2});

    print(map.runtimeType);
    print(map);
}

Output:

_HashMap<String, int>
{c: 2, a: 0, b: 1}

2.1 Empty Map 생성

아래와 같이 Empty Map을 생성할 수 있습니다.

  • var map1 = {};와 같이 데이터 없이 선언하면, type을 추론할 수 없기 때문에 dynamic type으로 생성 됨
  • var을 사용한다면 var map2 = <String, int> {};처럼 타입을 명시적으로 입력할 수 있음
import 'dart:collection';

void main() {

    var map1 = {};
    print(map1.runtimeType);
    print(map1);

    var map2 = <String, int> {};
    print(map2.runtimeType);
    print(map2);

    Map<String, int> map3 = {};
    print(map3.runtimeType);
    print(map3);
}

Output:

_InternalLinkedHashMap<dynamic, dynamic>
{}
_InternalLinkedHashMap<String, int>
{}
_InternalLinkedHashMap<String, int>
{}

3. 다른 Map 요소들로 초기화

아래와 같이 다른 Map 객체로 새로운 Map을 초기화할 수 있습니다.

  • Map.from()은 인자로 전달된 Map의 요소로 새로운 Map 생성 및 초기화함
  • Map.from()으로 생성되는 Map은 LinkedHashMap
import 'dart:collection';

void main() {

    Map<String, int> map1 = {'a': 0, 'b': 1, 'c': 2};

    Map<String, int> map2 = Map.from(map1);
    print(map2.runtimeType);
    print(map2);
}

Output:

_InternalLinkedHashMap<String, int>
{a: 0, b: 1, c: 2}

3.1 다른 종류의 Map 생성

만약 LinkedHashMap가 아닌 HashMap의 객체를 생성한다면 HashMap.from()을 사용하여 생성하면 됩니다.

import 'dart:collection';

void main() {

    HashMap<String, int> map = HashMap.from({'a': 0, 'b': 1, 'c': 2});

    print(map.runtimeType);
    print(map);
}

Output:

_HashMap<String, int>
{c: 2, a: 0, b: 1}
Loading script...

Related Posts

codechachaCopyright ©2019 codechacha