[java] Arrays 클래스

한지개·2023년 1월 31일

java

목록 보기
5/9

Arrays 클래스

  • 정렬, 항목 검색, 복사 등의 배열을 다루기 위한 다양한 메소드 제공
  • 모든 메소드는 static(정적) 메소드이므로, 객체를 생성하지 않고 바로 사용 가능

배열->문자열

리턴 타입메소드내용
StringtoString(배열)배열을 "[값1, 값2...]"와 같은 문자열로 리턴

사용 예시

String[] arr = {"h", "e", "l", "l", "o", "!"};

System.out.println(Arrays.toString(arr));
// [h, e, l, l, o, !]

배열 복사

리턴 타입메소드내용
타겟 배열copyOf(원본 배열, 복사할 길이)원본 배열의 0번 인덱스에서 복사할 길이 만큼 복사한 배열 리턴,
복사할 길이는 원본 배열보다 커도 되고, 타겟 배열의 길이가 됨
타겟 배열copyOfRange(원본 배열, 시작 인덱스, 큰 인덱스)원본 배열의 시작 인덱스에서 끝 인덱스-1 까지 복사한 배열 리턴

사용 예시(1)

String[] arr1 = {"h", "e", "l", "l", "o", "!"};

// arr1.length만큼 arr1을 arr2로 복사
String[] arr2 = Arrays.copyOf(arr1, arr1.length);

System.out.println(Arrays.toString(arr2));
// [h, e, l, l, o, !]

사용 예시(2)

String[] arr1 = {"h", "e", "l", "l", "o", "!"};

// arr1[1] ~ arr1[4]를 arr3[0] ~ arr3[3]로 복사
Stirng[] arr3 = Arrays.copyOfRange(arr1, 1, 5);

System.out.println(Arrays.toString(arr3));
// [e, l, l, o]

(+) 추가로 알아두면 좋을 메서드
System.arraycopy()
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

원본 배열 == 복사할 배열
타겟 배열 == 복사한 배열

매개값내용
Object src원본 배열
int srcPos원본 배열 시작 인덱스
복사할 항목의 시작 위치
Object dest타겟 배열
int destPos타겟 배열 시작 인덱스
타겟 배열에서의 복사 시작 위치
int length복사 길이
원본 배열 시작 인덱스에서 몇 개의 항목을 복사할 것인지

사용 예시(1)

String[] arr1 = {"h", "e", "l", "l", "o", "!"};

String[] arr2 = new String[arr1.length];

System.arraycopy(arr1, 1, arr2, 3, 2);

System.out.println(Arrays.toString(arr2));
// [null, null, null, e, l, null]

사용 예시(2)

String[] arr1 = {"h", "e", "l", "l", "o", "!"};

String[] arr3 = new String[arr1.length];

// arr1 전체를 arr4로 복사
System.arraycopy(arr1, 0, arr3, 0, arr1.length);

System.out.println(Arrays.toString(arr3));
// [h, e, l, l, o, !]

배열 비교

리턴 타입메소드내용
booleanequals(배열1, 배열2)두 배열의 얕은 비교
중첩 배열의 항목은 비교하지 않음, 1차 항목값만 비교
booleandeepEquals(배열1, 배열2)두 배열의 깊은 비교
중첩 배열의 항목까지 비교

equals(배열1, 배열2)

  • 주소값이 아닌 배열의 요소를 비교함
  • 두 배열이 동일한 타입, 동일한 수의 요소, 정렬 순서가 동일한 경우 true를 반환하고 그렇지 않으면 false를 반환함

사용 예시(1)

int[] arr1 = { 1, 2, 3 };
int[] arr2 = { 1, 2, 3 };

System.out.println(Arrays.equals(arr1, arr2));
// true

deepEquals(배열1, 배열2)

  • 다차원 배열인 경우 equals() 대신 사용

사용 예시(2)

int[][] arr1 = { {1, 2},{3, 4} };
int[][] arr2 = { {1, 2},{3, 4} };

System.out.println(Arrays.equals(arr1, arr2));
// false

System.out.println(Arrays.deepEquals(arr1, arr2));
// true

(+) 추가로 알아두면 좋을 내용
얕은 복사 vs 깊은 복사

얕은 복사
데이터를 복사할때, 복사 객체는 원본 객체와 같은 메모리 주소를 참조

int a = 1;
int b = a;

사용 예시(1)

int[][] arr1 = { {1,2}, {3,4} };
    
// 얕은 복사
int[][] arr2 = Arrays.copyOf(arr1, arr1.length);

System.out.println(Arrays.equals(arr1, arr2));
// true

System.out.println(Arrays.deepEquals(arr1, arr2));
// true

깊은 복사
데이터를 복사할때, 복사 객체는 원본 객체와 인스턴스 변수까지 복사하여 새주소에 담음

사용 예시(2)

int[][] arr1 = { {1,2}, {3,4} };
    
