Published 2022. 10. 25. 14:27

 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
복사했습니다!