* 본 포스팅은 JAVA의 정석을 복습한 내용을 위주로 작성되었습니다.
Arrays
* Arrays 클래스에는 배열을 다루는데 유용한 메서드가 정의되어있음.
* Arrays에 정의된 toString( ) 메서드 -> 모든 기본형 배열과 참조형 배열 별로 하나씩 정의함.
static String toString(boolean[] a)
static String toString(byte[] a)
static String toString(char[] a)
static String toString(short[] 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)
copyOf( ), copyOfRange( )
* copyOf( ) : 배열 전체 복사
* copyOfRange( ) : 배열의 일부를 복사해서 새로운 배열 반환 -> 지정된 범위의 끝은 포함되지 않음
int[] arr = {0,1,2,3,4};
int[] arr2 = Arrays.copyOf(arr, 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); // 출력 : arr5 = [2,3] 4 는 불포함
int[] arr6 = Arrays.copyOfRange(arr, 0, 7); // 출력 : arr6 = [0,1,2,3,4,0,0]
fill( ), setAll()
* 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); //arr = [1,3,3,4,2]
* i -> (int)(Math.random() * 5) +1 : 람다식, 1~5의 범위에 속한 임의의 정수를 반환
sort( ), binarySearch( )
* sort( ) : 배열을 정렬
* binarySearch( )
- 배열에 저장된 요소를 검색
- 배열에서 지정된 값이 저장된 위치(index)를 찾아 반환
- 반드시 배열이 정렬된 상태여야 올바른 결과를 얻을 수 있다.
int [] arr = {3, 2, 0, 1, 4};
int idx = Arrays.binarySearch(arr, 2); // idx = -5 (잘못된 결과 출력)
Arrays.sort(arr); //배열 정렬
System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4]
int idx = Arrays.binarySearch(arr, 2); // idx = 2 (제대로 출력)
* 배열의 첫 번째 요소부터 순서대로 하나씩 검색 -> 순차 검색 (linear serach)
- 배열이 정렬되어 있을 필요는 없음
- 배열의 요소를 하나씩 비교하기 때문에 시간이 많이 걸림
* 배열의 검색할 범위를 반복적으로 절반씩 줄여가며 검색 -> 이진 검색 (binary serach)
- 속도가 빠름
- 배열의 길이가 10배가 늘어나도 검색 횟수는 3~4회밖에 늘어나지 않으므로 큰 배열에 유리
- 배열이 정렬이 되어있는 경우에만 사용할 수 있다는 단점이 있음.
equals( ), toString( )
* toString( )
- 배열의 모든 요소를 문자열로 편하게 출력
- 일차원 배열에만 사용
- 다차원 배열에는 deepToString( ) 메서드 사용 -> 배열의 모든 요소를 재귀적으로 접근해서 문자열 구성 (2차원뿐만 아니라 3차원 이상 다차원 배열에도 동작)
int[] arr = {0,1,2,3,4};
int[][] arr2d = {{11,12}, {21,22}};
System.out.println(Arrays.toString(arr)); // [0,1,2,3,4]
System.out.println(Arrays.deepToString(arr2d)); // [[11,12], [21,22]]
* equals( )
- 두 배열에 저장된 모든 요소 비교
- 같으면 true, 다르면 false 반환
- 일차원 배열에만 사용 가능, 다차원 배열의 비교는 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
System.out.println(Arrays.deepEquals(str2D, str2D2)); //true
- 2차원 String 배열을 equals( )로 비교하면 배열에 저장된 내용이 같은데도 false 반환
- 다차원 배열의 형태로 구성하기 때문에 equals( )로 비교하면 문자열을 비교하는 것이 아닌, 배열에 저장된 배열의 주소를 비교 -> 서로 다른 배열은 항상 주소가 다르므로 false 반환
asList(Object...a)
* 배열을 List에 담아 반환
* 매개변수의 타입이가변 인수라 배열 생성 없이 저장할 요소들만 나열하는 것도 가능
List list = Arrays.asList(new Integer[]{1,2,3,4,5}); // list = [1,2,3,4,5]
List list = Arrays.asList(1,2,3,4,5); // list = [1,2,3,4,5]
list.add(6) // UnsupportedOperationException 예외발생
- [주의] asList( )가 반환한 List의 크기를 변경할 수 없다. -> 추가 또는 삭제 불가, 내용은 변경 가능
- 크기를 변경할 수 있는 List가 필요하다면 다음과 리스트를 정의한다.
List list = new ArrayList(Arrays.asList(1,2,3,4,5));
마무리
* 컬렉션 프레임웍의 Arrays 클래스에 대해 알아보았다. 자바를 배웠더라면 누구나 알고 있을 배열에 관한 클래스인데, 의외로 생소할 수도 있을 것 같아서 깊이 공부해보았다.
'Java' 카테고리의 다른 글
[Java] 연결 리스트(LinkedList) (0) | 2023.01.03 |
---|---|
[Java] 배열(Array) 구현 (0) | 2023.01.03 |
[JAVA] String, String Builder, String Text Block (0) | 2022.04.13 |
[JAVA] Stack vs Queue (0) | 2022.03.29 |
[JAVA] Collection Framework - ArrayList 1 (0) | 2022.03.28 |