Daily Notebook

[Java] Array, List, Set, Map 선언과 초기화

by 배부른코딩로그
💡 쓸 때마다 헷갈리는 Collection들의 선언과 초기화를 동시에 해보자.

목표

  • Array 및 List, Set, Map에 대한 선언과 초기화를 동시에 할 수 있다.
  • 예제를 만들어 설명할 수 있다.

 

Array

int[] array1 = new int[] { 1, 2, 3 };
int[] array2 = { 1, 2, 3 };

두 가지 방법을 통해 선언과 초기화가 동시에 가능하다.

짧고 간결한 코드가 보기 더 좋기 때문에 아래의 방식을 주로 사용한다.

 

List

List<String> list1 = new ArrayList<>(Arrays.asList("1", "2", "3"));
List<String> list2 = new ArrayList<>() {
	{
		add("1");
		add("2");
		add("3");
	}
};

Array를 통해 초기화 후 List로 만들어주는 방법과 List로서 선언과 초기화를 동시에 하는 방법이 존재한다.

아래의 코드가 List를 초기화한다는 것이 더 명시적이기 떄문에 이를 선호한다.

위의 방식은 선언 후 변경이 가능하다. 변경이 불가능한 immutable한 List 선언과 초기화도 가능하다.

// ① Collections.unmodifiableList method
final List<Integer> list = Arrays.asList(new String[] { 1, 2, 3 });
final List<Integer> list2 = Collections.unmodifiableList(
	new ArrayList<>(list));

// ② Stream API
List<String> alphabets = Stream
    .of("A", "B", "C")
    .collect(collectingAndThen(toList(), Collections::unmodifiableList));

// ③ List.of method (JDK 9 ↑)
List<String> emptyList = List.of(); // []
final List<Integer> lastNames = List.of("KIM", "LEE", "CHOI");

일반적으로 Side Effect를 발생시키지 않게 위해 불변 컬렉션에 데이터를 담는다.

불변 컬렉션에 대해 변경을 시도하면, "UnsupportedOperationException"이 발생한다.

 

추가적으로, Google Guava 라이브러리도 이용할 수 있다.

Guava는 불변 리스트 생성을 단 한 줄의 코드로 만들 수 있는 빌더 클래스를 제공한다.

import com.google.common.collect.ImmutableList;

List<String> fruits = ImmutableList.of("Apple", "Banana", "Cherry");
fruits.add("Lemon"); 
// /* [ERROR] UnsupportedOperationException ..... */

 

Set

Set<String> set = new HashSet<>(Arrays.asList("A", "B", "C"));

List 뿐만 아니라 Set 인터페이스에도 불편 컬랙션 생성을 위한 팩토리 메서드가 추가되었다.

// Basic
Set<String> values = Collections.unmodifiableSet(
		new HashSet<String>(Arrays.asList("1", "2", "3")));

// List.of method (JDK 9 ↑)
Set<String> fruits = Set.of("Apple", "Banana", "Cherry");
Set<String> fruits2 = Set.of("Apple", "Banana", "Cherry", "Apple");
// /* [ERROR] IllegalArgumentException */
fruits.add("NEW ONE");
// /* [ERROR] UnsupportedOperationException ..... */

 

Map

Map<String, String> map = new HashMap<String, String>() {
	{
		put("key1", "value1");
		put("key2", "value2");
		put("key3", "value3");
	}
};

Map 인터페이스 역시 불편 컬랙션 생성을 위한 팩토리 메서드 Map.of(...)가 추가되었다.

// Basic
Map<String, String> map1 = Collections.unmodifiableMap(new HashMap<String, String>() {
	{
		put("key01", "val01");
		put("key02", "val02");
		put("key03", "val03");
	}
});

/*
 * JDK 9 ↑
 */
Map<String, String> map2 = Map.of("key1", "value1", "key2", "value2");
map2.put("NEW_KEY", "NEW_VALUE");
// /* [ERROR] UnsupportedOperationException ..... */

Map<Integer, String> alphabets = Map.ofEntries(
		Map.entry(1, "A"),
		Map.entry(2, "B"),
		Map.entry(3, "C"));

 

번외: 빈 불편 컬렉션 생성

// JDK 5 ↑
List<String> emptyList = Collections.emptyList();
Set<String> emptySet = Collections.emptySet();
Map<String, String> emptyMap = Collections.emptyMap();

// JDK 9 ↑
List<String> emptyList = List.of();
Set<String> emptySet = Set.of();
Map<String, String> emptyMap = Map.of();

 

 

항상 더 간결하고 읽기 쉬운 코드가 유지보수 함에 좋다.

누군가에게 Collections.unmodifiable 메서드가 단어적으로 더 명시적으로 느낄 수 있지만,

Collection.of를 통해 코드를 더욱 간결하게 표현이 가능하다.

 

Collections.of 메서드를 애용하자!

모르면 공부하고, 배우면 된다.

 

 

 

 

Last Updated. 2021. 11. 05.

 

반응형

'Java' 카테고리의 다른 글

[Java] Null Safe한 자바 컬렉션 정렬  (0) 2022.05.24
[Java] Enum 소화하기  (0) 2022.05.09
[Java] YAML 활용하기  (0) 2022.05.04
[Java] @Required 직접 만들어보기  (0) 2022.04.23
[Java] Java Optional  (0) 2021.06.14

블로그의 정보

배부른코딩로그

배부른코딩로그

활동하기