본문 바로가기

Java

Java Arrays 클래스(Arrays Class)

 

1. Arrays 클래스

- 배열을 편리하게 다루기 위한 static 메서드 제공

 

 

2. Arrays클래스의 메서드 종류

- 같은 기능의 메서드가 배열의 타입만 다르게 오버라이딩 되어 있음

 

1) 배열의 복사

- copyOf(배열명): 배열 전체 복사

- copyOfRange(배열명, 시작 인덱스, 끝 인덱스+1): 배열의 일부를 복사해서 새로운 배열을 만들어 반환, 지정된 범위의 끝은 포함하지 않음

int[] arr = {0,1,2,3,4};
int[][]	arr2D = {{11,12,13}, {21,22,23}};

// 배열의 복사 copyOf()
int[] arr2 = Arrays.copyOf(arr, arr.length); // arr 배열에서, arr배열 길이만큼
int[] arr3 = Arrays.copyOf(arr, 3);          // arr 배열에서, 3개
int[] arr4 = Arrays.copyOf(arr, 7);          // arr 배열에서, 7개(요소가 없는 경우 0으로 채워서 넣음)

// 배열의 복사 copyOfRange()
int[] arr5 = Arrays.copyOfRange(arr, 2, 4);  // arr 배열에서, 2 <= x < 4 
int[] arr6 = Arrays.copyOfRange(arr, 0, 7);  // arr 배열에서, 0 <= x < 7

 

 

2) 배열 채우기

- fill(배열명, 지정값): 배열의 모든 요소를 지정된 값으로 채움

- setAll(배열명, 식): 배열을 채우는데 사용할 매개변수로 함수형 인터페이스를 구현한 객체 또는 람다식을 받음

int[] arr7 =  new int[5];

// 특정 값으로 채우기 fill()
Arrays.fill(arr7, 9);  // 결과값: arr=[9,9,9,9,9]

// 람다식을 이용해서 채우기 setAll()
Arrays.setAll(arr7, i -> (int)(Math.random()*6)+1);
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);
}

 

3) 배열의 정렬과 검색

- sort(배열명): 배열 정렬

- binarySearch(배열명, 지정값): 배열에 저장된 요소 검색, 지정된 값이 저장된 인덱스를 찾아서 반환

* binarySearch의 주의사항: 배열이 정렬된 상태여야 올바른 결과를 얻기 때문에 정렬 필수, 지정한 값이 여러개인 경우 어떤 것의 위치가 반환될 지 알 수 없음

char[] chArr = { 'A', 'D', 'C', 'B', 'E' };	

System.out.println("= 배열 확인 =");
System.out.println("chArr="+Arrays.toString(chArr));
System.out.println("");


System.out.println("= Before Sorting =");
System.out.println("index of B ="+Arrays.binarySearch(chArr, 'B'));
System.out.println("");

// binarySearch() 메서드 사용 전 정렬 필수		
System.out.println("= After sorting =");
Arrays.sort(chArr);
System.out.println("chArr="+Arrays.toString(chArr));
System.out.println("index of B ="+Arrays.binarySearch(chArr, 'B'));

 

 

 

4) 문자열의 비교

- equals(): 1차원 배열 비교

- deepEquals(): 다차원 배열 비교

String[][] str2D  = new String[][]{{"aaa","bbb"},{"AAA","BBB"}};
String[][] str2D2 = new String[][]{{"aaa","bbb"},{"AAA","BBB"}};

System.out.println(Arrays.equals(str2D, str2D2));     // false, 2차원 배열을 equals로 비교했기 때문에 false(내용이 같아도 배열의 주소가 다르기 때문)
System.out.println(Arrays.deepEquals(str2D, str2D2)); // true

 

 

5) 배열의 모든 요소 문자열로 출력

- toString(): 1차원 배열 출력

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

int[] arr = {0,1,2,3,4};
int[][]	arr2D = {{11,12,13}, {21,22,23}};

// 배열의 출력 toString()
System.out.println("arr="+Arrays.toString(arr)); // 결과값: arr=[0, 1, 2, 3, 4]

// 다차원 배열의 출력 deepToString()
System.out.println("arr2D="+Arrays.deepToString(arr2D)); // 결과값: arr2D=[[11, 12, 13], [21, 22, 23]]

 

6) 배열을 List로 변환

- asList(object...a): 배열을 List에 담아서 반환

List list = Arrays.asList(new Integer[] {1, 2, 3, 4, 5});
List list2 = Arrays.asList(1, 2, 3, 4, 5);

// list.add(6); // Error. asList()가 반환한 List의 크기 변경 불가(추가, 삭제 불가, 저장 내용 변경은 가능), java.lang.UnsupportedOperationException 발생

// 크기를 변경해야하는 List가 필요한 경우, 아래와 같이 Array리스트 생성하여 사용
List list3 = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));
list3.add(6);

 

7) 그 외 메서드

- 람다와 스트림 관련 parallelXXX(), spliterator(), stream() <- 14장에서 자세히 배움

 

 

 

3. 데이터 탐색(검색)

방법 시간복잡도 설명
순차탐색 O(n) - 정렬되지 않은 데이터를 순차적으로 탐색
- 하나의 레코드씩 차례로 키 값이 같은지 비교하여 찾음
이진 탐색 O(log₂n) - 정렬이 된 데이터를 탐색
- 한번의 비교로 탐색 대상이 반으로 감소(속도 빠름)
- 고정된 데이터에 사용하기 적합(데이터 삽입이나 삭제가 빈번할 시 적합하지 않음)
이진 탐색 트리 균형:O(log₂n)
불균형:O(n)
- 정렬되지 않은 데이터 탐색
- 첫 번째 삽입되는 데이터가 루트가 됨
- 부노드를 기준으로 자노드 값이 크면 오른쪽, 작으면 왼쪽에 배치
- 키 입력 순서에따라 규현일 수도 불균형일 수도 있음
- 중위 순회하면항상 오름차순으로정렬된 결과를 얻음
해싱 완전해싱: O(1)
충돌발생:O(n)
- 주소를 계산하여 데이터 탐색
- 비교없이 탐색 가능한 방법(값을 비교하는 것이 아닌 해시 함수로 해시 주소를 얻는 것으로 탐색)

 

시간복잡도 좀 더 알아보기👇🏻

더보기

시간복잡도: 연산의 개수를 입력 개수 n의 함수로 나타낸 것

공간복잡도: 매번 필요로 하는 메모리의 크기를 문제의 크기에 대한 함수로 표현한 것(실행 시 사용되는 메모리 양을 나타냄)

Big-O 표기법: 불필요한 연산을 제거하여 알고리즘 분석을 쉽게 할 목적으로 사용됨, 빅오로 시간 복잡도와 공간복잡도를 측정

O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(n³) < O(2ⁿ) < O(n!) < O(nⁿ)