1. 얕은 복사 ( 주소값을 복사)
1) 크기가 5인 배열 origin을 복사한다고 가정
int[] origin = {1, 2, 3, 4, 5};
int[] copy = origin; //주소값이 저장되어있음 , 같은 주소값을 참조하고있음
System.out.println("==복사본 배열 출력==");
for(int i=0;i<copy.length;i++) {
System.out.print(copy[i]+ " ");
}
System.out.println();
>> 출력결과
==복사본 배열 출력==
1 2 3 4 5
2) 복사본의 값을 변경하면 원본배열의 값까지 변경됨
copy[2] = 99;
System.out.println("----복사본 배열 값 변경 후----");
System.out.println("==원본 배열 출력==");
for(int i=0; i<origin.length;i++) {
System.out.print(origin[i]+ " ");
}
System.out.println();
System.out.println("==복사본 배열 출력==");
for(int i=0;i<copy.length;i++) {
System.out.print(copy[i]+ " ");
}
System.out.println();
>>출력결과
----복사본 배열 값 변경 후----|
==원본 배열 출력==
1 2 99 4 5
==복사본 배열 출력==
1 2 99 4 5
*****같은 주소값 참조하기때문에 copy값 수정해도 origin함께 수정됨
System.out.println("origin의 주소값 :"+ origin.hashCode());
System.out.println("copy의 주소값 : "+copy.hashCode());
2. 깊은 복사
1 .For문을 활용한 방법
1)새로운 배열을 생성한 후 반복문을 활용해서 원본배열의 각 인덱스 값을 새로운 배열에 대입
int[] origin = {1,2,3,4,5};
int[] copy = new int[5];
for(int i =0;i<copy.length;i++) {
copy[i] = origin[i];
2) copy배열의 2번인덱스 값을 변경한 경우 origin 배열의 값은 변경되지 않음
copy[2] = 99;
System.out.println("==원본 배열 출력==");
for(int i=0; i<origin.length;i++) {
System.out.print(origin[i]+ " ");
}
System.out.println("\n==복사본 배열 출력==");
for(int i =0; i<copy.length;i++) {
System.out.print(copy[i] + " ");
}
System.out.println("\norigin의 주소값 : "+ origin.hashCode());
System.out.println("copy의 주소값 : "+ copy.hashCode());
// 서로 다른 주소값 참조하고 있음
}
2.System 클래스에서의 arraycopy메소드 이용한 방법
System.arraycopy(원본배열명, 복사시작할인덱스, 복사본 배열명, 복사본 배열의 복사될 시작인덱스,복사할 개수);
int[] origin = {1,2,3,4,5};
int[] copy = new int[10];// 0번~9번 인덱스까지 기본값 0이 담겨있음
System.arraycopy(origin, 2, copy, 5, 3);
for(int i =0;i<copy.length;i++) {
System.out.print(copy[i]+ " ");
}
-origin과 copy의 hashCode는 동일하지않음 => 서로 다른 주소값 참조
3)Array클래스에서 제공하는 copyOf 메소드 이용한 방법
사본배열 = Arrays.copyOf(원본배열명, 복사할 길이);
int[] origin = {1,2,3,4,5};
int[] copy = Arrays.copyOf(origin, 10);
내가 제시한 길이 만큼의 새로운 배열이 생성(원본배열의 길이와는 상관없음)
=> 단, 내가 제시한 길이가 원본배열의 크기보다 클 경우
= > 기존의 배열에 담겨있는 값 다 복사한 후 나머지 자리 0으로 채움
- 만약 내가 제시한 길이가 원본배열의 크기보다 작을 경우
=> 기존의 배열에 담겨있는 값이 내가 제시한 길이만큼만 복사
for(int i =0; i<copy.length;i++) {
System.out.print(copy[i]+" ");
}
>> 출력결과 : 1 2 3 4 5 0 0 0 0 0
4)clone() 메소드 이용한 방법
복사본 배열 = 원본배열.clone();
int[] origin = {1,2,3,4,5};
int[] copy = origin.clone(); //{1,2,3,4,5}
System.out.println(Arrays.toString(copy));
System.out.println(origin == copy);
>> 출력 결과 [1, 2, 3, 4, 5]
false
'JAVA' 카테고리의 다른 글
6_2 . 객체 캡슐화 (setter/getter) (0) | 2022.10.26 |
---|---|
6_1. 객체란 (0) | 2022.10.26 |
5. 배열 Array (0) | 2022.10.24 |
4_5. 제어문_ 분기문 continue (0) | 2022.10.21 |
4_5. 제어문_ 분기문 break (0) | 2022.10.21 |