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 작업이 있는지가 아닙니다.