•
자바 9에서는 컬렉션 객체를 쉽게 만들 수 있는 몇 가지 방법을 제공한다.
•
먼저 이와 같은 기능이 왜 필요한지 살펴보자.
◦
자바에서 적은 요소를 포함하는 리스트를 어떻게 만들까?
List<String> friends = new ArrayList<>();
friends.add("Raphael");
friends.add("Olivia");
friends.add("Thibaut");
Java
복사
▪
이렇게 하면 세 문자열을 저장할 뿐인데도 많은 코드가 필요하다.
▪
다음처럼 Arrays.asList() 정적 팩토리 메서드를 사용하면 코드를 간단하게 줄일 수 있다.
List<String> friends = Arrays.asList("Raphael", "Olivia", "Thibaut");
Java
복사
▪
고정 크기 리스트이므로 요소를 갱신할 순 있으나 추가는 불가능하다.
▪
추가를 시도하는 경우 UnsupportedOperationException 예외가 발생한다. 이는 내부적으로 고정된 크기의 변환할 수 있는 배열로 구현되었기 때문이다.
리스트 팩토리(List)
•
List.of 정적 팩토리 메서드를 사용해서 간단하게 리스트를 만들 수 있다.
List<String> friends = List.of("Raphael", "Olivia", "Thibaut");
Java
복사
◦
이렇게 만들어진 List는 고정 크기 자료형이므로 add 연산을 시도할 경우 UnsupportedOperationException 예외가 발생한다.
◦
set 연산을 시도해도발생한다. 불변 리스트가 만들어졌기 때문이다.
•
List.of는 다양한 오버로드 버전이 존재하는데, 시그니처는 다음과 같다. static <E> List<E> of(E e1, E e2, E e3, E e4), static <E> List<E> of(E e1, E e2, E e3, E e4, E e5)
◦
나는 당연히 가변인수(Vargs)를 사용했을 것이라고 생각했는데, 아니었다. 바이트코드 단계에서 가변 인수는 추가 배열을 할당해서 리스트로 감싸기 때문에 배열을 할당하고 초기화하며 GC하는 비용을 지불해야 한다.
◦
of의 오버로드된 버전은 최대 10개까지 정의하므로 이런 비용을 제거할 수 있다. 만약 10개 이상의 인수를 사용하는 경우, 가변 인수를 이용하는 메서드가 사용된다. Set.of나 Map.of도 그러하다
집합 팩토리(Set)
Set<String> friends = Set.of("Raphael", "Olivia", "Thibaut");
Java
복사
•
만약 당신이 인수로 중복된 요소를 제공한다면 해당 요소가 중복되어있다는 설명과 함께 IllegalArgumentException이 발생한다.
◦
여러 개가 중복되어있다면 가장 먼저 발견되는 중복값이겠지?
맵 팩토리(Map)
•
맵은 키, 밸류 형태이기 때문에 맵을 만드는 과정은 리스트나 집합을 만드는 과정에 비해 조금 복잡하다.
•
자바 9에서는 두 가지 방법으로 불변 객체인 맵을 초기화할 수 있다.
◦
Map.of 팩토리 메서드에 키와 값을 번갈아 제공하는 방법
Map<String, Integer> ageOfFriends = Map.of("Raphael", 30, "Olivia", 25, "Thibaut", 26);
Java
복사
▪
10개 이하의 키와 값 쌍을 가진 작은 맵을 만들 때는 이 메서드가 유용하다.
◦
Map.ofEntries 팩토리 메서드를 사용하는 방법
Map<String, Integer> ageOfFriends = Map.ofEntries(Map.entry("Raphael", 30), Map.entry("Olivia", 25), Map.entry("Thibaut", 26));
Java
복사
▪
Map.entry는 Map.Entry 객체를 만드는 정적 팩토리 메서드다.