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ⁿ)
'Java' 카테고리의 다른 글
Java 컬렉션(Collection) - Set(집합) HashSet, TreeSet (0) | 2023.01.03 |
---|---|
Java Comparable, Comparator 인터페이스 (0) | 2023.01.03 |
Java Iterator, ListIterator, Enumeration 인터페이스 (0) | 2023.01.03 |
Java 스택과 큐 (0) | 2023.01.03 |
Java 컬렉션 프레임워크(collections framework) (0) | 2023.01.02 |