본문 바로가기
공부/JAVA

[JAVA] 배열복사 메서드 ( Object.clone, Arrays.copyOf(Range), System.arrayCopy)

by yeaseul912 2022. 6. 11.
728x90

자바에서 메서드를 사용하지 않고 배열을 복사하는 방법은 for문이나 while문 같은 반복문을 활용하여 직접 값을 하나씩 넣어주는 것이다.

그 보다 간단하게 메서드를 사용해서 배열을 복사하는 방법에 대해 알아본다.

- Object.clone
- Arrays.copyOf
- Arrays.copyOfRnage
- System.arrayCopy

Object.clone()

protected Object clone() throws CloneNotSupportedException

clone 메서드는 네이티브 메서드로, 해당하는 객체의 모든 필드를 복사하여 새로운 객체에 넣어 반환하여 준다.

깊은 복사 : 실제 값을 새로운 메모리 공간에 복사하는 것

얕은 복사 : 주소값을 복사

public class Test {
	public static void main(String[] args) {
      int[] x = {1, 2, 3, 4, 5}; // 원본 : [I@7ad041f3
      int[] y = x; // 얕은복사 : [I@7ad041f3
      int[] xClone = x.clone(); // 깊은복사 : [I@251a69d7
      System.out.println(xClone == x); // 깊은복사, false
      System.out.println(y == x); // 얕은복사, true
      System.out.println(xClone.getClass() == x.getClass()); // true
      System.out.println(xClone.equals(x)); // false
    }
}

 

 

원본 배열의 값이 변경되는 것을 막기 위해 아래와 같이 메서드를 만들면 좋을것 같다.!!

public int[] getScores() {
	return scores.clone();
}

 

더욱 자세한건.. https://velog.io/@tomato2532/Object.clone-%EC%96%95%EC%9D%80-%EB%B3%B5%EC%82%AC-%EA%B9%8A%EC%9D%80-%EB%B3%B5%EC%82%AC-%EB%B3%B5%EC%82%AC-%EC%83%9D%EC%84%B1%EC%9E%90

 

[JAVA] Object.clone(), 얕은 복사, 깊은 복사, 복사 생성자

Obejct 클래스에는 clone() 메서드가 정의되어 있습니다. clone 메서드는 네이티브 메서드로 해당하는 객체의 모든 필드를 복사하여 새로운 객체에 넣어 반환하는 동작을 수행합니다.위 코드가 Object

velog.io

https://zzang9ha.tistory.com/372

 

[Java] - 깊은 복사(Deep Copy) vs 얕은 복사(Shallow Copy)

📎 Java 깊은 복사(Deep Copy)와 얕은 복사(Shallow Copy) 안녕하세요! 이번에 정리할 내용은 자바에서의 깊은 복사와 얕은 복사 입니다. 깊은 복사와 얕은 복사라는 개념은 평소에 접한적이 꽤 있었습

zzang9ha.tistory.com


Arrays.copyOf(original, newLength)

public static int[] copyOf(int[] original, int newLength)

Arrays 클래스에 있는 메서드로 배열을 처음부터 지정한 길이만큼 복사하여 준다.

original : 복사할 배열

newLength : 배열의 길이, 원본 배열의 길이를 넘어가는 경우에는 null이 들어간다.

import java.util.Arrays;

public class arrayCopy {
	public static void main(String[] args) {
		int [] arr1 = {1, 2, 3, 4, 5};
        int [] arr2 = Arrays.copyOf(arr1, arr1.length-2); // {1, 2, 3}
		int [] arr3 = Arrays.copyOf(arr1, arr1.length); // {1, 2, 3, 4, 5}
		int [] arr4 = Arrays.copyOf(arr1, arr1.length + 2); // {1, 2, 3, 4, 5, 0, 0}
    }
}

Arrays.copyOfRange( original, from, to )

public static <T> T[] copyOfRange(T[] original, int from, int to)

Arrays 클래스에 있는 메서드로 배열을 시작 인덱스부터 마지막 인덱스까지 잘라서 복사하여 준다.

시작 인덱스 값은 포함하고 마지막 인덱스 값은 포함하지 않는다.

original : 복사할 배열

from : 복사할 배열의 시작 인덱스( 포함 )

to : 복사할 배열의 마지막 인덱스, 원본 배열의 길이를 넘길 수 있음.

import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
          int[] arr1 = {1, 2, 3, 4, 5};
          int[] arr2 = Arrays.copyOfRange(arr1, 0, 3); // {1, 2, 3}
          int[] arr3 = Arrays.copyOfRange(arr1, 2, arr1.length + 2); // {3, 4, 5, 0, 0}

    }
}

System.arraycopy()

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

System 클래스에 있는 메서드로 아래와 같이 인자를 받아서 배열을 복사한다.

src : 원본 배열 객체, srcPos+length 보다 길어야 한다.

srcPos : 원본 배열의 복사 시작 위치

dest : 복사할 배열 객체, destPos+length 보다 길어야 한다.

destPos : 복사할 배열의 데이터의 시작 위치 

length : 복사할 요소의 수 

import java.util.Arrays;

public class Test {
	public static void main(String[] args) {
    int[] scores = { 1, 2, 3, 4, 5, 6, 7 };

    int[] newScores = new int[7];
    System.arraycopy(scores, 0, newScores, 0, 7); // [1, 2, 3, 4, 5, 6, 7]
    
    int[] partialNewScores = new int[4];
    System.arraycopy(scores, 4, partialNewScores, 1, 3); // [0, 5, 6, 7]
    }
}

지금까지 배열을 복사하는 예제를 설명할 때, 배열의 요소 값이 모두 기본 자료형이었다.

배열의 요소 값이 기본 자료형이 아닌 참조 자료형이라면, 위에서 설명한 방법으로 배열의 복사를 진행하더라도 동일한 요소 참조 값을 가리키는 상황이 발생한다.

배열의 요소가 참조 자료형일 경우에는 각 요소의 값을 clone() 기능을 통해 생성해서 복사하려는 배열에 추가해야 한다.!

반응형

'공부 > JAVA' 카테고리의 다른 글

[JAVA] Extends 와 Super  (0) 2022.06.22
[JAVA] 제네릭(Generic)  (0) 2022.06.21
ArrayList(LinkedList) 를 String으로 변환하는 방법 (JAVA)  (0) 2022.05.24
[JAVA] GUI 계산기 만들기  (0) 2022.05.21
[JAVA] 변수와 자료형  (0) 2021.10.17

댓글