자바 객체 배열 복사

배열 복사 메서드

System.arrayCopy(src, srcPos, dest, destPos, length)

Object src : 원본 소스

int srcPos : 원본 소스에서 복사를 시작할 위치

Object dest : 복사하려는 대상

int destPos : 복사하는 대상에서의 시작할 위치

int length : 얼마만큼 복사할지

e.g.

System.arraycopy(library, 0, copyLibrary, 0, 5);
// library 배열의 0번째 요소부터 복사해서 copyLibrary 배열의 0번째 부터 5개를 붙여넣기

 

얕은 복사(Shallow Copy)

객체 주소만 복사되어 한쪽 배열의 요소를 수정하면 같이 수정 된다.

즉, 두 배열이 같은 객체를 가리킨다

public class AquariumCopyTest {
    public static void main(String[] args) {
        Aquarium[] fishTank = new Aquarium[3];
        Aquarium[] copyFishTank = new Aquarium[3];

        fishTank[0] = new Aquarium("betta", 1);
        fishTank[1] = new Aquarium("guppy", 5);
        fishTank[2] = new Aquarium("otocinclus", 2);

        System.arraycopy(fishTank, 0, copyFishTank, 0, 3);

        System.out.println("====copy fish tank====");
        for (Aquarium fish : copyFishTank){
            fish.showInfo();
        }

        fishTank[0].setFishName("goldfish");
        fishTank[0].setFishCount(3);

        System.out.println("====fish tank====");
        for(Aquarium fish : fishTank){
            fish.showInfo();
        }

        System.out.println("====copy fish tank====");
        for (Aquarium fish : copyFishTank){
            fish.showInfo();
        }
    }
}

 

깊은 복사(Deep Copy)

각각의 객체를 생성하고

그 객체의 값을 복사하여 배열이 서로 다른 객체를 가리키도록 한다.

public class AquariumCopyTest {
    public static void main(String[] args) {
        Aquarium[] fishTank = new Aquarium[3];
        Aquarium[] copyFishTank = new Aquarium[3];

        fishTank[0] = new Aquarium("betta", 1);
        fishTank[1] = new Aquarium("guppy", 5);
        fishTank[2] = new Aquarium("otocinclus", 2);

        // 이렇게 따로 만들어야 한다.
        copyFishTank[0] = new Aquarium();
        copyFishTank[1] = new Aquarium();
        copyFishTank[2] = new Aquarium();

        for (int i=0; i<fishTank.length; i++){
            copyFishTank[i].setFishName(fishTank[i].getFishName());
            copyFishTank[i].setFishCount(fishTank[i].getFishCount());
        }

        fishTank[0].setFishName("goldfish");
        fishTank[0].setFishCount(3);

        System.out.println("====fish tank====");
        for(Aquarium fish : fishTank){
            fish.showInfo();
        }

        System.out.println("====copy fish tank====");
        for (Aquarium fish : copyFishTank){
            fish.showInfo();
        }
    }
}