복사( .clone())
얕은복사
- 배열은 참조형 복사이며 실제값이 아닌 실제값의 주소값을 가짐.
- 배열 변수간에 대입 연산자 = 를 사용해서 복사를 하게 되면 주소값만 복사된다.
- 이렇게 주소값만 복사되고 실제값은 1개로 유지되는걸 '얕은복사'라고 함
- ex)int[] arr1 = {a,b,c} // -> {a,b,c}는 별도공간에 저장됨.
- 만약 int[] arr2 = arr1
- 할당 됐다고 가정하면, 할당된 값이 아니라 주소값이 복사됨.
- arr2에 있는 값을 바꾸더라도 접근해서 바꾸기 때문에 arr1에도 영향이 감.
int[] a = {1, 2, 3, 4}; //배열을 선언함
int[] b = a; //그냥 대입 연산자를 통해서 붙어넣음, 똑같은 값을 가진게 아니라 똑같은 주소값을 바라보고 있음.
b[0] = 3; //b에 있는 0번째 값을 3으로 수정하면 a에 있는 0번째도 3으로 바뀜
깊은복사
- 실제 값을 가지고 있는 배열의 기본형 값을 꺼내서 복사해주면 됨
- 반복문 for을 통해서 하나씩 꺼내서 복사해주는 방법과 여러 메서드를 사용하는 방법이 있다
int[] a = {1,2,3,4}
int[] b = new int[a.length]; //a의 길이만큼!
for(int i =0; i <a.length; i++) {
b[i] = a[i];
}
- 주소값이랑 상관없이 b라는 배열은 a가 가진 요소들로 이루어진 별도의 배열이 생성된다. a랑 b는 별도의 배열이 됨.
깊은 복사 메서드
- clone
- 근본적인 방법X
- 2차원이상 배열에서는 얕은 복사로 동작함.
int[] a = {1,2,3,4};
int[] b = a.clone();
- Arrays.copy0f
- Arrays는 Array 관련된 기능을 모아놓은 유틸리티, copy0f라는 메서드
import java.util.Arrays;
public class Method1 {
public static void main(String[] args) {
int[] a = {1,2,3,4};
int[] b = Arrays.copyOf(a,a.length); //a를 복사, a의 길이만큼
a[3] = 0; //a배열에서 3번째 인덱스를 0으로 바꿈 4->0
System.out.println(a[3]); //4
System.out.println(b[3]); //0
}
}