JAVA๋ List ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ฑฐ๋ array๋ฅผ List๋ก ๋ณํ(array -> list)ํ๊ธฐ ์ํด ํฌ๊ฒ ๋ ๊ฐ์ง ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ฐ๋ก ์ ๋ชฉ๊ณผ ๊ฐ์ Arrays.asList()์ List.of() ๋ ๊ฐ์ง ์ ๋๋ค. ๋ณธ ํฌ์คํ ์์๋ ๋ ๋ฉ์๋์ ์ฌ์ฉ ๋ฐฉ๋ฒ๊ณผ ์ฐจ์ด๋ฅผ ์์๋ณด๊ณ ์ ํฉ๋๋ค.
Arrays.asList()
์ด ๋ฉ์๋๋ List, ์ฆ Java Collections Framework์ ์ํ๋ List ๊ฐ์ฒด๋ฅผ ๊ฐ๋จํ ์์ฑํ ์ ์๊ฒ ํด์ค๋๋ค. Array(๋ฐฐ์ด)์ ์ ๋ ฅ์ผ๋ก ๋ฐ์ List ๊ฐ์ฒด๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ฐธ๊ณ ๋ก JAVA 1.2์์ ๋์ ๋ ์ค๋๋ ๋ฉ์๋์ ๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
๐ [Excample Code]
@DisplayName("Arrays.asList() ์ฌ์ฉ๋ฐฉ๋ฒ")
@Test
void usageOfArraysAsList() {
Integer[] array = new Integer[]{1, 2, 3, 4};
List<Integer> list = Arrays.asList(array);
assertThat(list).containsExactly(1, 2, 3, 4);
}
ํน์ง
Arrays.asList()์ ํน์ง์ ๋ค์ 3๊ฐ์ง๋ก ์ ๋ฆฌํ ์ ์์ต๋๋ค.
* ๊ณ ์ ๋ ๋ฆฌ์คํธ๋ก์จ add/remove ์ UnsupportedOperationException ๋ฐ์
* ์ ๋ ฅ๋ ์๋ณธ array๋ฅผ List ์ธํฐํ์ด์ค๋ก ๊ฐ์ ๋ฟ์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด array์ ๋ณ๊ฒฝ์ด list์๋ ๋ฐ์๋จ
* ๊ฐ๋ณ ๋ฆฌ์คํธ(Mutable list)๋ฅผ ๋ฐํ
๊ฐ ํน์ง์ ์์ ์ฝ๋์ ํจ๊ป ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.
๊ณ ์ ๋ ์ฌ์ด์ฆ -> UnsupportedOperationException ๋ฐ์ ๊ฐ๋ฅ
Arrays.asList() ๋ฉ์๋๋ '๊ณ ์ ๋ ์ฌ์ด์ฆ์ ๋ฆฌ์คํธ(fixed-size list)'๋ฅผ ๋ฐํํฉ๋๋ค. ๋ฐ๋ผ์ ์ element๋ฅผ addํ๊ฑฐ๋ removeํ๋ ค๊ณ ํ๋ฉด 'UnsupportedOperationException'์ด ๋ฐ์ํฉ๋๋ค.
๐ [Excample Code]
@DisplayName("Arrays.asList()๋ fixed list๋ฅผ ๋ฐํํ๋ฏ๋ก add/remove ์ ์์ธ ๋ฐ์")
@Test
void fixedSizeList() {
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
assertThrows(UnsupportedOperationException.class, () -> list1.add(6));
List<Integer> list2 = Arrays.asList(1, 2, 3, 4, 5);
assertThrows(UnsupportedOperationException.class, () -> list2.remove(1));
}
์๋ณธ array ๋ณ๊ฒฝ ์ list์๋ ๋ณ๊ฒฝ์ด ๋ฐ์๋ ์ ์์
์ ๋ ฅ๋ ์๋ณธ array๋ฅผ List ์ธํฐํ์ด์ค๋ก ๊ฐ์ ๋ฟ์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด array์ ๋ณ๊ฒฝ์ด list์๋ ๋ฐ์๋ ์ ์์ต๋๋ค.
๐ [Excample Code]
@DisplayName("์๋ณธ ๋ฐฐ์ด ๋ณ๊ฒฝ์ด list์๋ ๋ฐ์๋จ")
@Test
void changeArrayReflectToList() {
Integer[] integerArray = new Integer[]{1, 2, 3};
List<Integer> list1 = Arrays.asList(integerArray);
integerArray[0] = 1000;
assertThat(list1.get(0)).isEqualTo(1000);
}
๊ฐ๋ณ ๋ฆฌ์คํธ(Mutable list)
Arrays.asList()๋ก ์์ฑ๋ ๋ฆฌ์คํธ๋ ๊ฐ๋ณ์ (mutable)์ ๋๋ค. ์ฆ list ์์ ๊ฐ element๋ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
๐ [Excample Code]
@DisplayName("Mutable list์ด๋ฏ๋ก list์ ๊ฐ ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ณ , ๋ณ๊ฒฝ์ด ์๋ณธ array์ ๋ฐ์๋จ")
@Test
void mutableList() {
// ์์ฑ๋ list์ ๊ฐ element๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
List<Integer> list1 = Arrays.asList(1, 2, 3, 4);
list1.set(1, 1000);
assertThat(list1.get(1)).isEqualTo(1000);
// ์์ฑ๋ list์ ๋ณ๊ฒฝ์ด ์๋ณธ array์ ๋ฐ์๋๋ค.
Integer[] array = new Integer[]{1, 2, 3};
List<Integer> list2 = Arrays.asList(array);
list2.set(0,1000);
assertThat(array[0]).isEqualTo(1000);
}
List.of()
List.of()๋ JAVA 9์์ ๋์ ๋ ๋ฉ์๋์ ๋๋ค. Arrays.of()์๋ ๋์กฐ์ ์ผ๋ก, ์ด ๋ฉ์๋๋ ๋ณ๊ฒฝ๋ถ๊ฐํ(unmodifiable) list ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ
๐ [Excample Code]
@DisplayName("List.of() ์ฌ์ฉ๋ฐฉ๋ฒ")
@Test
void usageOfListOf() {
Integer[] array = new Integer[]{1, 2, 3};
List<Integer> list = List.of(array);
assertThat(list).containsExactly(1, 2, 3)
}
Arrays.asList()์์ ์ฐจ์ด์
Arrays.asList()์ ๋์กฐ๋๋ List.of()์ ํน์ง์ ๋ค์ 2๊ฐ์ง๋ก ์ ๋ฆฌํ ์ ์์ต๋๋ค.
* ์ ๋ ฅ๋ array์ ๋ํด ๋ถ๋ณ์(immutable) list๋ฅผ ๋ฐํ -> ์๋ณธ array์ ๋ณ๊ฒฝ์ด ์์ฑ๋ list์ ๋ฐ์๋์ง ์์
* ์ธํ์ผ๋ก null์ด ํ์ฉ๋์ง ์์(์ ๋ ฅ ์ NullPointerException ๋ฐ์)
๋ถ๋ณ ๋ฆฌ์คํธ(Immutable List)
์ฃผ์ ์ฐจ์ด์ ์ List.of()๋ ์ ๋ ฅ๋ array์ ๋ํด ๋ถ๋ณ์(immutable) list๋ฅผ ๋ฐํํ์ฌ, ์๋ณธ array์ ๋ณ๊ฒฝ์ด ์์ฑ๋ list์ ๋ฐ์๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ํ List.of()๋ก ์์ฑ๋ list์ ๊ฐ element๋ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ๋ณ๊ฒฝํ๋ คํ๋ฉด UnsupportedOperationException์ด ๋ฐ์ํฉ๋๋ค.
๐ [Excample Code]
@DisplayName("Immutable List -> ์๋ณธ array์ ๋ณ๊ฒฝ์ด list์ ๋ฐ์๋์ง ์๊ณ , list์ ๊ฐ ์์ ๋ณ๊ฒฝ ์ ์์ธ ๋ฐ์")
@Test
void immutableList() {
Integer[] array = new Integer[]{1, 2, 3};
List<Integer> list = List.of(array);
array[0] = 1000;
assertThat(list.get(0)).isEqualTo(1);
assertThrows(UnsupportedOperationException.class, () -> list.set(1, 4));
}
Null
List.of()๋ null ๊ฐ์ ์ ๋ ฅ์ผ๋ก ํ์ฉํ์ง ์์ต๋๋ค. null์ด ์ ๋ ฅ๋๋ฉด NullPointerException์ด ๋ฐ์ํฉ๋๋ค.
๐ [Excample Code]
@DisplayName("null ๊ฐ์ ํ์ฉํ์ง ์์")
@Test
void notAllowNullValue() {
assertThrows(NullPointerException.class, () -> List.of(1, null, 3));
}
๊ฒฐ๋ก - ๊ฐ๋ฅํ๋ฉด List.of()๋ฅผ ์ฌ์ฉํ์
๊ฒฐ๋ก ์ ์ผ๋ก Arrays.asList()๋ Array๋ก๋ถํฐ ์์ฑ๋ list ์์ element์ ๋ณ๊ฒฝ์ด ์๋ณธ array์๋ ๋ฐ์๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ฐพ๊ธฐ ์ด๋ ค์ด ๋ฒ๊ทธ๋ฅผ ๋ฐ์์ํค๋ side effects๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ JAVA 9 ์ด์์ ์ฌ์ฉํ๋ ํ๊ฒฝ์ด๋ผ๋ฉด ๋๋๋ก List.of()๋ฅผ ์ฌ์ฉํ๋๋ก ํ๊ณ , ๋ ๋ฉ์๋์ ์ฐจ์ด์ ๋ ํ์คํ ์๊ณ ์ฌ์ฉํด์ผ๊ฒ ์ต๋๋ค.
๐ [์ ์ฒด ์ฝ๋]
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
class MainTest {
@DisplayName("Arrays.asList() ์ฌ์ฉ๋ฐฉ๋ฒ")
@Test
void usageOfArraysAsList() {
Integer[] array = new Integer[]{1, 2, 3, 4};
List<Integer> list = Arrays.asList(array);
assertThat(list).containsExactly(1, 2, 3, 4);
}
@DisplayName("Arrays.asList()๋ fixed list๋ฅผ ๋ฐํํ๋ฏ๋ก add/remove ์ ์์ธ ๋ฐ์")
@Test
void fixedSizeList() {
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5);
assertThrows(UnsupportedOperationException.class, () -> list1.add(6));
List<Integer> list2 = Arrays.asList(1, 2, 3, 4, 5);
assertThrows(UnsupportedOperationException.class, () -> list2.remove(1));
}
@DisplayName("์๋ณธ ๋ฐฐ์ด ๋ณ๊ฒฝ์ด list์๋ ๋ฐ์๋จ")
@Test
void changeArrayReflectToList() {
Integer[] integerArray = new Integer[]{1, 2, 3};
List<Integer> list1 = Arrays.asList(integerArray);
integerArray[0] = 1000;
assertThat(list1.get(0)).isEqualTo(1000);
}
@DisplayName("Mutable list์ด๋ฏ๋ก list์ ๊ฐ ์์๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ณ , ๋ณ๊ฒฝ์ด ์๋ณธ array์ ๋ฐ์๋จ")
@Test
void mutableList() {
// ์์ฑ๋ list์ ๊ฐ element๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
List<Integer> list1 = Arrays.asList(1, 2, 3, 4);
list1.set(1, 1000);
assertThat(list1.get(1)).isEqualTo(1000);
// ์์ฑ๋ list์ ๋ณ๊ฒฝ์ด ์๋ณธ array์ ๋ฐ์๋๋ค.
Integer[] array = new Integer[]{1, 2, 3};
List<Integer> list2 = Arrays.asList(array);
list2.set(0,1000);
assertThat(array[0]).isEqualTo(1000);
}
@DisplayName("List.of() ์ฌ์ฉ๋ฐฉ๋ฒ")
@Test
void usageOfListOf() {
Integer[] array = new Integer[]{1, 2, 3};
List<Integer> list = List.of(array);
assertThat(list).containsExactly(1, 2, 3);
}
@DisplayName("Immutable List -> ์๋ณธ array์ ๋ณ๊ฒฝ์ด list์ ๋ฐ์๋์ง ์๊ณ , list์ ๊ฐ ์์ ๋ณ๊ฒฝ ์ ์์ธ ๋ฐ์")
@Test
void immutableList() {
Integer[] array = new Integer[]{1, 2, 3};
List<Integer> list = List.of(array);
array[0] = 1000;
assertThat(list.get(0)).isEqualTo(1);
assertThrows(UnsupportedOperationException.class, () -> list.set(1, 4));
}
@DisplayName("null ๊ฐ์ ํ์ฉํ์ง ์์")
@Test
void notAllowNullValue() {
assertThrows(NullPointerException.class, () -> List.of(1, null, 3));
}
}
References
https://www.baeldung.com/java-arrays-aslist-vs-list-of
'Javaยท๏ปฟServletยท๏ปฟJSP' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JAVA ๊ฐ๋ฐ์๊ฐ ์์์ผํ String ํด๋์ค - 1ํธ (0) | 2023.02.17 |
---|---|
[JAVA] Class ํด๋์ค๋ฅผ ์ด์ฉํด ๋ฉ์๋์ ์์ฑ์ ์ป๊ธฐ (0) | 2023.02.12 |
JAVA์์ String์ Null Safeํ๊ฒ ๋น๊ตํ๊ธฐ (0) | 2021.08.14 |
JAVA ์ ๋ค๋ฆญ(Generics) ํด๋์ค์ ๋ฉ์๋ (1) | 2020.07.11 |
JAVA์ ๊ฐ์ฒด ์ง๋ ฌํ(Serialization)์ JSON ์ง๋ ฌํ (0) | 2020.07.10 |
๋๊ธ