[Flutter] [Tip] LinkedHashMap Literal

개발을 하다보면 초기화의 일환으로 List, Map 등에도 Literal(고정값)을 적용할 일이 종종 생긴다.

 

예를 들어 아래와 같은 경우가 있을 것이다.

final names = [ "John Doe", "Jane Doe" ]; // List literal
final account = { "name": "John Doe", "dept": "finance" }; // Map literal

위와 같이 초기값을 넣어주는 경우도 있지만, 값이 빈 객체를 만들고자 할 때도 있다.

final names = [];
final accounts = {};

Map은 기본적으로 "입력 순서를 보장하지 않는" 자료구조다.

언어에 따라 기본 Map이 Ordered인 경우가 있고, Unordered인 경우가 있다.

최근에는 Unordered가 기본으로 더 각광받는 것 같은데, 이건 Insertion 성능 때문에 그런 것 같다.

Ordered Map vs. Unordered Map Performance Study

요지는, Map을 순회할 때 대부분 넣은 순서대로 도는 것 같지만, 꼭 그렇다고 보장은 못한다는 것이다.

 

서비스를 구현하다보면 꼭 순서를 보장해야하는 경우를 자주 마주친다.

Dart에서는 LinkedHashMap을 사용하면 되는데, 처음에 아래와 같이 빈 객체를 만들어 보았다.

final orderedMap = LinkedHashMap<String, List<Comment>>();

댓글과 대댓글을 순서대로 노출하기 위한 것인데, 이렇게 하니까 Intellij에서 Literal로 표현할 수 있다고 떴다!

그래서 조금 찾아보니 아래와 같은 Stackoverflow 글을 발견했다.

What are the differences between the different Map implementations in Dart?

답변에서 필요한 부분만 요약하면 아래와 같다.

- 초기 Dart 버전에서는 Hash Map을 기본 Map 구현체로 반환했다.

- 얼마 지나지 않아 LinkedHashMap이 기본 Map 구현체로 바뀌었다.

 

여기서 HashMap은 Unordered Map이고, LinkedHashMap은 Ordered Map이다.

그렇다면 Intellij의 제안대로 Literal로 표현해도 되는 것이 맞다.

 

그래서 바꾼 코드는 아래와 같다.

final orderedMap = <String, List<Comment>>{};

Intellij 덕분에 하나 더 배웠다. :)