Java/배열

[Java]배열 특정 인덱스부터 자르는 방법

DevStory 2022. 8. 22.

배열 특정 인덱스부터 자르는 방법

Java의 배열에서 시작 인덱스와 마지막 인덱스를 설정하여 해당 범위만큼 배열을 분리해야 하는 상황이 발생할 수 있습니다.

 

예를 들어, 1부터 10까지 값을 가지는 배열에서 시작 인덱스를 3으로 설정하고 마지막 인덱스를 7로 설정하는 경우 아래처럼 결과가 나와야 합니다.

기존 배열: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

시작 인덱스: 3
마지막 인덱스: 7

특정 범위의 배열: [4, 5, 6, 7]

이번 포스팅은 시작 인덱스와 마지막 인덱스를 설정 후 해당 범위만큼 배열을 자르는 몇 가지 방법을 소개합니다.


방법 1. System 클래스의 arraycopy 메서드

System 클래스에서 제공하는 arraycopy() 메서드를 사용하여 특정 위치부터 특정 개수만큼 새로운 배열에 값을 할당합니다.

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

Object src

- 복사하고자 하는 소스로 원본 배열입니다.

 

int srcPos

- 복사하고자 하는 소스(Object src)에서 데이터를 읽을 시작 위치입니다.

 

Object dest

- 원본 배열에서 복사한 데이터를 할당하려는 배열입니다.

- 즉, 새로운 배열입니다.

 

int destPos

- 새로운 배열(Object dest)의 시작 위치입니다.

- 0으로 설정하는 경우 복사한 데이터가 새로운 배열의 인덱스 0부터 할당됩니다.

- 3으로 설정하는 경우 복사한 데이터가 새로운 배열의 인덱스 3부터 할당됩니다.

 

int length

- 원본 배열에서 복사되는 데이터 개수입니다.

 

다음 예제는 1부터 10까지 값을 가지는 배열에서 인덱스 3부터 7까지의 데이터를 새로운 배열에 할당합니다.

public static void main(String args[]) {
  int[] srcArray = IntStream.rangeClosed(1, 10).toArray();
  int[] destArray = new int[5];

  System.arraycopy(srcArray, 3, destArray, 0, 4);

  System.out.println("srcArray: " + Arrays.toString(srcArray));
  System.out.println("destArray: " + Arrays.toString(destArray));
}

[실행 결과]

srcArray: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
destArray: [4, 5, 6, 7]

방법 2. Arrays 클래스의 copyOfRange 메서드

Arrays 클래스에서 제공하는 copyOfRange() 메서드를 사용하여 특정 범위의 데이터를 새로운 배열에 할당할 수 있습니다.

 

첫 번째 매개변수로 원본 배열을 전달하고 두 번째 매개변수로 시작 위치, 세 번째 매개변수로 마지막 위치를 전달합니다.

 

다음 예제는 1부터 10까지 값을 가지는 배열에서 인덱스 3부터 7까지의 데이터를 새로운 배열에 할당합니다.

public static void main(String args[]) {
  int[] srcArray = IntStream.rangeClosed(1, 10).toArray();
  int[] destArray = Arrays.copyOfRange(srcArray, 3, 7);

  System.out.println("srcArray: " + Arrays.toString(srcArray));
  System.out.println("destArray: " + Arrays.toString(destArray));
}

[실행 결과]

srcArray: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
destArray: [4, 5, 6, 7]

방법 3. Stream API

마지막 방법으로 Java 1.8 버전 이상인 경우 Stream API를 사용하여 특정 범위의 데이터를 가져올 수 있습니다.

 

range() 메서드를 사용하여 새로운 배열의 크기를 설정 후 map() 함수를 호출하여 원본 배열의 값을 새로운 배열에 할당하는 작업을 수행합니다.

 

마지막으로 toArray() 메서드를 호출하여 배열로 변환합니다.

public static void main(String args[]) {
  int[] srcArray = IntStream.rangeClosed(1, 10).toArray();
  int[] destArray = IntStream.range(3, 7).map(num -> srcArray[num]).toArray();

  System.out.println("srcArray: " + Arrays.toString(srcArray));
  System.out.println("destArray: " + Arrays.toString(destArray));
}

[실행 결과]

srcArray: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
destArray: [4, 5, 6, 7]

배열의 타입이 정수인 경우 IntStream 클래스를 사용하고 실수인 경우 DoubleStream 클래스를 사용합니다.

반응형

댓글