본문 바로가기
코딩일기/Java

[Java] 배열 복사 하는 방법 ( clone(), copyOf(), copyOfRange() )

by 욱파이어니어 2021. 6. 2.
728x90
반응형

이번에 내가 배운것은 copyOfRange()라는 메소드이다. 

 

해당 메소드는 우리가 어떤 배열을 특정 index부터 우리가 원하는 숫자만큼 해당 배열을 복사해오는 것이다.

 

우리가 흔히 어떤 값을 복사 해올때는 아래와 같이 해왔다.

 

		int num1 = 0;
		int num2 = num1;

아래와 같이 하고 num2를 다른 수로 바꿔주고 출력을 하게 됐을때 결과는 아래와 같다.

		num2 = 5;
        
  		System.out.println(num1);
		System.out.println(num2);      

 

 

결과

0
5

 

이처럼 되는 이유는 값을 복사한것이기 때문에 num1과 num2의 값은 별개가 되는것이다.

 

하지만 배열에서는 위와 같은 방식으로 하면 안된다.

배열에서는 위와 같은 방식으로 복사하는 방법은 얕은 복사라고 하는데 

그이유는 값을 복사하는것이 아닌 주소를 복사하는것이기 때문이다.

 

예제를 통해서 한번 살펴보자.

 

		int[] arr1 = {1,5,2,6,3,7,4};
		int[] arr2 = arr1;
		
		arr2[2] = 0;

 

위와 같은 방식으로 arr2에 arr1을 넣고 arr[2]의 자리에 0을 집어 넣고 arr1과 arr2를 순서대로 출력을 하면 아래와 같은 결과가 나온다.

 

결과

[1, 5, 0, 6, 3, 7, 4]
[1, 5, 0, 6, 3, 7, 4]

 

이렇게 나온 이유는 앞서 말했듯이 주소에 의한 복사이기 때문에 arr1의 자리에 있는 2번째 index의 값을 수정하기 때문이다.

 

우리가 이를 방지하기 위해선 값에의한 복사가 이루어져야 한다.

 

 

방법1. for문을 통한 복사

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

위처럼 for문으로 배열의 index에 일일히 접근하여서 값을 대입하는 방법

 

빙법2. clone() 메소드 사용

		int[] arr1 = {1,5,2,6,3,7,4};
		int[] arr2 = arr1.clone();
		
		arr2[0] = 10;
		
		System.out.println(Arrays.toString(arr1));
		System.out.println(Arrays.toString(arr2));

이렇게 배열.clone()을 하게 되면 해당 배열의 값이 그대로 복사가 된다.

그래서 위처럼 값을 바꿔도 결과물은 아래와 같이 나온다.

 

결과

[1, 5, 2, 6, 3, 7, 4]
[10, 5, 2, 6, 3, 7, 4]

 

방법3. copyOf() 메소드 사용

		int[] arr1 = {1,5,2,6,3,7,4};
		int[] arr2 = Arrays.copyOf(arr1, 3);
		
		System.out.println(Arrays.toString(arr1));
		System.out.println(Arrays.toString(arr2));

위 방식은 시작 지점에서 특정 길이만큼만을 배열에서 복사하고 싶을때 사용한다.

Arrays.copyOf(배열, 원하는 길이);

 

결과

[1, 5, 2, 6, 3, 7, 4]
[1, 5, 2]

 

방법4. copyOfRange() 메소드 사용

		int[] arr1 = {1,5,2,6,3,7,4};
		int[] arr2 = Arrays.copyOfRange(arr1, 1,3);
		
		System.out.println(Arrays.toString(arr1));
		System.out.println(Arrays.toString(arr2));

위 메소드는 특정 index부터 시작해서 원하는 index까지를 복사하는 것이다.

Arrays.copyOfRange(배열, 시작index, 끝나는index)

 

결과

[1, 5, 2, 6, 3, 7, 4]
[5, 2]

반응형