자바(Java)에서 배열을 다루다 보면 기존 배열의 복사본이 필요한 경우가 자주 있습니다. 예를 들어 커피숍을 운영하면서 계절 한정 메뉴를 만들고 싶다면, 기존 메뉴 배열을 복사한 뒤 그 위에 새로운 메뉴를 구성할 수 있습니다.
자바에서는 배열을 복사할 수 있는 방법이 여러 가지 있습니다. 이 글에서는 가장 널리 사용되는 네 가지 방법을 소개하고, 각 코드가 어떻게 동작하는지 한 줄씩 자세히 설명합니다. 이 글을 끝까지 읽으면 자바에서 배열을 자유롭게 복사할 수 있게 될 것입니다.
자바 배열의 기본 개념
자바에서 배열(array)은 동일한 타입의 값들을 하나의 컨테이너에 담아 보관하는 자료구조입니다. 예를 들어 도서 목록이나, 다트 게임에서 선수들이 획득한 점수 목록 등을 배열에 저장할 수 있습니다.
배열은 비슷한 성격의 값을 여러 개 다룰 때 특히 유용합니다. 모든 값을 하나의 컬렉션에 저장할 수 있기 때문에 코드를 간결하게 유지할 수 있고, 비슷한 값들에 대해 동일한 연산을 한 번에 적용할 수도 있습니다.
커피숍에서 판매하는 커피 목록을 담은 배열을 만든다고 가정해 보겠습니다. 다음 코드처럼 작성할 수 있습니다:
String[] coffees = {"Espresso", "Mocha", "Latte", "Cappuccino", "Pour Over", "Flat White"};
이 예제에서는 문자열(String) 값을 저장하는 coffees라는 이름의 배열을 선언했으며, 이 배열에는 여섯 개의 값이 들어 있습니다.
배열의 각 항목에는 0부터 시작하는 인덱스 번호가 할당되며, 이 인덱스를 사용해 배열 내 개별 요소에 접근할 수 있습니다.
배열의 기본 개념을 살펴봤으니, 이제 배열 내용을 복사할 수 있는 방법들을 알아보겠습니다.
방법 1: 대입 연산자(=)를 사용한 복사
배열을 복사하는 가장 흔히 쓰이는 방법 중 하나는 대입 연산자(assignment operator)를 사용하는 것입니다.
대입 연산자는 변수에 값을 할당할 때 사용됩니다. 이 연산자를 활용하면 기존 배열의 내용을 새로운 변수에 할당하여, 마치 복사본을 만든 것처럼 사용할 수 있습니다.
다시 커피숍으로 돌아가 보겠습니다. 여름 커피 메뉴의 기반이 될 coffees 배열의 복사본을 만들고 싶다면 다음과 같은 코드를 사용할 수 있습니다:
class CopyAssignment {
public static void main(String[] args) {
String[] coffees = {"Espresso", "Mocha", "Latte", "Cappuccino", "Pour Over", "Flat White"};
String[] summer_coffees = coffees;
for (String c: summer_coffees) {
System.out.print(c + ",");
}
}
}위 코드의 실행 결과는 다음과 같습니다:
Espresso, Mocha, Latte, Cappuccino, Pour Over, Flat White,
코드를 하나씩 분석해 보겠습니다. CopyAssignment 클래스 안의 첫 번째 줄에서는 표준 커피 메뉴를 저장하는 coffees 배열을 선언했습니다.
그다음 줄에서는 대입 연산자를 사용해 coffees의 값을 summer_coffees라는 새로운 배열에 할당했습니다. 이후 for-each 반복문을 통해 summer_coffees 배열의 모든 항목을 순회하며 콘솔에 출력합니다.
다만 이 방법에는 한 가지 단점이 있습니다. 한 배열의 요소를 변경하면 다른 배열도 함께 변경된다는 점입니다. 예를 들어 summer_coffees 리스트에서 Latte를 Summer Latte로 바꾸면, coffees 리스트의 해당 값도 함께 변경됩니다.
방법 2: for 반복문을 사용한 깊은 복사(Deep Copy)
앞서 설명한 대입 연산자 방식은 얕은 복사(shallow copy)를 수행합니다. 기존 배열 객체를 새 변수에 참조로 할당하기 때문에, 두 객체는 사실상 같은 데이터를 가리키며 어느 한쪽을 수정하면 양쪽 모두 영향을 받습니다.
하지만 실무에서는 깊은 복사(deep copy)가 필요한 경우가 많습니다. 깊은 복사는 기존 객체의 값들을 새로운 배열 객체에 복제하기 때문에, 복사본을 변경해도 원본 배열에는 전혀 영향을 주지 않습니다.
깊은 복사를 만드는 한 가지 방법은 for 반복문을 사용해 배열의 각 요소를 순회하면서 새 배열에 하나씩 옮기는 것입니다.
여름철에 판매할 신규 메뉴를 반영하기 위해 summer_coffees 배열의 내용을 변경할 계획이라면, 반드시 깊은 복사를 사용해야 합니다.
for 반복문으로 깊은 복사를 수행하는 코드는 다음과 같습니다:
import java.util.Arrays;
class LoopCopy {
public static void main(String[] args) {
String[] coffees = {"Espresso", "Mocha", "Latte", "Cappuccino", "Pour Over", "Flat White"};
String[] summer_coffees = new String[6];
for (int i = 0; i < coffees.length; ++i) {
summer_coffees[i] = coffees[i];
}
System.out.println(Arrays.toString(summer_coffees));
}
}코드를 실행하면 다음과 같은 결과가 출력됩니다:
[Espresso, Mocha, Latte, Cappuccino, Pour Over, Flat White]
보시다시피 코드가 원본 배열의 복사본을 정상적으로 생성했습니다. 이 코드의 동작 과정을 단계별로 살펴보겠습니다:
- 배열 출력을 위해 사용할
toString()메서드가 포함된java.util.Arrays클래스를 임포트합니다. - 표준 메뉴의 커피 목록을 저장하는
coffees배열을 선언합니다. - 여섯 개의 값을 저장할
summer_coffees배열을 초기화합니다. - for 반복문으로
coffees리스트의 모든 항목을 순회합니다. - 반복문이 실행될 때마다
summer_coffees의 인덱스i위치에coffees의 인덱스i위치에 있는 값을 할당합니다. Arrays.toString()으로summer_coffees를 문자열로 변환한 뒤, 복사된 요소들을 포함한 새 배열을 콘솔에 출력합니다.
방법 3: copyOfRange() 메서드 사용하기
자바의 copyOfRange() 메서드는 배열을 복사하는 데 사용되며, java.util.Arrays 클래스에 속해 있습니다. 이 메서드의 문법은 다음과 같습니다:
import java.util.arrays; DataType[] newArray = Arrays.copyOfRange(oldArray, indexPos, length);
copyOfRange() 메서드의 구성 요소를 하나씩 살펴보겠습니다:
- DataType: 새 배열이 저장할 데이터의 타입입니다.
- newArray: 새로 생성될 배열의 이름입니다.
- oldArray: 값을 복사해 올 원본 배열입니다.
- indexPos: 복사를 시작할
oldArray내의 인덱스 위치입니다. - length:
oldArray에서newArray로 복사할 값의 개수입니다.
예제를 통해 copyOfRange() 메서드의 실제 동작을 확인해 보겠습니다. 앞서 만든 coffees 배열을 복사하고 싶다면 다음 코드를 사용할 수 있습니다:
import java.util.Arrays;
class CopyUsingRange {
public static void main(String[] args) {
String[] coffees = {"Espresso", "Mocha", "Latte", "Cappuccino", "Pour Over", "Flat White"};
String[] summer_coffees = Arrays.copyOfRange(coffees, 0, coffees.length);
System.out.println("Summer coffees: " + Arrays.toString(summer_coffees));
}
}실행 결과는 다음과 같습니다:
Summer coffees: [Espresso, Mocha, Latte, Cappuccino, Pour Over, Flat White]
코드를 단계별로 분석해 보겠습니다:
- 예제에서 사용할
copyOfRange()와toString()메서드가 포함된java.util.Arrays라이브러리를 임포트합니다. - 표준 메뉴의 커피 목록을 저장하는
coffees배열을 선언합니다. summer_coffees배열을 선언하고,copyOfRange()메서드를 사용해coffees배열의 복사본을 생성합니다. 지정한 매개변수는 다음과 같습니다:- coffees: 복사하려는 배열의 이름입니다.
- 0:
coffees배열의 인덱스 0부터 복사를 시작한다는 의미입니다. - coffees.length: 리스트의 모든 값을 복사한다는 의미입니다.
- "Summer coffees: "라는 문자열과 함께 결과 배열인
summer_coffees를 콘솔에 출력합니다.
이제 coffees 리스트의 복사본인 summer_coffees가 성공적으로 생성되었습니다.
방법 4: arraycopy() 메서드 사용하기
arraycopy() 메서드는 한 배열의 데이터를 다른 배열로 복사할 때 사용됩니다. 이 메서드는 System 클래스에 포함되어 있으며, 다양한 매개변수 옵션을 통해 기존 배열의 복사본을 세부적으로 제어할 수 있습니다.
arraycopy() 메서드의 문법은 다음과 같습니다:
System.arraycopy(sourceArray, startingPos, newArray, newArrayStartingPos, length);
이 메서드는 다섯 개의 매개변수를 받습니다:
- sourceArray: 복사하려는 원본 배열의 이름입니다.
- startingPos:
sourceArray에서 복사를 시작할 인덱스 위치입니다. - newArray: 복사된 값이 저장될 새 배열의 이름입니다.
- newArrayStartingPos: 복사된 값이 추가될
newArray내의 인덱스 위치입니다. - length:
newArray로 복사할 요소의 개수입니다.
다시 커피숍 예제로 돌아가 보겠습니다. coffees 배열의 모든 값을 summer_coffees라는 새 배열로 복사하고 싶다면 다음 코드를 사용할 수 있습니다:
import java.util.Arrays;
class ArrayCopyMethod {
public static void main(String[] args) {
String[] coffees = {"Espresso", "Mocha", "Latte", "Cappuccino", "Pour Over", "Flat White"};
String[] summer_coffees = new String[6];
System.arraycopy(coffees, 0, summer_coffees, 0, coffees.length);
System.out.println("Summer coffees: " + Arrays.toString(summer_coffees));
}
}실행 결과는 다음과 같습니다:
Summer coffees: [Espresso, Mocha, Latte, Cappuccino, Pour Over, Flat White]
코드를 단계별로 분석해 보겠습니다:
- 프로그램 시작 부분에서
java.util.Arrays패키지를 임포트합니다. 이 패키지에는 프로그램 마지막에 생성된 배열 복사본을 출력하는 데 사용할toString()메서드가 포함되어 있습니다. - 표준 메뉴의 커피 목록을 저장하는
coffees배열을 선언합니다. - 여섯 개의 값을 저장할
summer_coffees배열을 초기화합니다. arraycopy()를 사용해coffees배열의 복사본을 생성합니다. 지정한 매개변수는 다음과 같습니다:- coffees: 복사하려는 원본 배열입니다.
- 0:
coffees배열에서 복사를 시작할 위치입니다. - summer_coffees: 복사된 값이 추가될 대상 배열입니다.
- 0:
summer_coffees배열에서 복사된 값이 채워지기 시작할 위치입니다. - coffees.length: 복사할 배열 요소의 개수입니다. 이 경우
coffees.length를 사용하면coffees리스트의 모든 요소를 복사할 수 있습니다.
- "Summer coffees: "라는 메시지와 함께 생성된 여름 커피 목록을 출력합니다.
마무리
배열 복사는 리스트를 다룰 때 매우 흔하게 발생하는 작업입니다. 이 글에서는 자바에서 배열을 복사하는 네 가지 방법을 살펴보았습니다.
먼저 대입 연산자를 사용한 얕은 복사 방법을 알아보았고, 이어서 for 반복문을 활용한 깊은 복사 방법을 설명했습니다. 그리고 copyOfRange() 메서드로 배열을 복사하는 방법과, System 클래스의 arraycopy() 메서드를 활용하는 방법도 함께 다루었습니다.
이제 여러분도 프로처럼 자바에서 배열을 자유롭게 복사할 준비가 되었습니다!