다오의 개발일지

TIL-11 얕은 복사, 깊은 복사 본문

JAVA

TIL-11 얕은 복사, 깊은 복사

다오__ 2023. 5. 23. 11:56

얕은 복사

배열은 참조형 변수이며 실제값이 아닌 실제값의 '주소값'을 가진다.

따라서 대입 연산자 =를 사용하게 되면 주소값만 복사가 된다.

이렇게 주소값만 복사되고 실제값은 1개로 유지되는 것을 얕은 복사라고 한다.

주소값만 복사된다는 것이 무슨 의미일까?

대입된 스택 영역의 참조형 변수(주소값)가 힙 영역의 실제값을 가리킨다.

힙영역의 실제값은 복사가 되지 않는다.

얕은 복사를 실습해보자


Int[] a = {1,2,3,4};

Int[] b = a;

b[0] = 3;

System.out.println(a\[0\]) // 출력 3

신기하다. b 배열을 수정했는데 a배열의 값까지 수정이 되었다.

이는 가리키고 있는 a배열과 b배열 둘 다 같은 주소값을 가리키고 있기 떄문에 실제값을 수정하면 두 배열 모두 같은 결과를 출력하게 된다

 

 

깊은 복사

얕은 복사처럼 가짜 복사가 아닌 진짜 새로운 배열을 만들고 싶을때는 깊은 복사를 이용한다.

방법에는 반복문이나 다양하게 제공하는 메서드들을 이용해서 복사하는 방법이 있다.


Int []a = {1,2,3,4};

Int []b = new int(a.length);

For (int i=0; i<4; i++){

b[i] = a[i];  //깊은 복사

}

b[0] =3

System.out.println(a[0])  // 출력 1 , 깊은 복사를 하였기 때문에 a 배열은 그대로다.

깊은 복사 메서드


// 1. clone() 메서드

Int[] a = {1,2,3,4}

Int[] b = a.clone(); //가장 간단한 방법

//하지만, clone()메서드는 2차원 이상 배열에서는 얕은 복사로 작동한다..

//2. Arrays.copyOf() 메서드

Int[]a = {1,2,3,4};

Int[]b = Arrays.copyOf(a, a.length) //배열과 함께 length값도 같이 넣어준다.