java copy array how copy clone an array java
배열 복사 및 복제에 대한이 자습서에서는 Java에서 배열을 복사하는 다양한 방법에 대해 설명합니다.
여기서는 Java 배열의 복사 작업에 대해 설명합니다. Java는 배열 요소의 사본을 만들 수있는 다양한 방법을 제공합니다. 아시다시피 Java에서 배열은 기본 유형이나 객체 또는 참조의 요소를 포함 할 수 있습니다.
기본 유형의 복사본을 만드는 동안 작업은 다소 쉽지만 객체 나 참조에 관해서는 복사본이 깊거나 얕은 지 여부에주의해야합니다.
기본 게이트웨이를 사용할 수 없습니다. Windows 10
=> 여기에서 Java Beginners Guide를 살펴보십시오.
얕은 복사본은 요소의 복사본을 만듭니다. 원시 데이터 유형이 관련되어있는 경우 문제가되지 않습니다. 그러나 참조가 관련되면 얕은 복사는 기본 정보가 아닌 값만 복사합니다.
따라서 요소의 복사본을 만든 경우에도 메모리 위치가 공유되므로 한 복사본의 변경 사항이 다른 복사본에도 반영됩니다. 이를 방지하려면 메모리 위치가 공유되지 않는 깊은 복사를 수행해야합니다.
학습 내용 :
Java 어레이 복사 및 복제
Java를 사용하면 java.util 또는 System 클래스에서 제공하는 직접 복사 방법을 사용하여 배열을 복사 할 수 있습니다. 또한 전체 어레이를 복제하는 데 사용되는 복제 방법을 제공합니다.
이 자습서에서는 다음과 같은 어레이 복사 및 복제 방법에 대해 설명합니다.
- for 루프를 사용한 수동 복사
- System.arraycopy () 사용
- Arrays.copyOf () 사용
- Arrays.copyOfRange () 사용
- Object.clone () 사용
탐험하자 !!
For 루프를 사용한 수동 복사
일반적으로 변수 (예 : a 및 b)를 복사 할 때 다음과 같이 복사 작업을 수행합니다.
a = b;
동일한 방법을 배열에 적용하면 제대로 작동하지 않습니다.
프로그래밍 예제를 보겠습니다.
public class Main { public static void main(String() args) { int intArray() = {12,15,17}; //print original intArray System.out.println('Contents of intArray() before assignment:'); for (int i=0; i 산출:

위 프로그램에는 intArray와 copyArray라는 두 개의 배열이 있습니다. 작업은 intArray의 내용을 copyArray에 복사하는 것입니다. 이를 위해 copyArray = intArray 문이 도입되었습니다. 여기서 수행되는 것은 배열의 참조가 할당되는 것입니다. 따라서 이것은 실제 복사가 아닙니다.
위의 명령문의 결과로 intArray의 메모리 위치는 copyArray에서도 공유됩니다. 이제 copyArray 요소가 증가하면 해당 변경 사항이 intArray에도 반영됩니다. 이것은 출력에 표시됩니다.
이 문제를 극복하기 위해 for 루프를 사용하여 배열을 복사하는 방법을 사용합니다. 여기에서 원래 배열의 각 요소는 for 루프를 사용하여 새 배열에 복사됩니다.
이 프로그램은 아래와 같습니다.
public class Main { public static void main(String() args) { int intArray() = {12,15, 17}; // define an array copyArray to copy contents of intArray int copyArray() = new int(intArray.length); // copy contents of intArray to copyArray for (int i=0; i 산출:

여기서 우리는 for 루프를 포함하도록 이전 프로그램을 수정했고 for 루프 내부에 intArray의 각 요소를 copyArray의 해당 요소에 할당했습니다. 이렇게하면 요소가 실제로 복사됩니다. 따라서 한 배열이 수정되면 변경 사항이 다른 배열에 반영되지 않습니다.
System.arraycopy () 사용
Java의 System 클래스에는 한 배열의 요소를 다른 배열로 복사 할 수있는 'ArrayCOpy'라는 메서드가 있습니다.
이 메서드의 일반적인 프로토 타입은 다음과 같습니다.
public static void arraycopy( Object src_array, int src_Pos,Object dest_array, int dest_Pos, int length )
여기,
- src_array => 내용이 복사 될 소스 배열.
- src_Pos => 복사가 시작되는 소스 배열의 위치.
- dest_array => 요소를 복사 할 대상 배열입니다.
- dest_Pos => 복사 할 요소의 대상 배열에서 시작 위치입니다.
- 길이 => 복사 할 어레이의 길이.
이 방법을 예를 들어 이해합시다.
class Main { public static void main(String() args) { //declaring a source array char() src_array = { 'S','o','f','t','w','a','r','e','T','e','s','t','i','n','g','H','e','l','p'}; char() dest_array = new char(19); System.arraycopy(src_array, 0, dest_array, 0,19); System.out.println('Source array:' + String.valueOf(src_array)); System.out.println('Destination array after arraycopy:'+ String.valueOf(dest_array)); } }
산출:

위의 프로그램에서 우리는 배열을 다른 배열로 복사하기 위해 'arraycopy'방법을 사용합니다. arraycopy 메소드에 대한 호출을 볼 수 있습니다. 처음부터 소스 배열을 복사합니다 (0일위치) 전체 배열을 복사합니다.
마지막으로 소스 및 대상 배열 모두에 해당하는 문자열을 표시합니다.
arraycopy 메서드를 사용하면 시작 및 끝 요소 위치를 인수로 사용하므로 부분 배열도 복사 할 수 있습니다. 이 메서드는 배열 요소의 얕은 복사본을 만듭니다.
Arrays.copyOf () 사용
Arrays.copyOf () 메서드는 내부적으로 System.arraycopy () 메서드를 사용합니다. arraycopy만큼 효율적이지는 않지만 arraycopy 방법과 같이 전체 또는 부분 배열을 복사하는 데 사용할 수 있습니다.
‘copyOf ()’메소드는 java.util 패키지의 일부이며 'Arrays'클래스에 속합니다.
이 메서드의 프로토 타입은 다음과 같습니다.
public static int() copyOf(int() original_array,int newLength)
어디,
- 실물: 새 어레이에 복사 할 어레이입니다.
- newLength : 반환 될 복사 된 배열의 길이입니다.
따라서이 메서드는 새 배열에 길이를 0으로 자르거나 채워서 첫 번째 인수에 제공된 배열의 복사본을 지정된 길이로 만듭니다. 즉, 복사 된 배열의 길이가 원래 배열보다 길면 나머지 요소가 0으로 대체됩니다.
아래 주어진 프로그램은 copyOf 메소드의 예를 보여줍니다.
importjava.util.Arrays; public class Main { public static void main(String args()) { // define original array int() even_Array = new int() {2,4,6,8}; System.out.println('Original Array:' + Arrays.toString(even_Array)); // copying array even_Array to copy_Array int() copy_Array = Arrays.copyOf(even_Array,5); System.out.println('Copied Array:' + Arrays.toString(copy_Array)); // assign value to unassigned element of copied array copy_Array(4) = 10; System.out.println('Copied and modified Array:' + Arrays.toString(copy_Array)); } }
산출:

위의 프로그램에서 copyOf 메소드를 사용하여 길이 4의 even_Array를 복사합니다. 제공된 두 번째 인수는 5입니다. 따라서 새로 복사 된 배열에는 5 개의 요소가 있습니다. 처음 4 개는 원래 배열과 동일하고 5 번째 요소는 원래 배열의 길이가 새 배열의 길이보다 작기 때문에 copyOf가이를 채울 때 0입니다.
Arrays.copyOfRange () 사용
Arrays.copyOfRange () 메서드는 부분 배열을 복사하려는 경우에 특별히 사용됩니다. copyOf () 메서드와 마찬가지로이 메서드도 내부적으로 System.arraycopy () 메서드를 사용합니다.
Arrays.copyOfRange () 메서드의 프로토 타입은 다음과 같습니다.
public static short() copyOfRange(short() original, int from, int to)
어디,
- 실물: 범위를 복사 할 배열입니다.
- 에서: 복사 할 범위의 초기 색인입니다.
- 에: 복사 할 범위의 최종 색인입니다.
copyOfRange 메서드의 구현 예가 아래에 나와 있습니다.
Eclipse에서 새 프로젝트를 여는 방법
import java.util.Arrays; class Main { public static void main(String args()) { int intArray() = { 10,20,30,40,50 }; // to index is within the range int() copyArray = Arrays.copyOfRange(intArray, 2, 6); System.out.println('Array copy with both index within the range: ' + Arrays.toString(copyArray)); //to index is out of range int() copy1 = Arrays.copyOfRange(intArray, 4, intArray.length + 3); System.out.println('Array copy with to index out of range: ' + Arrays.toString(copy1)); } }
산출:

Object.clone () 사용
Java 어레이는 내부적으로 Cloneable 인터페이스를 구현하므로 Java 어레이를 쉽게 복제 할 수 있습니다. 1 차원 및 2 차원 배열을 복제 할 수 있습니다. 1 차원 배열을 복제하면 값을 복사하는 배열 요소의 깊은 복사본을 만듭니다.
반면에 2 차원 또는 다차원 배열을 복제하면 요소의 얕은 복사본이 만들어집니다. 즉 참조 만 복사됩니다. 이 어레이 복제는 어레이에서 제공하는 'Clone ()'방법으로 수행됩니다.
복제의 결과로 1D 배열의 전체 복사는 다음과 같이 나타낼 수 있습니다.

이제 Java 프로그램에서 1D 배열 복제를 구현해 보겠습니다.
class Main { public static void main(String args()) { int num_Array() = {5,10,15,20,25,30}; int clone_Array() = num_Array.clone(); System.out.println('Original num_Array:'); for (int i = 0; i 출력에서 볼 수 있듯이 두 배열이 같은지 확인하는 표현식은 false를 반환합니다. 이는 1 차원 배열을 복제하면 값이 단순히 참조가 아닌 새 배열에 복사되는 전체 복사가 발생하기 때문입니다.
자주 묻는 질문
Q # 1) Java에서 배열 사본을 만드는 방법은 무엇입니까?
대답: 배열을 복사하는 방법에는 여러 가지가 있습니다.
- for 루프를 사용하고 요소를 하나씩 복사 할 수 있습니다.
- 복제 방법을 사용하여 어레이를 복제합니다.
- System 클래스의 arraycopy () 메서드를 사용합니다.
- Arrays 클래스의 copyOf () 또는 copyOfRange () 메서드를 사용합니다.
Q # 2) 한 어레이를 다른 어레이에 어떻게 할당합니까?
대답: 간단한 할당 연산자 (=)를 사용하여 배열을 다른 배열에 할당 할 수 있습니다. 두 배열의 데이터 유형이 동일하고 차원이 동일한 지 확인해야합니다.
Q # 3) 얕은 카피와 딥 카피 란 무엇입니까?
대답: 얕은 복사에서는 해당 객체 또는 배열의 속성 만 복사됩니다. 따라서 복사 된 배열에 대한 변경 사항은 원본에 반영됩니다. Java 복제는 단순 복사의 예입니다.
전체 복사본은 개체의 전체 복사본이 필요한 경우이므로 해당 개체를 복제하거나 복사 할 때 독립적 인 복사본이됩니다. 기본 또는 내장 유형이 관련되면 얕은 복사와 깊은 복사간에 차이가 없습니다.
Q # 4) 어레이 클론의 기능은 무엇입니까?
대답: 배열의 복제 방법은 한 개체의 속성을 다른 개체로 복사하는 데 사용됩니다. 이를 위해 얕은 사본을 사용합니다.
Q # 5) 어레이에 어레이를 저장할 수 있습니까?
대답: 배열은 동일한 유형 (기본 또는 객체)의 요소와 함께 제공되는 배열을 포함 할 수 있습니다. 이는 문자열 배열에 정수 배열을 저장할 수 없음을 의미합니다.
결론
이 자습서에서는 Java에서 배열 복사 및 배열 복제를 살펴 보았습니다. 어레이를 복사하고 복제하는 다양한 방법 / 접근법을 보았습니다.
이러한 메서드의 대부분은 얕은 복사를 구현합니다. 기본 데이터 유형의 경우 얕은 복사와 전체 복사는 다르지 않습니다. 그러나 배열에 개체 또는 참조가 포함 된 경우 프로그래머는 요구 사항에 따라 전체 복사를 구현해야합니다.
후속 자습서에서는 Java 배열에 대해 계속해서 살펴 봅니다.
추천 도서