Map.of() 를 통한 Map 초기화 주의할 점

강상우·2021년 7월 11일
1

Java

목록 보기
1/2

개요

Java 9부터 사용할 수 있는 Map.of()를 통해 맵 데이터를 초기화하다가 주의할 점이 몇 가지 있어서 포스팅을 남기려 합니다.

기존에는 맵을 초기화할 때 아래와 같이 진행했었습니다.

private Map<Integer, String> map = new HashMap<>() {
  {
    put(1, "sangwoo kang");
    put(2, "james kang");
    put(3, "stef you");
  }
};

하지만 Java 9 이상부터는 Map.of()를 통해 조금 더 간단하게 작성할 수 있었습니다.

private Map<Integer, String> map = Map.of(
    1, "sangwoo kang",
    2, "james kang",
    3, "stef you"
);

이렇게 간단하게 작성할 수 있는 방법에서 어떤 점들을 주의해야 되는 걸까요?

1. 개수 제한

지금까지 Map.of()를 사용하며 문제를 발견했던 적이 없었습니다.
하지만 개수가 늘어나며 갑자기 예기치 못한 문제를 발견하게 되었습니다.

이렇게 문제가 없던 IDE는,, 데이터 한개를 추가해주니 에러를 발생시킵니다.

이유가 무엇일까요??

Map 인터페이스로 들어가보겠습니다.
인터페이스에 들어가니 of() 메소드를 인자의 개수에 맞춰 오버로딩해두고 있는 것을 알 수 있었습니다.

. . .

오버로딩은 인자의 개수가 10개까지로 제한되어 있었습니다.
즉, 10개 보다 많은 데이터는 of()를 이용해 초기화 할 수 없게됩니다.
이런 경우에는 ofEntries()를 이용해 처리할 수 있습니다.

2. Immutable 객체 반환

이렇게 of()ofEntries()를 통해 객체를 초기화할 때는 주의하여야 할 점이 한가지 더있습니다.
바로 Immutable 객체를 반환하는 부분인데요, 파이썬을 하시는 분들이라면 frozen을 생각하시면 될 것 같습니다.

즉, 초기화가 되고 난 이후 put이나 remove를 통해 객체의 데이터를 변경시킬 수 없게 됩니다.

위에 Map 인터페이스 캡쳐본을 자세히 보면 return 값으로 ImmutableCollections를 반환하는 것을 알 수 있습니다.

마무리

of() 메소드를 처음 알게되었을 때는 초기화 작업에서 굉장히 편하다고 생각했지만, 주의해야 할 점이 생각보다 많았습니다.

만약, 단순히 초기화를 한 후 값 조회만 하는 경우라면 Immutable 객체를 반환해주는 of()ofEntries()를 사용해도 되지만, 그게 아닌 경우에는 이전 방식을 사용해야 합니다.

profile
https://sangwoo0727.github.io/ 기존 블로그 이전 중입니다.

0개의 댓글