ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA - 배열 (array)
    프로그래밍/JAVA 2021. 12. 22. 22:01

    배열이란?

    같은 타입의 여러 변수를 하나의 묶음으로 다루는 것, 서로 다른 타입의 변수들로 구성된 배열은 만들 수 없다.

     

    배열의 선언과 생성

    타입[] 변수이름;	// 배열을 선언(배열을 다루기 위한 참조변수 선언)
    변수이름 = new 타입[길이];	// 배열을 생성(실제 저장공간을 생성)

     

    배열을 선언하는 것은 생성된 배열을 다루기 위한  참조변수를 위한 공간이 만들어질 뿐이다. 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어진다.

     

    int[] score = new int[5];

    int형 배열

    배열의 인덱스

    생성된 배열의 각 저장공간을 '배열의 요소(element)'라고 한다. 각 요소에 접근하는 방법은 '배열이름[인덱스]'의 형식으로 접근할 수 있다. 배열의 인덱스는 배열의 요소마다 붙여진 일련번호로 각 요소를 구별하는데 사용된다.

    // 인덱스(index)의 범위는 0부터 '배열길이 -1까지."
    
    int[] score = new int[5]; 	// 길이가 5인 int 배열 생성
    
    score[0] = 0;	// 배열이름[인덱스] 형식으로 배열의 요소에 접근
    score[1] = 10;
    score[2] = 20;
    score[3] = 30;
    score[4] = 40;

     

    ArrayIndexOutOfBoundsException

    index의 범위를 벗어난 값을 index로 사용하지 않도록 주의해야 한다. 유효한 범위를 벗어난 값을 index로 사용할 경우 컴파일러는 이러한 실수를 걸러주지 못하기 때문에 ArrayIndexOutOfBoundsException 에러가 발생한다.

    int[] score = new int[5]; // 길이가 5인 int배열, index 범위 : 0~4
    
    score[5] = 100; // index의 범위를 벗어는 값을 index로 사용. 에러 발생

     

    배열의 길이

    배열의 길이는 int범위의 양의 정수(0도 포함)이어야 한다. 배열의 길이는 배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수이다. 배열의 길이는 양의 정수이어야 하며 최대값은 int타입의 최대값, 약 20억이다. 배열 길이가 0일 수도 있다. 

    배열이름.length

    자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며, '배열이름.length'를 통해서 정보를 얻을 수 있다.

     

    배열의 출력

    for문을 통해 배열에 저장된 값을 확인할 수 있으며, 'Arrays.toString(배열이름)'메서드를 사용해서 출력할 수도 있다. 생성된 배열을 참조한 변수의 이름을 바로 출력한다면 변수에 저장된 '배열의 주소'값이 출력된다.

     

    배열의 복사

    배열에 저장할 공간이 부족한 경우에는 어떻게 해야 할까?

     

    배열은 한번 생성하면 그 길이를 변경할 수 없기 때문에 더 많은 저장공간이 필요하다면 보다 큰 배열을 새로 만들어야 한다.

     

    배열의 길이를 변경하는 방법:

    1. 더 큰 배열을 새로 생성한다.

    2. 기존 배열의 내용을 새로운 배열에 복사한다.

     

    - for문 사용

     int[] arr = new int[5];
     ...
     // 새로운 배열 생성 ( 기존 arr의 길이 2배)
     int[] tmp = new int[arr.length * 2];
    
     // 배열 arr에 저장된 값들을 배열 tmp에 복사한다.
     for (int i = 0; i < arr.length; i++) {
         tmp[i] = arr[i];
     }
    
     // 변수 tem에 있는 저장된 값을 arr에 저장한다.
     arr = tmp;

    - System.arraycopy()를 이용한 배열의 복사

    char[] abc = {'A', 'B', 'C', 'D'};
    char[] num = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    
    // char 배열은 for문을 쓰지 않아도 값이 붙여서 출력된다.
    System.out.println(abc);
    System.out.println(num);
    
    // 배열 abc와 num을 붙여서 하나의 배열 (result)로 만든다.
    char[] result = new char[abc.length + num.length];
    System.arraycopy(abc, 0, result, 0, abc.length);
    System.arraycopy(num, 0, result, abc.length, num.length);
    System.out.println(result);

    실행결과

    ABCD
    0123456789
    ABCD0123456789

     

    for문은 배열의 요소 하나하나에 접근해서 복사하지만, arraycopy()는 지정된 범위의 값들을 한 번에 통째로 복사한다. 각 요소들이 연속적으로 저장되어 있어서 가능. 배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다.

    댓글

Designed by Tistory.