/ JAVAJUNGSUK

Ch11-25~29. Arrays의 메서드

자바의 정석 기초편

0. 목차



Chapter11. 컬렉션 프레임웍

Ch11 - 25. Arrays의 메서드(1) : 복사

Ch11 - 26. Arrays의 메서드(2) : 채우기, 정렬, 검색

Ch11 - 27. Arrays의 메서드(3) : 비교와 출력

Ch11 - 28. Arrays의 메서드(4) : 변환

Ch11 - 29. Arrays의 메서드 예제



Ch11 - 25. Arrays의 메서드(1) : 복사


▶ Arrays class란?

▷ 배열을 다루기 편리한 메서드(static) 제공
  • Arrays class의 모든 메서드 = static
  • Arrays class의 모든 메서드 = util 메서드
  • Arrays class와 비슷한 클래스 : Objects, Collections, Math…

▶ Arrays class : 배열의 출력 toString()

static String toString(boolean[] a)
  • [a, b, c, d] -toString→ "[a, b, c, d]" : 오버로딩
static String toString(byte[] a)
static String toString(char[] a)
static String toString(shor[] a)
static String toString(int[] a)
static String toString(long[] a)
static String toString(float[] a)
static String toString(double[] a)
static String toString(Object[] a)


▶ Arrays class : 배열의 복사 copyOf() copyOfRange()

copyOf() copyOfRange() = 새로운 배열을 생성 후 반환
int[] arr = {0, 1, 2, 3, 4}
int[] arr2 = Arrays.copyOf(arr, arr.length)
  • arrarr[0~arr.length] 복사
  • arr2 = [0, 1, 2, 3, 4]
int[] arr3 = Arrays.copyOf(arr, 3)
  • arr3 = [0, 1, 2]
int[] arr4 = Arrays.copyOf(arr, 7)
  • arr4 = [0, 1, 2, 3, 4, 0, 0]
int[] arr5 = Arrays.copyOfRange(arr, 2, 4)
  • 2 ≤ 범위 < 4
  • arr5 = [2, 3]
int[] arr6 = Arrays.copyOfRange(arr, 0, 7)
  • 0 ≤ 범위 < 7
  • arr6 = [0, 1, 2, 3, 4, 0, 0]



Ch11 - 26. Arrays의 메서드(2) : 채우기, 정렬, 검색


▶ Arrays class : 배열 채우기 fill() setAll()

int[] arr = new int[5];
Arrays.fill(arr, 9);
  • arr = [9, 9, 9, 9, 9]
Arrays.setAll(arr, (i) -> (int)(Math.random()*5)+1);
  • 람다식, 난수(1 ≤ 범위 < 6)
  • arr = [1, 5, 2, 1, 1]

▶ Arrays class : 배열 정렬과 검색 sort() binarySearch()

int[] arr = {3, 2, 0, 1, 4};
int idx = Arrays.binarySearch(arr, 2;);
  • binarySearch() 정렬 된 배열에만 사용 가능
  • 2의 위치를 찾는 것
  • idx = -5 arr[1]에 2 있는데 왜 에러? → 배열 정렬 안 되어 있음

    binarySearch() = sort()로 배열 정렬 후 사용!


Arrays.sort(arr);int idx = Arrays.binarySearch(arr, 2);
  • 배열 arr을 정렬
  • [0, 1, 2, 3, 4]
  • idx = 2 arr[2]에 2가 있음

▶ 순차 검색 vs 이진 검색

[7, 1, 6, 9, 5, 3, 8, 4, 10, 2]

▷ 순차 검색

7 → 1 → 6 → 9 → 5 → 3 → 8 → 4 → 10 → 2

  • 10개 요소에서 1개 찾으려면 몇 번 뒤져야 하나?
  • 평균 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 / 10 = 5.5회
▷ 이진 검색(이분 검색, binarySearch)
  • 정렬 먼저 시킴
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  • 반으로 쪼갬1
    • [1, 2, 3, 4, 5] |10 > 5| [6, 7, 8, 9, 10]
    • [1, 2, 3, 4, 5]|10 > 5| [6, 7, 8, 9, 10]
    • 5보다 작은 쪽은 볼 필요 없음
  • 반으로 쪼갬2
    • [6, 7, 8] |10 > 8| [9, 10]
    • [6, 7, 8]|10 > 8| [9, 10]
    • 8보다 작은 쪽은 볼 필요 없음
    • [9, 10]
    • [10]

  • 평균 3 ~ 4회 뒤지면 요소 찾음
  • 정렬을 해야만 한다는 것이 단점



Ch11 - 27. Arrays의 메서드(3) : 비교와 출력


▶ Arrays class : 다차원 배열의 출력 deepToString()

int[] arr = {0, 1, 2, 3, 4}; // 1차원 배열
int[] arr2D = { {11, 12}, {21, 22} }; // 2차원 배열
System.out.println(Arrays.toString(arr));
  • [0, 1, 2, 3, 4]
  • 1차원 배열 출력
System.out.println(Arrays.deepToString(arr2D));
  • [11, 12], [21, 22]
  • 2차원 배열 출력

