/////
Search
Duplicate
1️⃣

컬렉션 팩토리

자바 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.ofMap.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.entryMap.Entry 객체를 만드는 정적 팩토리 메서드다.