다시 한번 안녕하세요! :) 지난 강의에서 우리는 배열 (Java 배열)과 같은 데이터 구조에 대해 알게 되었고, 배열을 생성하고 데이터로 채우는 방법과 메모리에 저장하는 방법도 배웠습니다. 오늘은 실제 작업에서 자주 접하게 되는 배열 작업의 몇 가지 작업과 예를 살펴보겠습니다. 예를 들어, 다음 상황을 상상해 보세요. 무작위 순서로 쓰여진 10개의 숫자 배열이 있습니다.
//array Java, example
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
우리의 임무는 이 배열을 가장 작은 숫자부터 가장 큰 숫자까지 오름차순으로 정렬하는 것입니다. 결국 다음과 같아야 합니다.
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
어떻게 해야 할까요? 이 작업은 결코 간단하지 않습니다. 우리는 이전에 이것을 해본 적이 없습니다 :/ 어떤 아이디어가 있습니까? 맞춰봐. 예를 들어 우리가 할 수 있는 일은 다음과 같습니다.
- 배열의 모든 요소를 반복합니다. 각 요소를 다음 요소(
[0]
with[1]
,[1]
with[2]
,[2]
with[3]
등)와 비교합니다. 현재 배열 요소가 다음 요소보다 크면 이를 교환하고 다음 요소로 이동합니다. 그렇지 않다면 그대로 두고 계속 진행하세요. - 따라서 배열의 요소를 처음 통과한 후 가장 큰 값(167)이 마지막 셀에 있음이 보장됩니다.
- 이제 index 가 있는 요소부터 시작하여
[0]
끝에서 두 번째 요소(가장 큰 숫자가 이미 해당 위치에 있음)까지 배열의 모든 요소를 다시 살펴보고 동일한 비교 및 교환을 수행해 보겠습니다.
마지막으로 두 번째 셀에서는 두 번째로 높은 값(99)을 갖게 됩니다. - 배열에 마이너스 1개의 요소가 있는 만큼 이 작업을 반복해 보겠습니다.
public class Main {
public static void main(String[] args) {
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
for (int i = numbers.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
/* Compare the elements in pairs,
if they are in the wrong order,
then swap them */
if (numbers[j] > numbers[j + 1]) {
int tmp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = tmp;
}
}
}
}
}
음... 좀 복잡해 보이네요 -_- 일반적인 동작 원리는 분명해 보여도 이렇게 간단해 보이는 작업을 해결하려면 꽤 많은 코드를 작성해야 합니다. 좋아요, 어쩌면 우리가 우리 자신을 과대평가한 게 아닐까요? 아마도 지금까지 우리가 맡은 임무는 우리에게 너무 어려울 것입니다. 더 간단한 것을 시도해 봅시다. 예를 들어, 동일한 숫자 배열을 살펴보겠습니다.
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
우리의 임무는 그 내용을 다른 배열에 복사하는 것입니다.
int [] numbersCopy = new int[10];
이미 가지고 있는 어레이에 대한 지식을 사용하여 이를 어떻게 수행할 것인지 생각해 보십시오. 예를 들어, 배열을 반복 numbers
하고 해당 요소를 하나씩 다음 항목에 쓸 수 있습니다 numbersCopy
.
public class Main {
public static void main(String[] args) {
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
int [] numbersCopy = new int[10];
for (int i = 0; i < numbers.length; i++) {
numbersCopy[i] = numbers[i];
}
}
}
글쎄, 우리는 어느 정도 해냈습니다! 문제는 해결된 것 같지만, 다시 한 번 말하지만, 자주 실행해야 한다면 코드에 동일한 루프가 여러 개 있을 것입니다. 실제로 이러한 문제와 기타 문제는 Java 창시자에 의해 오랫동안 해결되어 왔으며 자체 솔루션을 위해 "바퀴를 다시 만들거나" 일부 코드를 작성할 필요가 없습니다.
Java 배열 클래스
특수 Java 클래스는 배열 작업 시 일반적인 문제를 해결하는 데 도움이 됩니다Arrays
. Java 프로그래머가 작업 중에 직면하는 가장 일반적인 문제를 해결하기 위해 이 클래스에 메서드가 추가되었습니다. 예를 들어, 우리가 해결책을 찾으려고 노력한 배열 정렬 작업은 한 줄로 해결할 수 있습니다.
public class Main {
public static void main(String[] args) {
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
Arrays.sort(numbers);
System.out.println(Arrays.toString(numbers));
}
}
이 메서드는 Arrays.sort()
배열을 정렬합니다. 게다가 여기에 내장된 알고리즘은 우리가 작성한 코드보다 훨씬 더 효율적입니다. 콘솔 출력:
[-234, -2, 16, 26, 35, 43, 80, 92, 99, 167]
참고: 배열을 문자열로 변환하기 위해 다른 클래스 메서드인 를 사용 했습니다 Arrays
. Java 배열Arrays.toString()
자체 는 . 그러니까 그냥 쓰면 toString()
System.out.println(numbers.toString());
toString()
클래스 메소드가 호출됩니다 Object
. 배열의 경우 출력은 다음과 같습니다.
[I@4554617c
이제 결론이 왜 이런 것인지 자세히 설명하지 않겠습니다. 가장 중요한 것은 이것이 분명히 우리에게 필요한 것이 아니라는 것입니다. 그러나 Arrays.toString()은 우리가 원하는 것을 수행했습니다. 그건 그렇고, 복사 문제도 수업에서 쉽게 해결됩니다 Arrays
.
public class Main {
public static void main(String[] args) {
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
int [] numbersCopy = Arrays.copyOf(numbers, numbers.length);
System.out.println(Arrays.toString(numbersCopy));
}
}
메서드에 Arrays.copyOf()
원래 배열(값을 복사해야 함)과 데이터를 복사할 새 배열의 길이를 전달합니다. 이 경우 길이를 로 표시했습니다 numbers.length
. 전체 배열을 복사하고 싶습니다. 처음 몇 개의 요소만 복사하려면 새 배열의 길이를 더 짧게 지정할 수 있습니다.
public class Main {
public static void main(String[] args) {
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
int [] numbersCopy = Arrays.copyOf(numbers, 4);
System.out.println(Arrays.toString(numbersCopy));
}
}
여기서는 새 배열의 길이를 4로 지정했습니다. 따라서 처음 4개 요소만 numbers
새 배열에 복사됩니다. 콘솔 출력:
[167, -2, 16, 99]
그건 그렇고, 배열의 일부를 복사해야 하지만 처음부터가 아니라 "중간부터" 복사해야 하는 경우 Arrays
에도 이 작업을 수행할 수 있습니다.
public class Main {
public static void main(String[] args) {
int[] numbers = {167, -2, 16, 99, 26, 92, 43, -234, 35, 80};
int [] numbersCopy = Arrays.copyOfRange(numbers, 2,6);
System.out.println(Arrays.toString(numbersCopy));
}
}
결론:
[16, 99, 26, 92]
셀 2( 포함 )부터 6( 비포함 )까지 의 숫자가 새 배열에 복사되었습니다. 또한 두 배열을 서로 비교해야 할 수도 있습니다. 메소드와 마찬가지로 toString()
배열 자체도 메소드를 대체하지 않습니다 equals()
. 따라서 이를 다음과 같이 비교하려고 하면 다음과 같습니다.
public class Main {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
int[] numbers2 = {1, 2, 3};
System.out.println(numbers.equals(numbers2));
}
}
우리는 결과를 얻습니다 false
. Object.equals()
결국 링크를 비교하는 메서드가 호출됩니다 . 물론 그들은 다릅니다! 하지만 우리는 링크가 아닌 배열의 내용을 비교해야 합니다. 이 클래스 에는 우리에게 필요한 작업을 정확하게 수행하는 Arrays
재정의된 메서드가 포함되어 있습니다 .equals()
public class Main {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
int[] numbers2 = {1, 2, 3};
System.out.println(Arrays.equals(numbers, numbers2));
}
}
결론:
true
그런데 이 클래스는 Arrays
일반 배열뿐만 아니라 2차원 배열에서도 성공적으로 작동합니다.
public class Main {
public static void main(String[] args) {
int[][] numbers = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int[][] numbersCopy = Arrays.copyOf(numbers, numbers.length);
System.out.println("Are these two-dimensional arrays equal to each other?");
System.out.println(Arrays.deepEquals(numbers, numbersCopy));
System.out.println(Arrays.deepToString(numbersCopy));
}
}
결론:
Равны ли эти двумерные массивы между собой?
true
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
보시다시피, 이 방법은 Arrays.copyOf()
2차원 배열 복사에 대처했습니다. 이 경우 2차원 배열을 복사할 때 소위 "얕은 복사"가 발생하므로 주의하시기 바랍니다. 그리고 2차원 배열을 비교하고 콘솔에 출력하기 위해 특별한 방법이 제공 deepEquals
됩니다 deepToString()
. 앞으로는 Java 제작자가 프로그래머가 작업할 때 직면하는 많은 일반적인 상황을 예견하고 이를 위해 기성 솔루션을 언어로 구현한 것을 한 번 이상 보게 될 것입니다. 이러한 솔루션을 사용하는 것은 바퀴를 재발명하는 것보다 훨씬 쉽고 편리합니다. 그렇죠? :) OracleArrays
웹사이트 의 수업 문서를 꼭 읽어보세요 . 공부에 행운이 있기를 바랍니다!
GO TO FULL VERSION