본문 바로가기
DEV/Java

[자바] Arrays

by 어쩌다개발 2023. 2. 14.
반응형

Arrays 클래스에는 배열을 다루는데 유용한 메서드가 정의되어 있다.

참고로 Arrays 에 정의된 메서드는 모두 static이다.

배열의 복사 - 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, () -> (int)(Math.random() * 5) + 1); arr = [1, 5, 2, 1, 1]

 

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

sort() 배열을 정렬할 때
binarySearch() 배열에 저장된 요소를 검색할 때 사용되는데 배열에서 지정된 값이 저장된 index를 찾아서 반환한다 이 때 반드시 배열이 정렬된 상태이어야 올바른 결과를 얻는다. 만일 검색한 값과 일치하는 요소들이 여러개 있다면, 이 중에서 어떤 것의 위치가 반환될지 알 수 없다.
int[] arr = {3, 2, 0, 1, 4};
int idx = Arrays.binarySearch(arr, 2); //idx = -5 -> 잘못된 결과

Arrays.sort(arr); //배열 arr을 정렬
System.out.println(Arrays.toString(arr)); //[0, 1, 2, 3, 4]
int idx = Arrays.binarySearch(arr, 2); //idx = 2 -> 올바른 결과

배열의 첫 번 째 요소부터 순서대로 하나씩 검색하는 것을 순차 검색이라고 한다. 이 검색 방법은 배열이 정렬되어 있을 필요는 없지만 배열의 요소를 하나씩 비교하기 때문에 시간이 많이 걸린다. 반면에 이진 검색은 검색할 범위를 반복적으로 절반씩 줄여가면서 검색하기 때문에 검색속도가 빠르다. 배열이 정렬되어 있는 경우를 전제로 큰 배열의 검색에 유리하다.

 

배열의 비교와 출력 - equals(), toString()

equals() 두 배열에 저장된 모든 요소를 비교해서 같으면 true, 다르면 false를 반환한다. 일차원 배열에만 사용가능하므로, 다차원배열 비교에는 deepequals()를 사용해야 한다.
toString()  배열의 모든 요소를 문자열로 편하게 출력할 수 있다. 일차원 배열에만 사용할 수 있고 다자원 배열에는 deepTo Sstring()을 사용해야한다. deepToString()은 배열의 모든 요소를 재귀적으로 접근해서 문자열을 구성하므로 2차원뿐만 아니라 3차원 이상의 배열에서도 동작한다.
//equals()
Stringp[][] str2D = new String[][]{{"aaa","bbb"},{"AAA","BBB"}};
Stringp[][] str2D2 = new String[][]{{"aaa","bbb"},{"AAA","BBB"}};

//false -> 배열에 저장된 배열의 주소를 비교하게 되므로 false로 결과를 얻는다.
System.out.println(Arrays.equals(str2D, str2D2)); 
System.out.println(Arrays.deepEquals(str2D, str2D2)); //true

//toString()
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]]

 

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

asList() 배열을 List에 담아서 반환한다. 매개변수의 타입이 가변이수라서 배열 생성없이 저장할 요소들만 나열하는 것도 가능
//list = [1, 2, 3, 4, 5]
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.add(6); //UnsupportedOperationException 예외 발생

주의할 점은 asList()가 반환한 List의 크기를 변경할 수 없다. 즉, 추가 또는 삭제가 불가능하다. 내용 변경은 가능하다.

만일 크기를 변경할 수 있는 List가 필요하다면 다음과 같이 작성하면 된다.

List list = new ArrayList(Arrays.asList(1, 2, 3, 4, 5));

 

paralleIXXX(), spliterator(), stream()

'parallel'로 시작하는 이름의 메서들이 있는데, 이 메서들은 보다 빠른 결과를 얻기 위해 여러 쓰레드가 작업을 나누어 처리하도록 한다. splitoerator()는 여러 쓰레드가 처리할 수 있게 하나의 작업을 여러 작업으로 나누는 Spliterator를 반환하며, stream()은 컬렉션을 스트림으로 변환한다.

 

 

참고] 자바의 정석

반응형

'DEV > Java' 카테고리의 다른 글

[자바] HashSet  (7) 2023.02.15
[자바] Comparator 와 Comparable  (3) 2023.02.14
[자바] Stack(스택)과 Queue(큐)  (3) 2023.02.12
[자바] LinkedList  (3) 2023.02.11
[자바]ArrayList  (6) 2023.02.06

댓글