# 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]