본문 바로가기
JAVA

JAVA(값 복사 / 참조 복사)

by 글로리. 2020. 6. 3.

01. 값 복사

  • 변수를 서로 대입하거나 파라미터로 사용

1) 기본 자료형 간의 대입

단순 복사이므로 복사 후 원본이 변경되더라도 복사본에는 영향 없음. (반대도 마찬가지임)

public class Note7
{
    public static void main(String[] args)
    {
        int a = 50; // 원본
        int b = a;  // 복사본
        System.out.println("a=" + a);
        System.out.println("b=" + b);
        System.out.println("----------");

        a += 50;    // 원본 수정
        System.out.println("a=" + a);
        System.out.println("b=" + b);
        System.out.println("----------");

        b -= 50;    // 복사본 수정
        System.out.println("a=" + a);
        System.out.println("b=" + b);
    }
}

// 실행결과

a=50
b=50
----------
a=100
b=50
----------
a=100
b=0

02. 참조 복사

  • 배열을 서로 대입하거나 파라미터로 사용할 경우

    1) 배열간의 대입

  • 배열의 변수 이름에 원소들을 참조시키기 때문에 복사본을 수정할 경우 원본도 수정됨. (반대의경우도 마찬가지)

public class Note8
{
    public static void main(String[] args)
    {
        int[] origin = {1, 2};
        int[] copy = origin;

        System.out.println("origin[0]=" + origin[0]);
        System.out.println("origin[1]=" + origin[1]);
        System.out.println("copy[0]=" + copy[0]);
        System.out.println("copy[1]=" + copy[1]);
        System.out.println("----------");

        copy[0] += 100;
        copy[1] += 200;

        System.out.println("origin[0]=" + origin[0]);
        System.out.println("origin[1]=" + origin[1]);
        System.out.println("copy[0]=" + copy[0]);
        System.out.println("copy[1]=" + copy[1]);
    }
}


// 실행결과

origin[0]=1
origin[1]=2
copy[0]=1
copy[1]=2
----------
origin[0]=101
origin[1]=202
copy[0]=101
copy[1]=202

2) 배열을 값 복사 형태로 복사하는 방법

  • 배열의 각 원소를 하나하나 복사한다.
public class Note9
{
    public static void main(String[] args)
    {
        int[] origin = {1, 2};

        // 원본과 동일한 사이즈의 배열 생성
        int[] copy = new int[origin.length];

        // 각각의 원소를 개별적으로 복사해야 한다.
        copy[0] = origin[0];
        copy[1] = origin[1];

        System.out.println("origin[0]=" + origin[0]);
        System.out.println("origin[1]=" + origin[1]);
        System.out.println("copy[0]=" + copy[0]);
        System.out.println("copy[1]=" + copy[1]);
        System.out.println("----------");

        // 복사본을 수정하더라도 원본의 변화가 없다.
        copy[0] += 100;
        copy[1] += 200;

        System.out.println("origin[0]=" + origin[0]);
        System.out.println("origin[1]=" + origin[1]);
        System.out.println("copy[0]=" + copy[0]);
        System.out.println("copy[1]=" + copy[1]);
    }
}


// 실행결과

origin[0]=1
origin[1]=2
copy[0]=1
copy[1]=2
----------
origin[0]=1
origin[1]=2
copy[0]=101
copy[1]=202

* 위 소스 코드를 간단하게 할 수 있음.

System.arraycopy(원본배열, 원본의 복사 시작 위치, 복사될 배열, 복사가 시작될 위치, 복사할 값의 길이);
public class ArrayCopy3 {
    public static void main(String[] args) {
        int[] origin = {1, 2, 3, 4, 5};
        // 원본과 동일한 사이즈의 배열 생성
        int[] copy = new int[origin.length];

        // origin의 0번째 부터 copy의 1번째에 3칸을 복사
        System.arraycopy(origin, 0, copy, 1, 3);

        for (int i=0; i<origin.length; i++) {
            System.out.printf("origin[%d]=%d \t copy[%d]=%d\n",
                                i, origin[i], i, copy[i]);
        }

        System.out.println("-----------");

        // 주로 다음과 같이 사용됨
        System.arraycopy(origin, 0, copy, 0, origin.length);

        for (int i=0; i<origin.length; i++) {
            System.out.printf("origin[%d]=%d \t copy[%d]=%d\n",
                                i, origin[i], i, copy[i]);
        }
    }
}

// 실행결과

origin[0]=1      copy[0]=0
origin[1]=2      copy[1]=1
origin[2]=3      copy[2]=2
origin[3]=4      copy[3]=3
origin[4]=5      copy[4]=0
-----------
origin[0]=1      copy[0]=1
origin[1]=2      copy[1]=2
origin[2]=3      copy[2]=3
origin[3]=4      copy[3]=4
origin[4]=5      copy[4]=5

'JAVA' 카테고리의 다른 글

JAVA(클래스, 객체, 생성자)  (0) 2020.06.04
JAVA(재귀함수)  (0) 2020.06.04
JAVA(메서드)  (0) 2020.06.03
JAVA(2차 배열)  (0) 2020.06.02
JAVA(1차 배열)  (0) 2020.06.02

댓글