✍hallow copy(얕은 복사)
- 참조하는 배열의 시작 주소만을 복사하는 것이다.
ex) 바로가기
두 변수가 하나의 배열을 공유한다.
-> 객체의 매개변수, 반환형 전달 시 사용
int[] arr = {1, 2, 3, 4, 5};
int[] copyArr = arr;
// 얕은 복사 진행
✍Deep copy(깊은복사)
: 완전 다른 파일이기 때문에 원본에 영향을 주지 않는다.
- 같은 값을 가진 서로다른 배열이 생긴다.
- 원본 배열과 동일한 자료형, 동일하거나 더 큰 크기, 동일한 데이터를 가지는 새로운 배열을 만드는 것이다.
- 원본 데이터 유지, 원본과 똑같은 배열이 필요할 때
ex) ctrl c-> ctrl v
종류 | 예시 | |
얕은 복사 | 윈도우 바로가기 | |
깊은 복사 | 원본의 복사본 |
📝얕은 복사 예제
ArrayService2 // public void example1()
int[] arr = {1, 2, 3, 4, 5};
// 얕은 복사 진행
int[] copyArr = arr;
//arr, copyArr은 동일한 주소에 있는 int[]을 참조
System.out.println("변경 전"); System.out.println(Arrays.toString(arr)); System.out.println(Arrays.toString(copyArr));
//복사가 되었는지 확인
//복사한 배열의 0번째 요소를 변경
copyArr[0] = 999;
System.out.println("변경 전");
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(copyArr));
//얕은 복사 -> arr, copyArr은 같은 배열을 참조
// -> arr,copyArr 둘 다 0번 인덱스 값이 변경됨
📝깊은복사 예제
ArrayService2 // public void example2()
int[] arr = {1, 2, 3, 4, 5};
// 깊은 복사 진행
// 1) 복사를 위한 새로운 배열 선언 및 할당
int[] copyArr = new int[arr.length];
//원본 배열크기만큼을 만들기 위해 arr배열의 크기인 arr.length
//원본 배열과 같은 크기의 새로운 배열 할당
// 2) 원본 배열의 내용을 복사용 배열에 초기화 하기
// 2-1) for문을 이용한 깊은 복사
for(int i = 0; i<arr.length; i++) {
//i가 0일때 대입연산 오른쪽의 값이 왼쪽에 들어가니 c
opyArr[i] = arr[i]; // arr0번의 값이 copyArr0번으로 들어간다.
}
System.out.println("변경 전");
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(copyArr));
//복사가 되었는지 확인
//복사한 배열의 0번째 요소를 변경
copyArr[0] = 999;
System.out.println("변경 전");
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(copyArr));
2-2)
int[] arr = {1, 2, 3, 4, 5};
int[] copyArr = new int[arr.length];
2-2)//System.arraycopy(원본배열, 원본 복사 시작 인덱스, 복사배열, 복사 배열의 삽입 시작 인덱스, 복사길이);
// 값이 5개가 들어간다
System.arraycopy(arr, 0, copyArr, 0, arr.length);
// 원본 배열 arr에서 0번째 인덱스부터 5개의 데이터 (arr.length)를
// 복사배열 copyArr의 0번 인덱스부터 차례대로 삽입하겠다.
System.out.println("변경 전");
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(copyArr));
//복사가 되었는지 확인
//복사한 배열의 0번째 요소를 변경
copyArr[0] = 999;
System.out.println("변경 전");
System.out.println(Arrays.toString(arr));
System.out.println(Arrays.toString(copyArr));
결과 화면)
1,2 번을 자주쓰고
3번은 잘 안쓰고
4번은 데인져러스
clone : 복제
잘못 쓰게 되면 무한히 복제되어서 컴퓨터에 문제가되기때문에 권장하지 않다.
effective java에서 나오는 말이다.
반응형
'Backend > Java' 카테고리의 다른 글
[Java] OOP 2 _Class, Field (접근제한자, 예약어, 멤버·클래스 변수) (0) | 2021.09.07 |
---|---|
[Java] OOP 1_Object Oriented Programming(객체지향) (1) | 2021.09.06 |
[Java] 2차원 Array(배열) + 가변 배열/ 선언,할당,초기화 (0) | 2021.09.02 |
[Java] Array(배열)_String[] (null) (0) | 2021.09.02 |
[Java] Array(배열)_2 (초기화, Arrays 클래스, Arrays.toString) (0) | 2021.09.01 |