본문 바로가기
JAVA

배열 다루기(1)

by GangDev 2024. 12. 21.

배열 다루기

Java는 배열 조작을 위한 다양한 메서드를 제공합니다. 이러한 메서드들은 java.util.Arrays 클래스에 포함되어 있으며, 배열 복사, 정렬, 검색 등의 공통 작업을 수행하는 데 유용합니다.

  1. 배열 복사

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));
    }
}
  1. 이진 검색

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 + "이 배열에 없습니다.");
        }
    }
}
  1. 정수 배열에서 이진 검색: 기본적인 이진 검색 사용법을 보여줍니다.
  2. 문자열 배열에서 이진 검색: 문자열 배열에서도 이진 검색을 사용할 수 있음을 보여줍니다.
  3. 이진 검색을 위한 배열 정렬: 이진 검색을 사용하기 전에 배열을 정렬하는 과정을 보여줍니다.
  4. 이진 검색의 결과 해석: 찾고자 하는 값이 배열에 없는 경우, 그 값이 삽입되어야 할 위치를 찾는 방법을 보여줍니다.
  5. 이진 검색을 사용한 중복 값 처리: 배열에 중복 값이 있을 때, 모든 중복 값을 찾는 방법을 보여줍니다.
  6. 배열 비교

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);
    }
}
  1. 배열 채우기

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 + ")";
    }
}
  1. 배열 정렬

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