본문 바로가기
Language/JAVA

배열(Array) 복사를 이용한 배열 자르기

by 홍띠 2022. 6. 5.

 

자바(JAVA)에서는 데이터 타입이 원시 타입(Primitive Type) 참조 타입(Reference Type) 크게 두가지로 분류된다.

  • 원시형(Privitive Type)은 정수형, 실수형, 논리형(boolean), 문자형(Char) 등 데이터 자체를 변수에서 담아내는 유형
  • 참조형(Reference Type)은 배열, 문자열(String), 클래스, 인터페이스 등 객체의 번지를 참조하는 타입

여기서, 참조형 타입은 객체를 복사할때 얕은복사(Shallow Copy)깊은복사(Deep Copy)로 나뉘어 진다.

  • 얕은복사(Shallow Copy)는 복사할때 객체의 주소값이 복사 되는 것으로, 여러개의 객체가 하나의 대상을 가리키고 있어 하나의 객체에서 값 변경이 일어나면 나머지 객체의 값도 수정된다.
  • 깊은복사(Deep Copy)는 얕은복사와 달리 데이터의 값 자체를 복사해서 독립적인 메모리에 저장되어, 서로 영향을 미치지 않는다.

이번 글에서는 참조 타입의 배열의 깊은복사 방법과 이를 통해서 배열을 자르는 방법을 다뤄보자.

 

아래의 메서드들은 모두 깊은복사를 실행하는 방법이다. 이 중 상황에 맞는 방법을 사용하면 된다.

 

1. Object.clone() : 배열 전체를 단순 복사 한다.

String[] arr1 = {"a","b","c","d","e"};
String[] arr2 = arr1.clone();
for (int i=0; i< arr2.length; i++) {
  System.out.print(" "+arr2[i]);
}
//결과: a b c d e

2. Arrays.copyOf() : 배열의 시작점 ~ 원하는 지점 지정해서 복사한다.

String[] arr1 = {"a","b","c","d","e"};
String[] arr2 = Arrays.copyOf(arr1,3);
for (int i=0; i< arr2.length; i++) {
    System.out.print(" "+arr2[i]);
}
//결과: a b c

3. Arrays.copyOfRange() : 원하는 지점 ~ 원하는 지점 지정해서 복사한다. 2번의 copyOf 와는 다르게 시작점도 지정 할 수 있다.

String[] arr1 = {"a","b","c","d","e"};
String[] arr2 = Arrays.copyOfRange(arr1,1,3);
for (int i=0; i< arr2.length; i++) {
    System.out.print(" "+arr2[i]);
}
//결과: b c

4. System.arraycopy() : 원하는 지점부터 원하는 길이의 배열을 원하는 위치에 복사한다. 복사 대상의 시작점, 길이를 지정 할 수 있고, 복사되는 배열의 위치도 지정 할 수 있다.

String[] arr1 = {"a","b","c","d","e"};
String[] arr2 = new String[7];
//System.arraycopy(원본배열 ,원본배열 시작위치,대상배열, 대상배열 시작위치, 원본복사 길이)
//원본 배열(arr1)을 index 1 부터 3의 길이 만큼 arr2의 대상배열(arr2)의 index 2 위치에 복사
System.arraycopy(arr1, 1, arr2, 2, 3);
for (int i=0; i< arr2.length; i++) {
    System.out.print(" "+arr2[i]);
}
//결과: null null b c d null null

 

위의 메소드를 설명하는 예시를 String[]을 사용하였지만, byte[], int[], char[] 등 다른 배열에도 모두 적용 가능하다.

'Language > JAVA' 카테고리의 다른 글

Unix Timestamp를 원하는 Date형식으로 변경하기  (0) 2022.06.05