배열 다루기
Java는 배열 조작을 위한 다양한 메서드를 제공합니다. 이러한 메서드들은 java.util.Arrays
클래스에 포함되어 있으며, 배열 복사, 정렬, 검색 등의 공통 작업을 수행하는 데 유용합니다.
- 배열 복사
java.util.Arrays.copyOfRange()
메서드를 사용하여 배열의 일부를 복사할 수 있습니다:
import java.util.Arrays;
public class ArrayCopyRangeExample {
public static void main(String[] args) {
// 1. 문자열 배열 복사
String[] coffeeDrinks = {
"Affogato", "Americano", "Cappuccino", "Corretto", "Cortado",
"Doppio", "Espresso", "Frappucino", "Freddo", "Lungo", "Macchiato",
"Marocchino", "Ristretto"
};
String[] copiedDrinks = Arrays.copyOfRange(coffeeDrinks, 2, 9);
System.out.println("복사된 커피 음료: " + Arrays.toString(copiedDrinks));
// 2. 정수 배열의 일부 복사
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int[] copiedNumbers = Arrays.copyOfRange(numbers, 3, 7);
System.out.println("복사된 숫자: " + Arrays.toString(copiedNumbers));
// 3. 문자열 배열의 마지막 부분 복사
String[] fruits = {"Apple", "Banana", "Cherry", "Date", "Elderberry", "Fig", "Grape"};
String[] lastFruits = Arrays.copyOfRange(fruits, fruits.length - 3, fruits.length);
System.out.println("마지막 3개의 과일: " + Arrays.toString(lastFruits));
// 4. 전체 배열 복사
int[] scores = {85, 92, 78, 95, 88};
int[] allScores = Arrays.copyOfRange(scores, 0, scores.length);
System.out.println("모든 점수: " + Arrays.toString(allScores));
// 5. 빈 배열 생성
String[] emptyArray = Arrays.copyOfRange(coffeeDrinks, 0, 0);
System.out.println("빈 배열: " + Arrays.toString(emptyArray));
// 6. 원본 배열보다 큰 크기로 복사 (null로 채움)
String[] extendedArray = Arrays.copyOfRange(coffeeDrinks, 0, 15);
System.out.println("확장된 배열: " + Arrays.toString(extendedArray));
}
}
- 이진 검색
binarySearch()
메서드를 사용하여 배열에서 특정 값의 인덱스를 찾을 수 있습니다:
import java.util.Arrays;
public class BinarySearchExample {
public static void main(String[] args) {
// 1. 정수 배열에서 이진 검색
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int target = 7;
int index = Arrays.binarySearch(numbers, target);
if (index >= 0) {
System.out.println(target + "은 인덱스 " + index + "에 있습니다.");
} else {
System.out.println(target + "이 배열에 없습니다.");
}
// 2. 문자열 배열에서 이진 검색
String[] fruits = {"Apple", "Banana", "Cherry", "Date", "Elderberry", "Fig", "Grape"};
String targetFruit = "Date";
index = Arrays.binarySearch(fruits, targetFruit);
if (index >= 0) {
System.out.println(targetFruit + "은 인덱스 " + index + "에 있습니다.");
} else {
System.out.println(targetFruit + "이 배열에 없습니다.");
}
// 3. 이진 검색을 위한 배열 정렬
int[] unsortedNumbers = {5, 2, 8, 1, 9};
Arrays.sort(unsortedNumbers);
System.out.println("정렬된 배열: " + Arrays.toString(unsortedNumbers));
target = 8;
index = Arrays.binarySearch(unsortedNumbers, target);
if (index >= 0) {
System.out.println(target + "은 인덱스 " + index + "에 있습니다.");
} else {
System.out.println(target + "이 배열에 없습니다.");
}
// 4. 이진 검색의 결과 해석
int[] numbers2 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
target = 3;
index = Arrays.binarySearch(numbers2, target);
if (index >= 0) {
System.out.println(target + "은 인덱스 " + index + "에 있습니다.");
} else {
index = -index - 1;
System.out.println(target + "이 배열에 없습니다. 삽입 위치는 인덱스 " + index + "입니다.");
}
// 5. 이진 검색을 사용한 중복 값 처리
int[] numbers3 = {1, 2, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10};
target = 4;
index = Arrays.binarySearch(numbers3, target);
if (index >= 0) {
System.out.println(target + "은 인덱스 " + index + "에 있습니다.");
// 중복 값 찾기
int firstIndex = index;
while (firstIndex > 0 && numbers3[firstIndex - 1] == target) {
firstIndex--;
}
int lastIndex = index;
while (lastIndex < numbers3.length - 1 && numbers3[lastIndex + 1] == target) {
lastIndex++;
}
System.out.println(target + "의 모든 인덱스: " + firstIndex + "부터 " + lastIndex + "까지");
} else {
System.out.println(target + "이 배열에 없습니다.");
}
}
}
- 정수 배열에서 이진 검색: 기본적인 이진 검색 사용법을 보여줍니다.
- 문자열 배열에서 이진 검색: 문자열 배열에서도 이진 검색을 사용할 수 있음을 보여줍니다.
- 이진 검색을 위한 배열 정렬: 이진 검색을 사용하기 전에 배열을 정렬하는 과정을 보여줍니다.
- 이진 검색의 결과 해석: 찾고자 하는 값이 배열에 없는 경우, 그 값이 삽입되어야 할 위치를 찾는 방법을 보여줍니다.
- 이진 검색을 사용한 중복 값 처리: 배열에 중복 값이 있을 때, 모든 중복 값을 찾는 방법을 보여줍니다.
- 배열 비교
equals()
메서드를 사용하여 두 배열이 동일한지 비교할 수 있습니다:
import java.util.Arrays;
public class ArrayComparisonExample {
public static void main(String[] args) {
// 1. 정수 배열 비교
int[] numbers1 = {1, 2, 3, 4, 5};
int[] numbers2 = {1, 2, 3, 4, 5};
int[] numbers3 = {1, 2, 3, 4, 6};
System.out.println("numbers1과 numbers2가 같은가? " + Arrays.equals(numbers1, numbers2));
System.out.println("numbers1과 numbers3가 같은가? " + Arrays.equals(numbers1, numbers3));
// 2. 문자열 배열 비교
String[] fruits1 = {"Apple", "Banana", "Cherry"};
String[] fruits2 = {"Apple", "Banana", "Cherry"};
String[] fruits3 = {"Apple", "Banana", "Date"};
System.out.println("fruits1과 fruits2가 같은가? " + Arrays.equals(fruits1, fruits2));
System.out.println("fruits1과 fruits3가 같은가? " + Arrays.equals(fruits1, fruits3));
// 3. 불리언 배열 비교
boolean[] bools1 = {true, false, true};
boolean[] bools2 = {true, false, true};
boolean[] bools3 = {true, true, true};
System.out.println("bools1과 bools2가 같은가? " + Arrays.equals(bools1, bools2));
System.out.println("bools1과 bools3가 같은가? " + Arrays.equals(bools1, bools3));
// 4. 객체 배열 비교
Person[] people1 = {new Person("Alice", 25), new Person("Bob", 30)};
Person[] people2 = {new Person("Alice", 25), new Person("Bob", 30)};
Person[] people3 = {new Person("Alice", 25), new Person("Bob", 31)};
System.out.println("people1과 people2가 같은가? " + Arrays.equals(people1, people2));
System.out.println("people1과 people3가 같은가? " + Arrays.equals(people1, people3));
// 5. 부분 배열 비교
int[] fullArray = {1, 2, 3, 4, 5};
int[] partialArray = {2, 3, 4};
System.out.println("fullArray의 일부와 partialArray가 같은가? " +
Arrays.equals(fullArray, 1, 4, partialArray, 0, partialArray.length));
// 6. 비교 결과 해석
int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 4};
int[] arr3 = {1, 2, 3, 4};
System.out.println("arr1과 arr2가 같은가? " + Arrays.equals(arr1, arr2));
System.out.println("arr1과 arr3가 같은가? " + Arrays.equals(arr1, arr3));
System.out.println("arr1과 arr3의 일부가 같은가? " +
Arrays.equals(arr1, 0, arr1.length, arr3, 0, arr1.length));
}
}
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}
}
- 배열 채우기
fill()
메서드를 사용하여 배열의 모든 요소를 특정 값으로 채울 수 있습니다:
import java.util.Arrays;
public class ArrayFillExample {
public static void main(String[] args) {
// 1. 정수 배열 채우기
int[] numbers = new int[5];
Arrays.fill(numbers, 10);
System.out.println("정수 배열 채우기: " + Arrays.toString(numbers));
// 2. 문자열 배열 채우기
String[] fruits = new String[4];
Arrays.fill(fruits, "Apple");
System.out.println("문자열 배열 채우기: " + Arrays.toString(fruits));
// 3. 불리언 배열 채우기
boolean[] bools = new boolean[3];
Arrays.fill(bools, true);
System.out.println("불리언 배열 채우기: " + Arrays.toString(bools));
// 4. 객체 배열 채우기
Person[] people = new Person[2];
Arrays.fill(people, new Person("John", 30));
System.out.println("객체 배열 채우기: " + Arrays.toString(people));
// 5. 부분 배열 채우기
int[] partialFill = new int[7];
Arrays.fill(partialFill, 0, 3, 5);
Arrays.fill(partialFill, 3, 6, 10);
System.out.println("부분 배열 채우기: " + Arrays.toString(partialFill));
// 6. 2차원 배열 채우기
int[][] matrix = new int[3][4];
for (int[] row : matrix) {
Arrays.fill(row, 2);
}
System.out.println("2차원 배열 채우기:");
for (int[] row : matrix) {
System.out.println(Arrays.toString(row));
}
// 7. 배열 채우기와 반복문 비교
int[] fillArray = new int[5];
Arrays.fill(fillArray, 7);
int[] loopArray = new int[5];
for (int i = 0; i < loopArray.length; i++) {
loopArray[i] = 7;
}
System.out.println("fill() 사용: " + Arrays.toString(fillArray));
System.out.println("반복문 사용: " + Arrays.toString(loopArray));
// 8. 배열 채우기와 성능 비교
int[] largeArray = new int[1000000];
long startTime = System.nanoTime();
Arrays.fill(largeArray, 42);
long endTime = System.nanoTime();
System.out.println("fill() 메서드 실행 시간: " + (endTime - startTime) + " 나노초");
startTime = System.nanoTime();
for (int i = 0; i < largeArray.length; i++) {
largeArray[i] = 42;
}
endTime = System.nanoTime();
System.out.println("반복문 실행 시간: " + (endTime - startTime) + " 나노초");
}
}
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name + " (age: " + age + ")";
}
}
- 배열 정렬
sort()
메서드를 사용하여 배열을 오름차순으로 정렬할 수 있습니다:
import java.util.Arrays;
public class ArraySortExample {
public static void main(String[] args) {
// 1. 기본 정수 배열 정렬
int[] numbers = {4, 2, 7, 1, 3};
Arrays.sort(numbers);
System.out.println("정렬된 정수 배열: " + Arrays.toString(numbers));
// 2. 문자열 배열 정렬
String[] fruits = {"Banana", "Apple", "Cherry", "Date", "Elderberry"};
Arrays.sort(fruits);
System.out.println("정렬된 문자열 배열: " + Arrays.toString(fruits));
// 3. 불리언 배열 정렬
boolean[] bools = {true, false, true, false, true};
Arrays.sort(bools);
System.out.println("정렬된 불리언 배열: " + Arrays.toString(bools));
// 4. 객체 배열 정렬 (Comparable 구현)
Person[] people = {
new Person("Charlie", 28),
new Person("Alice", 25),
new Person("Bob", 30),
new Person("David", 22)
};
Arrays.sort(people);
System.out.println("정렬된 Person 배열: " + Arrays.toString(people));
// 5. 부분 배열 정렬
int[] partialSort = {5, 2, 8, 1, 9};
Arrays.sort(partialSort, 1, 4);
System.out.println("부분 정렬된 배열: " + Arrays.toString(partialSort));
// 6. 병렬 정렬 (Java 8 이상)
int[] largeArray = new int[1000000];
for (int i = 0; i < largeArray.length; i++) {
largeArray[i] = (int) (Math.random() * 1000);
}
long startTime = System.nanoTime();
Arrays.sort(largeArray);
long endTime = System.nanoTime();
System.out.println("순차 정렬 시간: " + (endTime - startTime) + " 나노초");
startTime = System.nanoTime();
Arrays.parallelSort(largeArray);
endTime = System.nanoTime();
System.out.println("병렬 정렬 시간: " + (endTime - startTime) + " 나노초");
// 7. 사용자 정의 정렬 (Comparator 사용)
String[] words = {"hello", "world", "java", "programming", "example"};
Arrays.sort(words, (a, b) -> Integer.compare(b.length(), a.length()));
System.out.println("길이 기준으로 정렬된 문자열 배열: " + Arrays.toString(words));
// 8. 2차원 배열 정렬
int[][] matrix = {
{3, 1, 4},
{1, 5, 9},
{2, 6, 5}
};
Arrays.sort(matrix, (a, b) -> Integer.compare(a[0], b[0]));
System.out.println("2차원 배열의 첫 번째 열 기준 정렬:");
for (int[] row : matrix) {
System.out.println(Arrays.toString(row));
}
}
}
class Person implements Comparable<Person> {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.age);
}
@Override
public String toString() {
return name + " (age: " + age + ")";
}
}
Java 8 이상에서는 멀티코어 시스템에서 대규모 배열을 병렬로 정렬하는 parallelSort()
메서드도 제공됩니다.
편히 모아진 글 보시려면 아래 위키독스 링크 >>
https://wikidocs.net/book/17111
'JAVA' 카테고리의 다른 글
var 키워드, 사용 예제 [코딩백과 with JAVA] (0) | 2024.12.21 |
---|---|
배열 다루기(2) [코딩백과 with JAVA] (0) | 2024.12.21 |
배열 복사 [코딩백과 with JAVA] (0) | 2024.12.21 |
배열 생성, 초기화 및 접근 [코딩백과 with JAVA] (0) | 2024.12.21 |
배열 개요 및 배열 선언 구조와 규칙 [코딩백과 with JAVA] (0) | 2024.12.21 |