본문 바로가기

개념정리(JAVA)

배열과 아규먼트

1. 배열

자바에서 배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루기 위해 사용됩니다. 이는 단일 이름으로 여러 값을 저장하고, 인덱스를 통해 이러한 값들에 접근할 수 있습니다. 배열의 각 요소는 배열 이름과 함께 대괄호( [] ) 안에 요소의 위치를 나타내는 인덱스를 사용하여 참조됩니다. 인덱스는 0부터 시작합니다. 예를 들면, 5개의 정수를 저장할 수 있는 배열을 생성하고 싶다면 다음과 같이 선언합니다.

int[] myArray = new int[5];

 

이는 정수형 값을 저장할 수 있는 길이가 5인 배열을 생성합니다. 배열의 각 요소에는 기본값으로 0이 할당됩니다. 배열의 특정 위치에 값을 할당하거나 읽어오려면 인덱스를 사용합니다.

myArray[0] = 10; // 배열의 첫 번째 요소에 10을 할당
int firstValue = myArray[0];  // 배열의 첫 번째 요소를 읽어와서 firstValue 변수에 저장

 

또한 배열을 선언하면서 각 요소의 값을 초기화 할 수 있는데, 이는 각 요소의 값을 중괄호( { } ) 안에 콤마( , )로 구분하여 직접 지정할 수 있습니다. 이 방법은 배열의 길이를 명시적으로 선언하지 않아도 되며, 초기화 시점에 배열 요소의 값을 바로 설정할 수 있는 간편한 방법입니다.

int[] = numbers = {10, 20, 30, 40, 50};

이 예제에서는 배열 numbers를 선언함과 동시에 { 10, 20, 30, 40, 50 }으로 초기화합니다.

다음은 배열을 사용하는 예제를 살펴보겠습니다.

배열을 역순으로 정렬하기

import java.util.Arrays;
import java.util.Scanner;

public class InvertArray {
    static void swap(int[] a, int idx1,int idx2) {
        int temp = a[idx1];
        a[idx1] = a[idx2];
        a[idx2] = temp;
    }

    //--- 배열 a의 요소를 역순으로 정렬 ---//
    static void reverse(int[] a) {
        for(int i = 0; i < a.length / 2; i++)
            swap(a, i, a.length - i - 1);
    }

    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);

        System.out.println("점수의 개수: ");
        int num = stdIn.nextInt(); // 점수의 개수를 입력받음

        int[] scores = new int[num];

        for(int i = 0; i < num; i++) {
            System.out.println("scores[" + i + "] : ");
            scores[i] = stdIn.nextInt(); // 점수 입력
        }

        reverse(scores);

        System.out.println("점수를 역순으로 정렬했습니다.");
        System.out.println("scores = " + Arrays.toString(scores));
    }
}

이 코드에서 swap 함수는 배열의 두 요소의 값을 교환합니다. reserve 함수는 배열의 요소를 역순으로 정렬하는 기능을 수행합니다. 사용자로부터 입력받은 점수의 개수에 따라 배열을 생성하고, 각 점수를 입력받은 후 reserve 함수를 호출하여 배열을 역순으로 정렬합니다. 마지막으로, 역순으로 정렬된 배열의 모든 요소를 출력합니다.

 

for each 문

for(타입 변수명 : 배열명) {
      ......
}

예제

public class Array12 {
   public static void main(String[] args) {
      int[] array = {1,2,3,4,5};

      for(int i : array){
         System.out.println(i);
      }
   }
}

Arrays 유틸리티

import java.util.Arrays;

제어자 및 타입 메서드 설명
static int binarySearch(*, int num) 배열에서 매개변수로 전달받은 값을 검색한 후 인덱스를 반환
static *[] copyOf(*[] original, int len) original 배열을 len 길이만큼 복사한 배열을 반환
static boolean
equals(*[] a, *[] a2) 매개변수로 전달받은 두 배열이 같은지 비교
static void
sort(*[] a) 배열 내용을 정렬
static String
toString(*[] a) 배열 내용을 문자열로 반환

2. 다차원 배열

2차원 배열은 배열의 배열로 생각할 수 있습니다. 즉, 각 요소가 또 다른 배열을 참조하는 구조입니다. 2차원 배열을 사용하면 행렬이나 데이터 테이블과 같은 구조를 효과적으로 표현할 수 있습니다.

 

