
지금까지 배열을 다룰 때 우리는 배열 자체를 출력했다기보다는, 배열 안에 들어 있는 element들을 하나씩 꺼내 출력해왔다.
실제로 System.out.println(arr);처럼 배열을 바로 출력하면 값이 아니라 주소값이 출력된다는 것을 확인할 수 있다.
그래서 배열의 내용을 확인하려면 반복문을 사용해서 element를 하나씩 출력해야 했는데, 값을 가공할 필요 없이 “배열에 값이 제대로 들어갔는지만 확인하고 싶은 경우”에도 매번 반복문을 작성해야 하는 점이 조금 비효율적으로 느껴진다.
이럴 때 사용할 수 있는 것이 Arrays 클래스이다.
Arrays.toString(배열명)을 사용하면 배열 전체를 한 번에 문자열 형태로 출력할 수 있다.
여기서 중요한 점은 Arrays.toString()이 객체를 생성해서 사용하는 방식이 아니라, 클래스명.메서드명() 형태로 호출되는 정적(static) 메서드라는 점이다.
이는 우리가 지금까지 사용해왔던 scanner.nextLine()처럼 객체를 통해 메서드를 호출하는 방식과 차이가 있다.
같은 메서드 이름이라도 어떤 클래스에 속해 있느냐에 따라 전혀 다른 역할을 할 수 있다는 점도 함께 확인할 수 있다.
Random random = new Random();
Scanner scanner = new Scanner(System.in);
int num1 = random.nextInt();
System.out.print("숫자를 입력하세요: ");
int num2 = scanner.nextInt();
System.out.println(num1);
System.out.println(num2);
위 코드에서 nextInt()라는 메서드는 동일하지만,
random.nextInt()는 임의의 정수를 생성하고scanner.nextInt()는 콘솔에서 정수를 입력받는다즉, 메서드 이름이 같더라도 소속된 클래스가 다르면 동작은 완전히 달라질 수 있다는 점을 알 수 있다.
int[] numbers = {1,2,3,4,5,6,7,8,9,10};
System.out.println(Arrays.toString(numbers));
Arrays.toString()은 배열 내부의 element들을 순서대로 문자열로 만들어 반환한다.
따라서 단순히 배열 상태를 확인할 때는 반복문 없이도 간단하게 출력할 수 있다.
Integer[] nums = {3,6,7,1,9,2,10,5,4,8};
System.out.println("정렬 전 배열: " + Arrays.toString(nums));
Arrays.sort(nums);
System.out.println("오름차순 정렬 후 배열: " + Arrays.toString(nums));
Arrays.sort()를 직접 확인해보면 return 타입이 void라는 것을 알 수 있다.
이 말은 즉, 정렬된 새로운 배열을 반환하는 것이 아니라 기존 배열 자체를 변경한다는 의미이다.
그래서 Arrays.sort(nums)를 System.out.println() 안에서 바로 사용할 수 없는 것이다.
Arrays.sort(nums, Comparator.reverseOrder());
System.out.println("내림차순 정렬 후 배열: " + Arrays.toString(nums));
오름차순 정렬에서는 argument가 하나였는데, 내림차순 정렬에서는 argument가 두 개로 늘어났다.
이는 같은 이름의 메서드라도 매개변수 구성이 다르면 다른 메서드로 동작하는 메서드 오버로딩의 예시이다.
또한 Comparator.reverseOrder()의 반환값이 sort()의 두 번째 argument로 전달된다는 점에서, 함수를 값처럼 사용하는 구조라는 것도 함께 확인할 수 있다.
다만 이 방식은 기본 자료형 배열(int[])에서는 사용할 수 없고, 래퍼 클래스 배열(Integer[])에서만 가능하다.
Random random = new Random();
Integer[] numbers = new Integer[10];
for (int i = 0; i < numbers.length; i++) {
numbers[i] = random.nextInt();
}
Arrays.sort(numbers);
Arrays.sort(numbers, Comparator.reverseOrder());
for (Integer number : numbers) {
System.out.print(number * 10 + " / ");
}
이 예제에서는
하는 전체 흐름을 한 번에 확인할 수 있다.
배열 출력은 단순히 반복문으로만 해결해야 하는 문제가 아니라, 상황에 따라 Arrays.toString() 같은 도구를 활용하면 코드를 훨씬 간결하게 만들 수 있다.
또한 같은 메서드 이름이라도 어떤 클래스에 속해 있는지, 어떤 매개변수를 받는지에 따라 동작 방식이 달라진다는 점을 이번 예제를 통해 확실히 정리할 수 있었다.
이런 개념들이 쌓여서 나중에 라이브러리나 프레임워크 코드를 읽을 때 구조를 이해하는 데 큰 도움이 될 것 같다.