본문 바로가기

JAVA/Study

29. 배열의 복제 [얕은복제 , 깊은복제] - pointer , arraycopy

public class Example {

    public static void main(String[] args) {
        int[] arr1;
        int[] arr2;
        int[] arr3;

        //실제 주소배정이 이루어진 후 배정된 주소를 포인터라 함
        arr1 = new int[]{1, 96,88,100};
        arr2 =arr1; //얕은복제 - 주소를 복사해옴
        System.out.println(arr1);
        System.out.println(arr2);
       
        for(int x:arr1){
            System.out.print(x+"\t");
        }System.out.println();
        for(int x:arr2){
            System.out.print(x+"\t");
        }System.out.println(); //주소를 복사해와서 값도 똑같다
        //System.out.println("arr3 :"+arr3);  --arr3는 포인터인 실제 주소를 배정하지 않았으므로 NullPointerException 에러가 뜬다
        System.out.println("arr1==arr2 : "+(arr1==arr2)); //arr1의 주소와 arr2의 heap의 주소가 같은가
//인덱스=키
    }

}

public class Example4 {

    public static void main(String[] args) {
        String[] str1 = {"java", "python", "c-language"};
        String[] str2 = {"java",    "python","c-language"};
        String[] str3;
        str3 = str2; //얕은복제 : 같은 기억 장소를 가르키고있음(주소만복제)
        String[] str4 =new String[5];
       
        System.out.println(str1==str2); //주소비교로 인해 false
        System.out.println(str2==str3); //str3주소에 str2주소를 복사한거라 true
        System.out.println(str2);
        System.out.println(str3);
        //깊은복제 : 다른 기억장소를 가르키도록 데이터를 복제(데이터를 heap에 갖고옴)
        System.arraycopy(str2, 0, str4, 0, str2.length);//str2의 위치 0번째부터 복사를한다 str4의    0번째부터 붙여넣는다 str2의 길이까지
        System.out.println("\n"+str4);
        for(String data:str4){
            System.out.println(data);
        }
    }

}