반응형

Arrays - 배열을 다루기 편리한 메서드(static) 제공

 

Arrays클래스는 배열을 다루는데 편리한 메서드를 제공한다.
Arrays클래스가 제공하는 메서드는 모두 static이다.  비슷한 예시로는 Math, Objects, Collections클래스등이 있다.

 

1. 배열의 출력 - toString()

toString()은 매개변수로 배열을 넣어주면, 배열의 내용을 문자열로 반환한다.
그리고 여러가지 배열타입으로 오버로딩 되어있다.

 

 

2. 배열의 복사 - copyOf(), copyOfRange()


배열 복사하는 것은 System 클래스에 있는 arraycopy()라는 메서드가 있는데,

이런식으로 사용한다. 일단 System.arraycopy() 메서드는 이런거구나 하고 넘어가자.(차이는 나중에 다른 장에서 알아볼 예정)

copyOf(), copyOfRange()는 배열을 복사하는 것인데,
copyOf(), copyOfRange()는 새로운 배열을 생성해서 반환해준다.
int[] arr = {0, 1, 2, 3, 4}라는 배열이 있을 때,
copyOf(arr, arr.length)를 사용하면,  arr배열에서 arr.length개를 복사해서, 새로운 배열을 만들어서 반환해준다.
즉 arr2를 새로만들고 {0, 1, 2, 3, 4}를 담아준다.
copyOf(arr, 3)이면  {0, 1, 2}를 반환해준다.
arr이 데이터가 5개있는데 copyOf(arr, 7)을 하면, {0,1, 2, 3, 4, 0, 0}처럼 존재하는 데이터 이외의 것에 대해서는 0으로 채워준다.
copyOfRange(ar, 2, 4)는 인덱스 2~3의 것을 복사해서 새로운 배열에 넣어준다.

 

 

3. 배열 채우기 - fill(), setAll()

fill()이라는 메서드는 배열을 채우는 것이다.

예를 들어 int[] arr = new int[5]; 즉, arr 배열에 5개의 공간이 0으로 초기화 되어있을 떄,
Arrays.fill(arr, 9); 를 하면, arr을 전부 9로 채워서 {9, 9, 9, 9, 9}를 반환한다.

Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1);은 람다식을 이용해서 랜덤값으로 채우는 것이다.
난수로 채우는데, 난수의 범위가 1<= x < 6 사이에 있는 난수를 채우는 것이다.

 

 

4. 배열의 정렬과 검색 - sort(), binarySearch()

sort()를 사용하면 쉽게 정렬할 수 있다.
binarySearch() 메서드는 검색을 할 때 사용한다. 이진탐색 또는 이진검색이라고 한다.

int[] arr = {3, 2, 1, 0, 1, 4};가 있을 때,
int idx = Arrays.binarySearch(arr, 2);는 arr배열에서 2가 어디있는지 찾는 문장이다.
찾고자 하는 데이터가 존재하는 인덱스를 반환한다.

단, 이진탐색은 데이터가 정렬되어있을때만 사용가능하다.

즉, arr상태 그대로 사용하면 잘못된 결과를 반환한다.

그래서, 이진 탐색을 사용하기 전에 arr을 sort()로 정렬해준 뒤, 이진탐색을 수행해야한다.
Arrays.sort(arr);를 하면 [0, 1, 2, 3, 4]가 된다.
그후에 이진탐색을 수행하면,
결과는 2가 있는 인덱스를 반환한다. 2는 인덱스 2에 있으므로 인덱스 2를 반환한다.

 

 

5. 다차원 배열의 출력 - deepToString()

deepToString()은 다차원 배열을 출력할때 사용한다.

int[] arr = {0, 1, 2, 3, 4];는 1차원 배열이므로
Arrays.toString(arr) 을 이용하면 된다.

그러나, int[][] arr2D = {{11, 12}, {21, 22}}; 는 2차원 배열(다차원배열)이므로
Arrays.deepToString(arr2D)) 를 사용하면 된다.

 

 

6. 다차원 배열의 비교 - deepEquals()

1차원 배열을 비교할 때는, Arrays.equals()를 사용하면 되지만,

다차원 배열을 비교할 때Arrays.deepEquals(str2D, str2D2));를 사용한다.

 

 

7. 배열을 List로 변환 - asList(Object... a)

asList(Object... a) 메서드는 배열을 List로 변환해준다.
asList(Object...
a)메서드는 매개변수가 가변 매개변수이다. 배열을 넣거나, 배열요소를 나열하면 된다.

List list = Arrays.asList(new Integer[]{1, 2, 3, 4, 5}}; 이렇게 사용하거나,
List list = Arrays.asList(1, 2, 3, 4, 5); 이렇게 사용하면 된다.

그런데, 반환된 List의 특징이 읽기전용이다. 그래서 list.add(6); 으로 6을 추가하려고하면,
UnsupportedOperationException 지원하지않는 기능이라는 예외가 발생한다.

그래서, 만약 asList()로 반환된 List를 변경하고 싶다면,
List list = new ArrayList(Arrays.asList(1, 2, 3, 4, 5)); 처럼
ArrayList생성자에 Arrays.asList()로 생성된 읽기전용 List를  넣어줘야한다.

그러면, Arrays.asList(1, 2, 3, 4, 5);를 내용으로 하는 새로운 ArrayList가 만들어져서
변경이 가능하게 된다.

 

 

8. 람다와 스트림(14장) 관련 - parallelXXX(), spliterator(), stream()

 

parallelXXX()에서 XXX는 뒤에 이름이 여러개가 온다는 의미로 작성했다.
parallel로 시작하는 메서드들이라는 뜻이고,

parallelXXX() 그리고 spliterator(), stream() 메서드는 람다와 스트림과 관련된 메서드이다.

14장에서 자세히 다룰 것이다.

 

이제 예제를 살펴보자.

[Ex11_6]

반응형

'JAVA' 카테고리의 다른 글

HashSet (1)  (0) 2022.05.01
Comparator와 Comparable  (0) 2022.05.01
Iterator, Enumeration, Map과 Iterator  (0) 2022.04.29
Stack, Queue 활용  (0) 2022.04.29
Stack과 Queue  (0) 2022.04.28