728x90
얕은 복사
public class Array_Copy{
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
int[] b = a;
}
}
= 연산자는 주소를 이어준다는 의미임. 해당 코드로 a의 배열을 b배열로 = 연산자를 활용하여 대입하면 깊은 복사가 되지 않고 얕은 복사가 됨. 그렇기에 b배열의 값을 수정하여도 a배열까지 같이 수정되어버리는 상황이 나옴. 이렇게 되면 사실상 배열을 복사하는 의미가 없음.
깊은 복사
public class Array_Copy{
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
int[] b = new int[a.length];
for (int i = 0; i < a.length; i++) {
b[i] = a[i];
}
}
}
상황에 따라 다를 수는 있겠지만 제대로 배열을 복사하는 의미를 가지려면 배열의 깊은 복사를 해야 함. 그래야 복사한 배열을 수정하더라도 원본에 배열이 변경되지 않음. 위와 같이 for문을 돌려가며 일일이 값을 옮겨도 되지만 자바에서 배열을 복사할 수 있는 여러 가지 메서드를 제공하고 있으니 그것들을 활용하면 배열을 쉽게 복사할 수 있음.
Object.clone() 메서드
public class Array_Copy{
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
int[] b = a.clone();
}
}
선언하면서 복사
Array.clone()을 사용하면 배열을 쉽게 복사할 수 있음. (깊은 복사) 가장 보편적인 방법.
Arrays.copyOf() 메서드
import java.util.Arrays;
public class Array_Copy{
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOf(a, a.length);
}
}
Arrays클래스는 배열을 조작할 수 있는 메소드를 가진 클래스. 이 클래스 안에 있는 Arrays.copyOf()를 사용하면 배열의 시작점 ~ 원하는 length까지 배열의 깊은 복사를 할 수 있음.
Arrays.copyOfRange() 메서드
import java.util.Arrays;
public class Array_Copy{
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
int[] b = Arrays.copyOfRange(a, 1, 3);
}
}
Arrays.copyOf()는 배열의 처음~지정한 length까지 복사하는 메서드였다면 Arrays.copyOfRange() 메서드는 복사할 배열의 시작점도 지정할 수 있음.
System.arraycopy() 메서드
public class Array_Copy{
public static void main(String[] args) {
int[] a = { 1, 2, 3, 4 };
int[] b = new int[a.length];
System.arraycopy(a, 0, b, 0, a.length);
}
}
System.arraycopy() 메서드는 지정된 배열을 대상 배열의 지정된 위치에 복사함.
728x90