시소당
일반적인 객체처럼 배열 또한 복사가 되지 않습니다. 그래서 자바에서 배열을 복사하기 위한 방법을 몇 가지 제시하고 있습니다. 물론, 우리는 아직 객체 복사라는 것을 배우지 않았습니다. 객체 복사는 10장의 Object의 clone메서드에서 배우게 될 것입니다. 우선적으로 여기서는 배열의 복사라는 것을 배워 보도록 하겠습니다.
배열복사는 System.arraycopy를 이용하는 방법과 배열 자체의 clone메서드를 이용하는 방법으로 나눌 수 있습니다. 이 두 방법에 대한 예를 살펴 보도록 하겠습니다.
배열을 복사하는 방법
n System.arraycopy를 이용하는 방법
n 배열 자체의 clone메서드를 이용하는 방법
일단 System.arraycopy메서드부터 살펴 보도록 하죠.
System.arraycopy메서드 세부사항
public static void arraycopy(Object src, /*원본배열.*/
int src_position, /*원본배열의 시작위치*/
Object dst, /*복사할 배열*/
int dst_position, /* 복사할 배열의 시작위치 */
int length) /*복사할 개수.*/
특별한 것은 없습니다. src는 원본 배열이고 src_position은 원본의 어디서부터 복사를 시작할 것인지를 결정해 줍니다. 그리고 dst는 복사하려고 하는 배열이며 dst_position은 복사할 배열의 첫 위치를 말합니다. 마지막으로 length는 복사하려고 하는 배열의 개수를 정해주면 시작위치부터 복사할 개수만큼 배열을 복사하게 됩니다. 위의 메서드를 이용한 예를 만들어 보도록 하겠습니다.
ArrayTest.java (System.arraycopy메서드를 테스트하기 위한 예제)
public class ArrayTest{
public static void main(String[] args){
int[] mydream = new int[]{5, 4, 6, 9, 7, 9};
int[] mytarget = {100, 200, 300, 400, 500, 600,700};
System.arraycopy(mydream, 2, mytarget, 3, 4);
for(int i=0; i<mytarget.length; i++){
System.out.println("mytarget["+i+"]:" + mytarget[i]);
}
}
}
C:\examples\6. Array>javac ArrayTest.java
C:\examples\6. Array>java ArrayTest
mytarget[0]:100
mytarget[1]:200
mytarget[2]:300
mytarget[3]:6
mytarget[4]:9
mytarget[5]:7
mytarget[6]:9
위의 예에서 배열의 복사라는 측면에서, arraycopy메서드의 사용방법을 정확하게 볼 수 있습니다. 그리고 배열의 선언과 초기화를 동시에 하는 2가지 방법적인 측면에서도 이 예제를 관찰해 보시기 바랍니다.
배열 선언과 초기화를 동시에 하는 방법
n int[] mydream = new int[]{5, 4, 6, 9, 7, 9};
n int[] mytarget = {100, 200, 300, 400, 500, 600,700};
이 예제에서 하나 더 여러분에게 강조하고 싶은 것이 있다면 배열의 전체 개수를 알고자할 때 배열의 length멤버필드를 이용하면 된다는 것입니다.
배열의 개수를 알고자 할 때
n mydream.length
n mytarget.length
배열에 length필드는 배열의 전체 개수를 담고 있습니다. 그리고 배열에 점(.)찍고 사용할 수 있는 것은 배열이 객체라는 것을 말해 주는 부분입니다.
최종적으로 mydream의 2번째(0,1,2번째)부터 4개를 복사하는데 mytarget의 3번?(0,1,2,3번째)부터 4개를 복사하라는 명령을 수행하게 됩니다. 이 명령은 다음과 같습니다.
n System.arraycopy(mydream, 2, mytarget, 3, 4);
결과를 잘 살펴 보시기 바랍니다. mydream의 2번째(0,1,2) 요소부터 4개가 복사 되었을 것입니다. 그리고 mytarget에서는 3번째(0,1,2,3)부터 복사가 이루어지고 있을 것입니다.
다음으로 clone을 이용한 배열 복사방법을 알아 보도록 하겠습니다.
ArrayCloneTest.java
public class ArrayCloneTest{
public static void main(String[] args){
int[] mydream = new int[]{5, 4, 6, 9, 7, 9};
int[] mytarget = (int[])mydream.clone();
for(int i=0; i<mytarget.length; i++){
System.out.println("mytarget["+i+"]:" + mytarget[i]);
}
}
}
C:\examples\6. Array>javac ArrayCloneTest.java
C:\examples\6. Array>java ArrayCloneTest
mytarget[0]:5
mytarget[1]:4
mytarget[2]:6
mytarget[3]:9
mytarget[4]:7
mytarget[5]:9
배열 객체에서 clone() 메서드를 이용하여 객체를 복사할 수 있습니다. clone메서드는 메모리를 복사하여 Object형의 객체를 리턴하고 있습니다. 외부에서는 변수를 선언하여 받기만하면 되는 것이지요. 하지만 clone메서드가 Object형을 리턴하고 있기 때문에 int[]형의 데이터 타입으로 다운캐스팅을 해서 배열의 형태로 만들어 주어야 합니다.
n int[] mytarget = (int[])mydream.clone();
이 한줄이 clone메서드를 사용하는 전부입니다. mydream을 복사하면 당연히 int[]이 되지만 clone자체가 Object형을 리턴하기 때문에 여러분이 직접 강제적으로 다운캐스팅을 해주어야 합니다. 그리고, 만약 잘못된 다운캐스팅을 한다면 실행시에 멋진 에러를 만나게 될 것입니다. 반드시 다운캐스팅할 때에는 원래의 형으로 다운캐스팅해주어야 합니다. 자바의 철칙과 같죠. 물론 다른 언어에서도 마찬가지입니다.
출처 : http://www.jabook.org/jabook/jabook05/10000_10000_37500__10000_10000_37500.html