*JAVA*

[java] 배열복사(Array copy)

깐부로부터 2021. 10. 24. 03:04

1. 얕은복사 : 배열의 주소값만을 복사

                 => 같은 객체를 참조

2. 깊은복사 : 동일한 새로운 배열을 하나 생성해서 실제 내부값까지 복사

                 => 서로 다른 객체를 참조


얕은 복사

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
// 얕은복사
    
    public void method1() {        
        int[] origin = {12345};
        
        System.out.println("--- 원본배열 출력 ---");
        for(int i = 0; i <= origin.length-1; i++) {
            System.out.println(origin[i] + " ");
        }
        
        // 복사본배열
        int[] copy = origin;
        
        System.out.println("--- 복사본배열 출력 ---");
        for(int i = 0; i <= copy.length-1; i++) {
            System.out.println(copy[i] + " ");
        }
        
       origin[2= 99;
        
        System.out.println("***원본배열 수정 완료***");
        
        System.out.println("\n--- 원본배열 출력 ---");
        
        for(int i = 0; i <= origin.length-1; i++) {
            System.out.println(origin[i] + " "); // 99
        }
        
        System.out.println("\n--- 복사본배열 출력 ---");
        for(int i = 0; i <= copy.length-1; i++) {
            System.out.println(copy[i] + " "); // 99
        }
        
        
        //"분명히" 원본 배열만 수정을 했는데
        // 복사한배열도 수정이 되어있네?!?!
        // => 두개가 똑같나~?!!??!?
            
        System.out.println("\n원본 배열의 해시코드 " + origin.hashCode());
        System.out.println("원본 배열의 해시코드 " + copy.hashCode());
        // 얕은 복사 => 배열의 주소값이 복사되어 원본과 복사본이 같다.
        
    }
cs
 

 

깊은 복사

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 깊은 복사1
    
    public void method2() {
        
        int[] origin = {12345};                
        int[] copy = new int[] {origin.length}; // 5
        
        /*
         * copy[0] = origin[0];         
         * copy[내가 넣고자하나 인덱스] = origin[내가 복사하고자하는 인덱스];
         */
        
        for(int i = 0; i <= copy.length-1; i++) {
            copy[i] = origin[i];
        }
        origin[2= 33;
        
        System.out.println("***원본배열 수정 완료***");
        
        System.out.println("\n--- 원본배열 출력 ---");
        
        for(int i = 0; i <= origin.length-1; i++) {
            System.out.println(origin[i] + " ");
        }
        
        System.out.println("\n--- 복사본배열 출력 ---");
        for(int i = 0; i <= copy.length-1; i++) {
            System.out.println(copy[i] + " ");
        }
        
        System.out.println("\n원본 배열의 해시코드 " + origin.hashCode());
        System.out.println("원본 배열의 해시코드 " + copy.hashCode());
        // 실제 우리가 원하는 배열 내부 값들이 복사된것을 확인가능!
        // 주소값 복사 X
        }
cs

 

다양한 깊은 복사

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
// 깊은복사 2. arraycopy() 메소드 이용
        public void method3() {
            
            // 새로운 배열을 생성한 후
            // System. 클래스에서의 arryacopy() 메소드 호출
            // 몇 번 인덱스부터 '몇개를' '어느 위치부터' 넣을건지 직접 지정 가능! ()안에 작성할거다!!!!!!!!!!
            
            int[] origin = {12345};
            
            int[] copy = new int[10]; // 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
            
            // [표현법] System.arraycopy(원본배열이름, 원본배열에서 복사를 시작할 인덱스, 
            //                                 복사본배열이름, 복사본배열에서 복사가 시작될 인덱스, 복사할 갯수);
            System.arraycopy(origin, 0, copy, 05);
            System.arraycopy(origin, 0, copy, 15);
            //System.arraycopy(origin, 2, copy, 9, 2); // ArrayindexourofBounds! 방벖어!
            
            System.out.println("-- 복사 출력 --");
            for(int i = 0; i <= copy.length-1; i++) {
                System.out.print(copy[i] + " ");
            }
            
            System.out.println("\n원본 배열의 해시코드 " + origin.hashCode());
            System.out.println("복사본 배열의 해시코드 " + copy.hashCode());        
 
        }
    
        
        // 깊은복사 3. copyOf() 메소드 사용
        public void method4() {
            
            // Arrays  클래스에서 제공하는 copyOf() 메소드            
            int[] origin = {12345};
            
            // [표현법] 복사본 배열 = Arrays.copyOf(원본배열이름, 복사할 객수);
            int[] copy = Arrays.copyOf(origin, 10);
            
            System.out.println("-- 복사본배열 출력 --");
            for(int i = 0; i <= copy.length-1; i++) {
                System.out.println(copy[i] + " ");            
            }
            /*
             * 
             * 2. System.arraycopy()
             * 몇번 인덱스부터 몇개를 어느 위치의 인덱스에 복사할것인지 모두 지정 가능
             * 
             * 3. Arrays.copyOf()
             * 무조건 원본배열의 0번 인덱스부터 복사가 진행!!!(내가 지정한 갯수만큼!)
             */
            
        }
        
        // 깊은복사 4. clone() 메소드 이용
        public void method5() {
            // [표현법] 복사본 배열 이름 = 원본배열이름.clone();
            
            int[] origin = {12345};
                        
            //얕은복사
//            int[] copy = origin;
            //깊은복사
            int[] copy = origin.clone();
            // 인덱스를 직접지정 X, 복사할 갯수 지정 X => 원본배열과 완전히 같다.
            System.out.println(Arrays.toString(copy));
            // toString => 예쁘게 좀 보자~
            // Arrays.toString(내용을 출력하고 싶은 배열의 식별자를 입력);
            // ex) [1, 2, 3, 4, 5]
        
                        
        }
cs

 

'*JAVA*' 카테고리의 다른 글

[java] 캡슐화 - setter / getter 메소드  (0) 2021.10.25
[java] 객체(Object)  (0) 2021.10.24
[java] 배열(Array)  (0) 2021.10.22
[java] 분기문 - continue  (0) 2021.10.20
[java] 분기문 - break  (0) 2021.10.20