1. arraycopy 메소드


arraycopy(src, srcPos, dest, destPos, length);

src : 복사할 배열

srsPos : 복사할 시작 index

dest : 붙여넣을 배열

destPos : 붙여넣을 시작 index

length : 붙여넣을 갯수

 

package classpart;

public class Test {
    public static void main(String[] args) {
       Student[] stus1 = new Student[3];
       Student[] stus2 = new Student[3];

       stus1[0] = new Student();
       stus1[1] = new Student();
       stus1[2] = new Student();

       stus1[0].setName("John");
       stus1[0].setStudentID(1001);
       stus1[1].setName("Kelly");
       stus1[1].setStudentID(1002);
       stus1[2].setName("Paul");
       stus1[2].setStudentID(1003);

       //stus1을 stus2에 복사
       System.arraycopy(stus1, 0, stus2, 0, stus1.length);

       for(int i=0; i<stus2.length; i++) {
             stus2[i].showInfo();
       }

       System.out.println();

       //stus1의 첫 번째 객체 정보 변경
       stus1[0].setName("Mac");
       stus1[0].setStudentID(9999);

       //stus2의 모든 객체 정보 출력
       for(int i=0; i<stus2.length; i++) {
             stus2[i].showInfo();
       }
    }
}

실행결과

1001, John

1002, Kelly

1003, Paul

9999, Mac

1002, Kelly

1003, Paul

stus1의 첫 번째 요소가 가르키는 객체 정보를 변경했는데 stus2의 첫 번째 요소의 객체 정보도 변경되었다.

arraycopy() 메소드의 원리를 보면 이유를 알 수 있다.

어차피 객체 배열에 요소로 저장되어있는 것은 객체의 주소 정보이다. arraycopy() 메소드는 객체의 주소값을 복사해서 넘겨주는 메소드이다. 따라서 stus1과 stus2의 각 요소는 같은 객체를 가르키고 있는 참조변수인 것이다. 그래서 stus1로 객체에 접근해 정보를 변경하면 stus2를 통해 출력해도 바뀐 정보가 나오는 것이다.

이를 얕은 복사라고 한다.

 

 

2. 깊은 복사


package classpart;

public class Test {
    public static void main(String[] args) {
       Student[] stus1 = new Student[3];
       Student[] stus2 = new Student[3];

       stus1[0] = new Student();
       stus1[1] = new Student();
       stus1[2] = new Student();

       stus1[0].setName("John");
       stus1[0].setStudentID(1001);
       stus1[1].setName("Kelly");
       stus1[1].setStudentID(1002);
       stus1[2].setName("Paul");
       stus1[2].setStudentID(1003);

       stus2[0] = new Student();
       stus2[1] = new Student();
       stus2[2] = new Student();

       for(int i=0; i<stus1.length; i++) {
          stus2[i].setName(stus1[i].getName());
          stus2[i].setStudentID(stus1[i].getStudentID());
       }

       for(int i=0; i<stus2.length; i++) {
             stus2[i].showInfo();
       }

       System.out.println();

       stus1[0].setName("Assy");
       stus1[0].setStudentID(10000);

       for(int i=0; i<stus2.length; i++) {
             stus2[i].showInfo();         
       }
    }
}

실행결과

1001, John

1002, Kelly

1003, Paul

1001, John

1002, Kelly

1003, Paul

stus2 인스턴스도 따로 만들고 stus1의 get() 메소드로 정보만 출력해서 저장하였다. 이 경우는 stus1과 stus2의 각 요소가 서로 다른 인스턴스를 가르키기 때문에 stus1을 통해 객체 정보를 변경한다고 해서 stus2가 참조하는 객체는 영향을 받지 않는다.

'프로그래밍 언어 > Java' 카테고리의 다른 글

(Java) 29 - 상속  (0) 2020.05.17
(Java) 28 - ArrayList 클래스  (0) 2020.05.17
(Java) 26 - 객체 배열  (0) 2020.05.17
(Java) 25 - 배열  (0) 2020.05.17
(Java) 24 - 싱글톤 패턴  (0) 2020.05.17

+ Recent posts