# Table of Contents

# 배열

배열(Array)은 같은 자료형의 데이터를 한꺼번에 관리하는데 사용한다.

# 배열 사용하기

배열은 다음과 같이 두 가지 방법으로 선언하고 초기화한다.

String[] players = new String[3];
String players[] = new String[3];

각 요소에 초기화되는 값은 다음과 같다.

String[] strArr = new String[3];  // [null, null, null]

int[] intArr = new int[3];  // [0, 0, 0]

boolean[] boolArr = new boolean[3];  // [false, false, false]

double[] douArr = new double[3];  // [0.0, 0.0, 0.0]

배열을 초기화할 때 데이터를 직접 넣어줄 수 있다.

String[] players = {"Ronaldo", "Kane", "Benzema"};

배열의 각 요소에는 []를 사용하여 접근할 수 있다.

players[0] = "Ronaldo";
players[1] = "Kane";
players[2] = "Benzema";

System.out.println(players[0]);     // Ronaldo

다음과 같이 데이터를 수정할 수 있다.

players[0] = "Messi";

.length 속성으로 배열의 크기를 알아낼 수 있다.

String[] players = {"Ronaldo", "Kane", "Benzema"};

int length = players.length;    // 3

배열은 인스턴스가 생성될 때 크기가 설정되므로 동적으로 데이터를 추가하거나 삭제할 수 없다. 데이터를 동적으로 추가하거나 삭제할 때는 List를 사용한다.

# Arrays 클래스

Arrays클래스는 배열을 조작하기 위한 여러가지 메소드를 제공한다.

# fill()

fill()은 배열의 모든 요소를 동일한 값으로 채운다.




 


int[] array = new int[5];
System.out.println(Arrays.toString(array));     // [0, 0, 0, 0, 0]

Arrays.fill(array, 3);
System.out.println(Arrays.toString(array));     // [3, 3, 3, 3, 3]

# setAll()

setAll()은 함수형 인터페이스로 배열을 채운다.



 
 
 



int[] arr = new int[5];

Arrays.setAll(arr, (index) -> { 
    return index*2; 
});

System.out.println(Arrays.toString(arr));   // [0, 2, 4, 6, 8]

# copyOf()

copyOf()는 배열을 깊은 복사할 때 사용한다.









 



int[] origin = {1, 2, 3, 4, 5};

// 얕은 복사
int[] shallow = origin;
System.out.println(origin.hashCode());          // 1163157884
System.out.println(shallow.hashCode());         // 1163157884

// 깊은 복사
int[] deep = Arrays.copyOf(origin, origin.length);
System.out.println(origin.hashCode());          // 1163157884
System.out.println(deep.hashCode());            // 1956725890

# copyOfRange()

copyOfRange()는 배열의 일부 요소만을 깊은 복사할 때 사용한다.



 



int[] array = {1, 2, 3, 4, 5};

int[] copy = Arrays.copyOfRange(array, 1, 3);

System.out.println(Arrays.toString(copy));  // [2, 3]

# equals()

equals()은 1차원 배열을 비교할 때 사용한다.

int[] arr1 = {1, 2, 3, 4 ,5};
int[] arr2 = {1, 2, 3, 4 ,5};
int[] arr3 = {6, 7, 8, 9, 10};

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

# deepEquals()

deepEquals()은 다차원 배열을 비교할 때 사용한다.

int[][] arr1 = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
};

int[][] arr2 = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
};

int[][] arr3 = {
        {7, 8, 9},
        {4, 5, 6},
        {1, 2, 3}
};

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

# sort()

sort()는 배열을 정렬한다.



 



int[] array = {5, 1, 4, 3, 2};

Arrays.sort(array);

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

정렬 후 첫 번째 요소는 최소값, 마지막 요소는 최대값이 된다.

int min = array[0];  // 1
int max = array[array.length];  // 5

내림차순으로 정렬할 때는 원시타입 대신 Wrapper 클래스를 사용해야한다.



 



Integer[] array = {5, 1, 4, 3, 2};

Arrays.sort(array, Collections.reverseOrder());

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

요소가 객체인 경우 Comparator을 사용하여 정렬 기준을 설정할 수 있다.

Arrays.sort(people, new Comparator<Person>() {
    @Override
    public int compare(Person p1, Person p2) {
        return p1.getAge() - p2.getAge();
    }
});

데이터 클래스가 Comparable를 구현해도 된다.

class Person implements Comparable<Person> {

    // ...

    @Override
    public int compareTo(Person p) {
        return this.age - p.age;
    }
}
Arrays.sort(people);

# binarySearch()

binarySearch()는 배열에서 요소를 이진 탐색한 후 인덱스를 반환한다. 다만 배열이 정렬되어있어야 하며, 요소가 존재하지 않으면 음수를 반환한다.

int[] array = {1, 2, 3 ,4, 5};

Arrays.binarySearch(array, 1);  // 0
Arrays.binarySearch(array, 2);  // 1

# asList()

asList()를 사용하면 배열을 List로 변환할 수 있다.


 











String[] arr = {"Paul", "John", "Monica", "Ross", "Chandler"};
List<String> list = Arrays.asList(arr);

list.forEach((e) -> {
    System.out.println(e);
});

// Paul
// John
// Monica
// Ross
// Chandler

다음과 같이 단축할 수도 있다.

List<String> list = Arrays.asList("Paul", "John", "Monica", "Ross", "Chandler");

asList()로 생성한 List은 새로운 원소를 추가하거나 삭제할 수 없다.

String[] arr = {"Paul", "John", "Monica", "Ross", "Chandler"};
List<String> list = Arrays.asList(arr);
list.add("Joey");
Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.AbstractList.add(AbstractList.java:148)
	at java.util.AbstractList.add(AbstractList.java:108)
	at com.yologger.app.Main.main(Main.java:10)

따라서 원소를 추가하거나 삭제하려면 새로운 List를 생성해야한다.



 


String[] arr = {"Paul", "John", "Monica", "Ross", "Chandler"};
List<String> list = Arrays.asList(arr);
List<String> newList = new ArrayList<String>(list);
arrayList.add("Joey");

# toString()

toString()은 배열을 문자열로 반환한다.

int[] array = {5, 1, 4, 3, 2};
System.out.println(Arrays.toString(array));     // [5, 1, 4, 3, 2]