2차원 배열 선언

2차원 배열을 선언하는 기본 문법은 다음과 같습니다.

타입[ ][ ] 배열이름 = new 타입 [ 행의 수 ][ 열의 수 ];

여기서 타입 은 배열에 저장하려는 데이터의 타입을 의미합니다. 2차원 배열을 선언할 때에는 각 차원의 크기를 지정해야 합니다. 예를 들어, new int [3][4] 는 정수형 값을 저장할 수 있는 3행 4열의 배열을 생성합니다. 이 때, 첫 번째 대괄호 안의 숫자는 행의 수를 두 번째 대괄호 안의 숫자는 열의 수를 나타냅니다.

예제) 다차원 배열 

public class TwoDimensionalArrayInitialization {
    public static void main(String[] args) {
// 3명의 학생과 각 학생의 4과목 점수를 초기화하면서 2차원 배열 선언
        int[][] scores = {
                {90, 80, 70, 60}, // 첫 번째 학생의 점수
                {80, 70, 60, 50}, // 두 번째 학생의 점수
                {70, 60, 50, 40} // 세 번째 학생의 점수
        };
// 배열의 내용 출력
        for (int i = 0; i < scores.length; i++) {
            System.out.println((i + 1) + "번째 학생의 과목 점수:");
            for (int j = 0; j < scores[i].length; j++) {
                System.out.println(scores[i][j]);
            }
            System.out.println();
        }
    }
} 

이 예제는 학생들의 과목별 점수를 2차원 배열로 선언하고 초기화하는 코드입니다. 여기서는 3명의 학생과 각 학생의 4과목 점수를 저장합니다. 이 예제에서 보는 것처럼, 2차원 배열을 선언하면서 동시에 초기화할 때는 다음과 같은 형식을 사용합니다.

타입[ ][ ] 배열이름 = {
      { 값1, 값2,  ... },
      { 값A, 값B,  ... },
      ...
};

 

이 구조를 사용하면, 배열이 선언될 때 각 행에 해당하는 배열이 동시에 초기화됩니다. 각 행의 배열은 중괄호 {} 로 둘러싸여 있으며, 행과 행 사이는 쉼표 , 로 구분됩니다. 이 방법을 사용하면 각 행의 열 수가 다를 수 있으며, 이를 통해 비정형(또는 불규칙) 2차원 배열도 쉽게 생성할 수 있습니다.

 

명령 행 아규먼트(Command-Line Arguments)

  • 자바에서 많이 사용된 배열이 무엇인지 물어본다면 그것은 바로 main메소드에 있는 String[] args
  • main메소드는 JVM이 실행하는 메소드이다.
  • JVM이 main메소드를 실행할 때 String[]을 아규먼트로 넘겨 준다는 것을 의미한다.

예제1

public class EmptyCommandLineArgumentExam {
   public static void main(String[] args){
      System.out.println(args.length);
   }
}

예제2

public class CommandLineArgumentExam {
   public static void main(String[] args){
      if(args.length == 0){
         System.out.println("사용법 : CommandLineArgumentExam 값 값 ....");
         System.exit(0); // return; 으로 변겯 가능
      }
      for(String arg : args){
         System.out.println(arg);
      }
   }
}

제한 없는 아규먼트(unlimited arguments)

  • 경우에 따라서 메소드 아규먼트를 가변적으로 전달하고 싶은 경우가 있다.
  • 메소드에 정수값을 경우에 따럿 3개, 어떤 경우엔 5개를 넘기고 싶다면 어떻게 해야 할까?
리턴타입 메소드이름(타입... 변수명){
   ......
}

예제

public class UnlimitiedArgumentsExam {
   public static void main(String[] args){
      System.out.println(sum(5,10));
      System.out.println(sum(1,2,4,2));
      System.out.println(sum(3,1,2,3,4,1));
   }
   public static int sum(int... args){
      System.out.println("print1 메소드 - args 길이 : " + args.length);
      int sum = 0;
      for(int i = 0; i < args.length; i++){
          sum += args[i];
      }
      return sum;
   }
}

'개념정리(JAVA)' 카테고리의 다른 글

검색 알고리즘  (0) 2024.03.27
클래스  (0) 2024.03.27
선형 검색과 보초법  (0) 2024.03.21
제어문  (0) 2024.03.13
논리형 타입과 연산자  (0) 2024.03.13