Java/배열

[Java]배열 지정된 범위의 숫자 생성하는 방법

DevStory 2022. 8. 22.

배열 지정된 범위의 숫자 생성하는 방법

정수 타입인 배열의 값을 1부터 5까지 할당해야 하는 경우 다음 소스 코드처럼 배열을 정의할 때, 배열의 값을 초기화할 수 있습니다.

int[] intArray = {1, 2, 3, 4, 5};

위 예제는 숫자의 범위가 작기 때문에 중괄호에 값을 할당할 수 있습니다.

 

하지만, 1부터 1000까지 값을 할당하거나 또는 1부터 1000까지 5의 배수인 값만 할당하고 싶은 경우 중괄호에 일일이 값을 입력하는 방법은 좋지 않습니다.

 

숫자에 특정 패턴이 존재하는 경우 패턴과 일치하지 않은 값이 포함되었을 때, 애플리케이션 로직에 큰 문제가 발생할 수 있습니다.

 

이번 포스팅은 배열에 지정된 범위의 숫자를 생성할 수 있는 몇 가지 방법을 소개합니다.


방법 1. 반복문

가장 심플한 방법으로 반복문을 사용하여 특정 범위의 숫자 값을 배열에 값을 할당합니다.

 

만약, 특정 패턴이 존재하는 경우 조건문을 같이 사용합니다.

 

다음 예제는 1부터 100까지 숫자에서 5의 배수만 배열에 추가합니다.

public static void main(String args[]) {
  int size = 20;
  int[] intArray = new int[size];

  for(int loop = 0; loop <= 100; loop++) {
    int index = (loop / 5) - 1;
    if(loop > 0 && loop % 5 == 0) {
      intArray[index] = loop;
    }
  }

  System.out.println(Arrays.toString(intArray));
}

[실행 결과]

[5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]

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

반복문을 사용하는 방법은 단순하지만 특정 패턴이 존재하는 경우 소스 코드가 복잡해질 수 있습니다.

 

Java 1.8부터 제공하는 Arrays 클래스의 setAll() 메서드를 사용하면, 반복문으로 작성한 소스 코드를 줄일 수 있습니다.

 

첫 번째 매개변수로 배열을 전달하고 두 번째 매개변수로 생성기(generator) 함수를 전달합니다.

 

setAll() 메서드는 첫 번째 매개변수로 전달된 배열을 순회하면서 생성기 함수를 호출합니다.

 

다음 예제는 1부터 100까지 숫자에서 5의 배수만 배열에 추가합니다.

public static void main(String args[]) {
  int size = 20;
  int[] intArray = new int[size];
  Arrays.setAll(intArray, num -> (num + 1) * 5);

  System.out.println(Arrays.toString(intArray));
}

[실행 결과]

[5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]

방법 3. Stream API

마지막 방법으로 IntStream 클래스에서 제공하는 range() 메서드 또는 rangeClosed() 메서드를 사용하여 배열 선언과 초기화를 동시에 할 수 있습니다.

 

range() 메서드와 rangeClosed() 메서드의 첫 번째 매개변수로 시작 값을 전달하고 두 번째 매개변수로 종료 값을 전달합니다.

 

range() 메서드와 rangeClosed() 메서드의 차이점은 종료 값 포함 여부이며, 반환 결과를 배열로 받기 위해 마지막에 toArray() 메서드를 호출합니다.

 

다음 예제는 range() 메서드와 rangeClosed() 메서드의 차이점을 보여줍니다.

public static void main(String args[]) {
  int[] intArray1 = IntStream.range(0, 5).toArray();
  int[] intArray2 = IntStream.rangeClosed(0, 5).toArray();

  System.out.println("intArray1: " + Arrays.toString(intArray1));
  System.out.println("intArray2: " + Arrays.toString(intArray2));
}

 [실행 결과]

intArray1: [0, 1, 2, 3, 4]
intArray2: [0, 1, 2, 3, 4, 5]

range() 메서드는 종료 값을 포함하지 않지만, rangeClosed() 메서드는 종료 값을 포함합니다.

 

다음 예제는 range() 메서드와 rangeClosed() 메서드의 첫 번째 매개변수로 5를 전달하고 두 번째 매개변수로 10을 전달합니다.

public static void main(String args[]) {
  int[] intArray1 = IntStream.range(5, 10).toArray();
  int[] intArray2 = IntStream.rangeClosed(5, 10).toArray();

  System.out.println("intArray1: " + Arrays.toString(intArray1));
  System.out.println("intArray2: " + Arrays.toString(intArray2));
}

[실행 결과]

intArray1: [5, 6, 7, 8, 9]
intArray2: [5, 6, 7, 8, 9, 10]

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

반응형

댓글