TIL-06/08

choichoichoi·2023년 6월 8일
0

내일배움캠프

목록 보기
19/36

내일배움캠프 4주 3일차

복습힌 내용

  • 얕은 복사와 깊은 복사
    -얕은 복사: 배열은 참조형 변수이며 실제값이 아닌 실제값의 주소값을 가진다. 그래서 배열 변수값에 대입연산자 =을 이용해 복사하게 되면 주소값만 복사하게 된다. 이렇게 주소값만 복사되고 실제 값은 1개를 유지하게 되는 것을 얕은 복사라고한다. 하지만 얕은 복사를 하게 되면 많이 위험한데 그 이유는 아래를 보면 된다.
int[] arr1 = {a, b, c};라고 선언하고 
int[] arr2 = arr1;이라고 선언, 할당하게 되면 a, b, c가 
복사되는것이 아니라 그것들의 주소값이 복사된다. 만일 arr2의 값을
바꾸게 되면 arr1의 별도의 저장공간에 접근하여 값을 바꾸기 
때문에 이렇게 할 경우 arr1에 영향이 미친다.

그래서 배열을 똑같이 만들고 싶을 때는 깊은 복사를 사용해야한다.
-깊은복사: 얕은 복사처럼 가짜 복사가 아닌 진짜 새로운 배열을 똑같이 만들고 싶을 때 사용. 실제 값을 가지고 있는 배열의 기본형의 값을 꺼내 복사하는 것이다. 깊은 복사에는 두 가지가 있다.
1. 반복문 for문을 통해 하나씩 꺼내서 복사해 주는 방법.
2. 깊은 복사 메서드인 clone()과(' = '싸인으로 복사했을때 문제가 생기는 것을 방지하기 위해서) Arrays.copyOf()가 있다.

1.for문을 이용하여 깊은 복사하기.
int[] a = {1, 2, 3, 4};
int[] b = new int[a.length];

for (int i = 0; i < a.length; i++) {
	b[i] = a[i]; //깊은 복사
    }
    b[0] = 3; //b배열 0번째 값을 3으로 변경.(1 -> 3)
    System.out.println(a[0]); //  1
2. clone()메서드 이용하여 깊은 복사
int[] a = {1, 2, 3, 4};
int[] b = a.clone(); //가장 간단한 방법

하지만 클론을 이용할 때 주의 해야 하는 것이 있는데 바로 2차원 이상의 배열에서는 얕은 복사로 동작한다는 것이다. 즉 배열 안에 배열을 가지고 있을 시 바깥 배열은 새로운 주소값을 가질수 있지만 안쪽 배열은 같은 주소값을 가지고 있기 때문에 근본적인 방법은 아니다.
결론적으로 Arrays.copyOf()메서드를 사용하는 것이 좋다.


    import java.util.Arrays;
    
    public class Main {
    	public static void main(String[] args) {
    		// 2. Arrays.copyOf() 메서드
    		int[] a = { 1, 2, 3, 4 };
    		int[] b = Arrays.copyOf(a, a.length); 
            // 배열과 함께 length값도 같이 넣어준다.
    	}
    }

0개의 댓글