// 깊은 복사
int[][] arr3 = Arrays.copyOf(arr1, arr1.length);
arr3[0] = Arrays.copyOf(arr1[0], arr1[0].length);
arr3[1] = Arrays.copyOf(arr1[1], arr1[1].length);

System.out.println(Arrays.equals(arr1, arr3));
// false

System.out.println(Arrays.deepEquals(arr1, arr3));
// true


배열 정렬
오름차순

리턴 타입메소드내용
voidsort(배열)배열의 전체 항목을 오름차순으로 정렬
voidsort(배열, int start, int end)start부터 end-1까지 오름차순으로 정렬

사용 예시(1)

int [] arr1 = { 5, 3, 2, 1, 4 };
String [] arr2 = {"c", "d", "e", "b", "a"};

// sort 오름차순 정렬
Arrays.sort(arr1);
Arrays.sort(arr2);

System.out.println(Arrays.toString(arr1));
// [1, 2, 3, 4, 5]

System.out.println(Arrays.toString(arr2));
// [a, b, c, d, e]

사용 예시(2)

int [] arr1 = { 5, 3, 2, 1, 4 };
String [] arr2 = {"c", "d", "e", "b", "a"};

// sort 인덱싱 정렬
Arrays.sort(arr1, 2, 5);
Arrays.sort(arr2, 2, 5);

System.out.println(Arrays.toString(arr1));
// [5, 3, 1, 2, 4]

System.out.println(Arrays.toString(arr2));
// [c, d, a, b, e]

내림차순

  • 반복문으로 배열을 뒤에서부터 꺼내 담아주는 방식을 사용할 수도 있음
  • byte, char, double, short, long, int, float같은 PrimitiveType의 배열에는 적용이 불가능하니 Integer같은 Wrapper "Class"를 이용해야 함
리턴 타입메소드내용
voidsort(배열, Collections.reverseOrder())배열의 전체 항목을 내림차순으로 정렬
voidsort(배열, Comparator.reverseOrder())``
voidsort(배열, int start, int end, Collections.reverseOrder())start부터 end-1까지 내림차순으로 정렬
voidsort(배열, int start, int end, Comparator.reverseOrder())``

사용 예시(1)

Integer[] arr1 = { 5, 3, 2, 1, 4 };
String [] arr2 = {"c", "d", "e", "b", "a"};

// sort 내림차순 정렬
Arrays.sort(arr1, Collections.reverseOrder());
Arrays.sort(arr2, Collections.reverseOrder());

System.out.println(Arrays.toString(arr1));
// [5, 4, 3, 2, 1]

System.out.println(Arrays.toString(arr2));
// [e, d, c, b, a]

사용 예시(2)

Integer[] arr1 = { 5, 3, 2, 1, 4 };
String [] arr2 = {"c", "d", "e", "b", "a"};

// sort 인덱싱 내림차순 정렬
Arrays.sort(arr1, 2, 5, Comparator.reverseOrder());
Arrays.sort(arr2, 2, 5, Comparator.reverseOrder());

System.out.println(Arrays.toString(arr1));
// [5, 3, 4, 2, 1]

System.out.println(Arrays.toString(arr2));
// [c, d, e, b, a]

배열 검색

  • Arrays.sort() 메소드로 정렬을 한 후,
    Arrays.binarySearch() 메소드로 원하는 항목의 인덱스 값을 찾음
    (정렬을 하지 않은 후에 binarySearch() 메소드를 사용하거나, 없는 항목을 찾으면 음수값이 리턴)
리턴 타입메소드내용
intbinarySearch(배열, 찾는값)전체 배열 항목에서 찾는값의 인덱스 리턴

사용 예시

String[] arr1 = {"h", "e", "l", "l", "o", "!"};

Arrays.sort(arr1);

System.out.println(Arrays.toString(arr1));
// [!, e, h, l, l, o]

System.out.println(Arrays.binarySearch(arr1, "l"));
// 4 -> 중복이 있다면 맨 마지막으로 나온 값의 인덱스를 리턴

배열 항목 채우기

리턴 타입메소드내용
voidfill(배열, 값)전체 배열 항목에 동일한 값을 저장
voidfill(배열, int start, int end, 값)start부터 end-1까지의 항목에만 동일한 값을 저장

사용 예시(1)

String[] arr1 = {"h", "e", "l", "l", "o", "!"};

String[] arr2 = new String[arr1.length];

Arrays.fill(arr2, "x");

System.out.println(Arrays.toString(arr2));
// [x, x, x, x, x, x]

사용 예시(2)

String[] arr1 = {"h", "e", "l", "l", "o", "!"};

String[] arr2 = new String[arr1.length];

Arrays.fill(arr2, 2, 5, "x");

System.out.println(Arrays.toString(arr2));
// [null, null, x, x, x, null]
profile
평생 소원이 누룽지

0개의 댓글