▶ Arrays class : 다차원 배열의 비교 deepEquals()

String[] str2D = new String[][]{ {"aaa", "bbb"}, {"AAA", "BBB"} };
String[] str2D2 = new String[][]{ {"aaa", "bbb"}, {"AAA", "BBB"} };
System.out.println(Arrays.equals(str2D, str2D2));
  • 1차원 배열 비교
  • false // 잘못된 결과
System.out.println(Arrays.deepEquals(str2D, str2D2));
  • 다차원 배열 비교
  • true



Ch11 - 28. Arrays의 메서드(4) : 변환


▶ Arrays class : 배열을 List로 변환 asList(Object... a)

List list = Arrays.asList(new Integer[]{1, 2, 3, 4, 5});
List list = Arrays.asList(1, 2, 3, 4, 5);
asList(Object... a)
  • (Object... a) : 가변 매개변수
  • List 특징 : 읽기 전용
list.add(6);
  • UnsupportedOperationException 발생
List list = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));
  • 새로운 ArrayList를 만듦



Ch11 - 29. Arrays의 메서드 예제


▶ 다차원 출력 Arrays.deepToString()

Arrays.toString(arr)
Arrays.deepToString(arr2D)
int[] arr = {0,1,2,3,4};
int[][]	arr2D = { {11,12,13}, {21,22,23} };

System.out.println("arr : " + Arrays.toString(arr));
System.out.println("arr2D : " + Arrays.deepToString(arr2D));

// console
arr : [0, 1, 2, 3, 4]
arr2D : [[11, 12, 13], [21, 22, 23]]


▶ 배열 복사 copyOf() copyOfRange()

Arrays.copyOf(arr, arr.length)
Arrays.copyOf(arr, 3)
Arrays.copyOf(arr, 7)
Arrays.copyOf(arr, 2, 4)
Arrays.copyOf(arr, 0, 7)
int[] arr2 = Arrays.copyOf(arr, arr.length);
int[] arr3 = Arrays.copyOf(arr, 3);          
int[] arr4 = Arrays.copyOf(arr, 7);          
int[] arr5 = Arrays.copyOfRange(arr, 2, 4); // 2 ≤ 범위 < 4
int[] arr6 = Arrays.copyOfRange(arr, 0, 7); // 0 ≤ 범위 < 7

System.out.println("arr2 : " + Arrays.toString(arr2));
System.out.println("arr3 : " + Arrays.toString(arr3));
System.out.println("arr4 : " + Arrays.toString(arr4));
System.out.println("arr5 : " + Arrays.toString(arr5));
System.out.println("arr6 : " + Arrays.toString(arr6));

// console
arr2 : [0, 1, 2, 3, 4]
arr3 : [0, 1, 2]
arr4 : [0, 1, 2, 3, 4, 0, 0]
arr5 : [2, 3]
arr6 : [0, 1, 2, 3, 4, 0, 0]


▶ 배열 채우기 fill() setAll()

Arrays.fill(arr7, 9)
int[] arr7 =  new int[5];

Arrays.fill(arr7, 9);

System.out.println("arr7 : " + Arrays.toString(arr7));

// console
arr7 : [9, 9, 9, 9, 9]
Arrays.fill(arr7, 9)
Arrays.setAll(arr7, i -> (int)(Math.random()*6)+1); // 람다식

System.out.println("arr7 : " + Arrays.toString(arr7));

// console
arr7 : [1, 2, 4, 2, 2]


▶ 향상 된 for문 for (int i : arr) { } + fill()

for (int i : arr7) { }
for (int i : arr7) { }

// 풀어쓰면
for (int x = 0; x < arr7.length; x++) {
  int i = arr7[x];
}
for (int i : arr7) { } + fill()
System.out.println("arr7 : " + Arrays.toString(arr7));

for(int i : arr7) {
  char[] graph = new char[i];

  Arrays.fill(graph, '♡');

  System.out.println(new String(graph)+i);
}

// console
arr7 : [5, 1, 3, 6, 5]
♡♡♡♡♡5
1
♡♡♡3
♡♡♡♡♡♡6
♡♡♡♡♡5


▶ 다차원 배열 비교 deepEquals()

String[][] str2D = new String[][]{ {"aaa","bbb"}, {"AAA","BBB"} };
String[][] str2D2 = new String[][]{ {"aaa","bbb"}, {"AAA","BBB"} };
Arrays.deepEquals(str2D, str2D2)
System.out.println(Arrays.equals(str2D, str2D2));
System.out.println(Arrays.deepEquals(str2D, str2D2));

// console
false // 잘못된 결과, 다차원 배열은 equals() 안됨
true


▶ 이분 검색 binarySearch()

char[] chArr = { 'A', 'D', 'C', 'B', 'E' };
binarySearch()전 반드시! Arrays.sort(chArr); 정렬!!
Arrays.binarySearch(chArr, 'B')
Arrays.sort(chArr);
System.out.println("chArr : " + Arrays.toString(chArr));
System.out.println("index of B : " + Arrays.binarySearch(chArr, 'B'));

// console
chArr : [A, B, C, D, E]
index of B : 1 // chArr[1]에 B가 있다는 것