HOWTO · Java
Java 배열에 요소를 추가하는 방법
Java 배열에 기본 제공 push() 메서드가 없는 이유와 스택, 리스트 또는 배열 복사를 이용해 값을 추가하는 방법을 알아보세요.
이 페이지의 내용
Java 배열은 길이가 고정되어 있으며 기본 제공 push() 메서드가 없습니다. 항목을 추가하려면 원하는 삽입 위치에 따라 컬렉션을 선택하세요. 스택은 맨 위에 항목을 넣고, LinkedList.push()는 맨 앞에 삽입하며, ArrayList.add()는 크기를 늘릴 수 있는 리스트의 끝에 추가합니다. 배열을 계속 사용해야 한다면 기존 요소를 더 긴 새 배열에 복사하고 반환된 배열을 사용하세요.
아래의 Java 예제 다섯 개는 제공된 런타임에서 모두 성공적으로 실행되었으며, 각각 종료 코드 0을 반환했습니다.
LIFO 동작에는 Stack.push() 사용
Stack.push()는 후입선출(LIFO) 스택의 맨 위에 요소를 추가합니다. 따라서 가장 최근에 넣은 항목이 pop()으로 가장 먼저 반환됩니다. 예제에서는 문자열 세 개를 넣은 다음 맨 위 항목을 출력하고 제거합니다.
import java.util.Stack;
public class StackExample {
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
stack.push("Java");
stack.push("is");
stack.push("useful");
System.out.println("Top: " + stack.peek());
System.out.println("Removed: " + stack.pop());
System.out.println("Stack: " + stack);
}
}
Top: useful
Removed: useful
Stack: [Java, is]
나중에 들어온 값을 먼저 처리해야 할 때 이 API를 선택하세요. 예를 들어 실행 취소 작업이나 대기 중인 작업을 추적하는 경우에 적합합니다. 표시된 스택에는 pop()으로 맨 위 항목을 제거한 뒤 남은 요소가 들어 있습니다. 값을 원래 순서대로 유지하기만 하면 된다면 스택은 필요 이상의 동작을 제공하므로, 끝에 추가하는 리스트를 사용하세요.
맨 앞에 추가하려면 LinkedList.push() 사용
LinkedList.push()는 끝에 추가하는 대신 맨 앞에 삽입합니다. 호출할 때마다 새 항목이 첫 번째 요소가 되므로 리스트에 표시되는 순서는 호출 순서와 반대입니다.
import java.util.LinkedList;
public class LinkedListExample {
public static void main(String[] args) {
LinkedList<String> values = new LinkedList<>();
values.push("Java");
values.push("is");
values.push("useful");
System.out.println(values);
}
}
[useful, is, Java]
이 작업도 맨 앞에 삽입하므로 리스트를 출력하면 가장 최근 값이 첫 번째로 나타납니다. 가장 최신 항목을 앞에 두는 순서를 유지하는 등, 그 순서가 의도된 경우에 사용하세요. 끝에 값을 추가하려는 작업이라면 대신 ArrayList.add()를 선택하세요. 두 호출 모두 컬렉션에 요소를 추가하지만 결과는 다릅니다.
크기를 늘릴 수 있는 리스트의 끝에 추가하려면 ArrayList.add() 사용
늘어날 수 있는 리스트에 값을 추가하려면 ArrayList.add()를 사용하세요. 이 메서드는 각 값을 끝에 추가합니다. ArrayList는 Java 배열이 아니라 컬렉션이므로 배열처럼 길이가 고정되어 있지 않습니다.
import java.util.ArrayList;
public class ArrayListExample {
public static void main(String[] args) {
ArrayList<String> values = new ArrayList<>();
values.add("Java");
values.add("is");
values.add("useful");
System.out.println(values);
}
}
[Java, is, useful]
“배열에 추가한다”는 말이 기존 순서를 유지하면서 마지막 값 뒤에 새 값을 놓는다는 뜻이라면, 이 방법이 가장 가까운 컬렉션 선택지입니다. 값을 추가하면 리스트가 늘어나며, add()를 사용하면 값을 하나 추가할 때마다 호출자가 더 큰 배열을 할당하고 다시 참조를 대입할 필요가 없습니다. 길이가 데이터 구조의 일부이거나 다른 API에서 고정 길이를 요구한다면 배열을 선택하세요. 값의 개수가 달라질 수 있고 끝에 추가하려는 경우에는 리스트를 선택하면 됩니다.
사용자 정의 메서드로 Java 배열 끝에 추가
사용자 정의 push() 메서드는 기존 요소와 새 값이 들어 있는 더 긴 배열을 반환할 수 있습니다. Java 배열은 제자리에서 길이가 늘어나지 않으므로 호출자는 반환된 배열을 변수에 다시 대입해야 합니다. 복사에 걸리는 시간은 기존 요소 수에 비례하며 새 배열을 위한 메모리도 필요합니다.
public class ArrayAppendExample {
private static String[] push(String[] array, String value) {
String[] longer = new String[array.length + 1];
System.arraycopy(array, 0, longer, 0, array.length);
longer[array.length] = value;
return longer;
}
public static void main(String[] args) {
String[] values = {"a", "b", "c"};
values = push(values, "d");
System.out.println(java.util.Arrays.toString(values));
}
}
[a, b, c, d]
반환된 참조를 사용하는 것이 중요합니다. 원래 배열의 길이는 그대로이고, push()는 별도의 새 배열을 만들어 반환합니다. 반환값을 대입하면 이후 읽기는 더 긴 배열을 사용합니다. 반환값을 무시하면 호출자는 계속 원래 배열을 사용합니다. 메서드 시그니처나 라이브러리에서 배열을 요구하는 경우 이 방법이 유용합니다. 작업을 반복할 때마다 이미 들어 있는 요소를 복사하므로, 여러 값을 연속해서 추가한다면 크기를 늘릴 수 있는 컬렉션을 사용하는 편이 대개 더 간단하고 직접 복사 로직을 작성하지 않아도 됩니다.
스택에는 ArrayDeque.push() 사용
새 스택 코드를 작성할 때는 양쪽 끝에서 삽입과 제거를 지원하는 크기 가변 데크인 ArrayDeque를 사용할 수 있습니다. push() 메서드는 맨 앞에 추가하고, pop()은 같은 쪽에서 제거하므로 LIFO 동작을 합니다. 데크를 순회하면 맨 앞에서부터 시작합니다.
import java.util.ArrayDeque;
public class ArrayDequeExample {
public static void main(String[] args) {
ArrayDeque<String> values = new ArrayDeque<>();
values.push("Java");
values.push("is");
values.push("useful");
System.out.println("Top: " + values.peek());
System.out.println("Removed: " + values.pop());
System.out.println("Deque: " + values);
}
}
Top: useful
Removed: useful
Deque: [is, Java]
스택 동작이 필요하다면 ArrayDeque.push()는 Stack.push()에서 본 것과 동일하게 맨 위부터 처리하는 방식을 제공하며, 데크의 반대쪽에서도 작업할 수 있습니다. 스택이 필요하고 데크 컬렉션을 사용하려는 경우 이 방법을 선택하세요. 새 항목을 순서가 있는 리스트의 끝에 놓아야 한다면 ArrayList.add()를 사용하세요. 선택 기준은 값이 어디에 들어가고 어떻게 가져올지이지, Java 배열에 기본 제공 push 작업이 있는지가 아닙니다.