배열 (Array)

같은 타입의 변수들로 이루어진 유한 집합으로, 배열을 구성하는 각가의 값을 배열 요소(element)라고 하며, 배열에서 위치를 가리키는 숫자를 인덱스(index)라 한다.

같은 타입의 변수들로 이루어진 유한 집합이라는 말은, 배열이 선형 자료구조중 하나로 동일한 타입의 연관된 데이터를 메모리에 연속적으로 저장하여 하나의 변수에 묶어서 관리하기 위해 만들어진 자료 구조라는 의미이다.

자바에서 인덱스는 0부터 시작하며, 0을 포함한 양의 정수만을 가질 수 있다.

배열은 같은 종류의 데이터를 많이 다뤄야 하는 경우에 사용하는 가장 기본적인 자료구조로 선언되는 형식에 따라 1차원 배열, 2차원 배열뿐만 아니라 그 이상의 다차원 배열로도 선언할 수 있다.

배열의 길이는 최초 선언한 값으로 고정되며 인덱스를 통해 데이터에 접근할 수 있다.

1차원 배열

  • 배열 선언

      // 1. 타입[] 배열이름; , 자바에서는 주로 이 형식으로 사용함.
      int[] number;
      // 2. 타입 배열이름[];
      int number[];
    

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

  • 실제 배열 생성

      // 배열이름 = new 타입[배열길이];
      number = new int[3];
      // 타입[] 배열이름 = new 타입[배열길이]; , (선언과 생성 동시에)
      int[] number = new int[3];
    

    연산자 new 에 의해 메모리 빈 공간에 3개의 int형 데이터를 저장할 수 있는 공간이 마련된다. 배열의 각 요소는 자동으로 int형의 기본값인 0으로 초기화된다.

  • 배열의 초기화
    • 자바에서는 변수와 마찬가지로 배열도 선언과 동시에 초기화 할 수 있다. 초기화 하지 않는다면 초기값이 자동으로 세팅된다.
    • {} 초기화 블록 (initialization block) 을 이용하여 초기화 할 수 있다.
      // 1. 타입[] 배열이름 = {배열요소, 배열요소2, ...};
      int[] number = {1, 2, 3};
      // 2. 타입[] 배열이름 =  new 타입[] {배열요소, 배열요소2, ...};
      int number = new int[] {4, 5, 6};
    

    첫번째 방법과 두 번째 방법 모두 동일한 결과를 반환하지만 다음과 같은 경우는 무조건 두 번째 방법만을 사용하여 초기화 해야 한다.

    1. 배열의 선언과 초기화를 따로 진행해야 하는 경우
    2. 메소드의 인수로 배열을 전달하면서 초기화해야 하는 경우
    • 배열 타입 및 초기값

      타입 초기값
      char ‘\u0000’
      byte, short, int 0
      long OL
      float 0.0F
      double 0.0 또는 0.0D
      boolean false
      배열, 인스턴스 등 null
  • 배열의 요소 (element)
    • 생성된 배열의 각 저장공간으로,
    • 배열이름[인덱스] 형식으로 배열의 요소에 접근할 수 있다.
  • 배열의 인덱스 (index)
    • 배열의 요소마다 붙여진 일련번호로,
    • 0부터 시작
    • 범위 : 0 ~ 배열길이 -1
    • 인덱스는 상수, 변수, 수식 모두 가능하다.
    • index 범위를 벗어난 값을 사용하면 IndexOutOfBoundsException이 발생한다.
  • 배열의 길이
    • 배열의 요소 개수로, 값을 저장할 수 있는 공간의 개수이다.
    • 양의정수 (0포함)이어야 하며, 최대값은 각 타입의 최대값이다. (int : 약 20억)
    • 길이가 0인 배열도 생성이 가능하다.
    • 배열이름.length 로 배열의 길이를 가져올 수 있다.
      • 배열이름.length = 10; 이런식으로 배열 길이 변경은 불가능하다.
      • 더 큰 배열을 새로 생성하거나 기존 배열의 내용을 새로운 배열에 복사해야 한다.

배열의 출력

  • for문
  • Array.toString(배열이름)

배열의 복사

  • for문
    • 배열의 요소 하나하나에 접근하여 복사 하기에 비효율적이다.
  • System.arraycopy()
    • 지정된 범위의 값들을 한 번에 통째로 복사하여 효율적이다.
  • Arrays.copyOf()
  • Object.clone()
int[] arr1 = new int[]{1, 2, 3, 4, 5};
int newLen = 10;

// 1. System 클래스의 arraycopy() 메소드
int[] arr2 = new int[newLen];
System.arraycopy(arr1, 0, arr2, 0, arr1.length);

// 2. Arrays 클래스의 copyOf() 메소드
int[] arr3 = Arrays.copyOf(arr1, 10);

// 3. Object 클래스의 clone() 메소드
int[] arr4 = (int[])arr1.clone();

// 4. for 문과 인덱스를 이용한 복사
int[] arr5 = new int[newLen];

Arrays 클래스

java.util.Arrays 클래스에는 배열을 다루기 위한 다양한 메소드가 포함되어 있다. 이 클래스의 모든 메소드는 클래스 메소드이므로, 객체를 생성하지 않고도 바로 사용할 수 있다.

java.util 패키지에 포함되므로 반드시 import문으로 java.util 패키지를 불러오고 나서 사용해야 한다.

binarySearch(Object[] a, Object key)

전달받은 배열에서 특정 객체의 위치를 이진 검색 알고리즘을 사용하여 검색한 후 해당 위치를 반환한다.

이 메소드는 이진 검색 알고리즘을 사용하므로, 매개변수로 전달되는 배열이 sort() 메소드등을 사용하여 미리 정렬되어 있어야만 제대로 동작한다.

int[] arr = new int[1000];

for(int i = 0; i < arr.length; i++) {
    arr[i] = i;
}

System.out.println(Arrays.binarySearch(arr, 500));
500

copyOf(T[] original, int newLength)

전달받은 배열의 특정 길이만큼을 새로운 배열로 복사하여 반환한다.

첫 번째 매개변수로 원본 배열을 전달받고, 두 번째 매개변수로 원본 배열에서 새로운 배열로 복사할 요소의 개수를 전달받는다.

그리고 원본 배열과 같은 타입의 복사된 새로운 배열을 반환한다.

이대 새로운 배열의 길이가 원본 배열보다 길면, 나머지 요소는 배열 요소의 타입에 맞게 기본값으로 채워진다.

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

int[] arr2 = Arrays.copyOf(arr1, 3);

for (int i = 0; i < arr2.length; i++) {
    System.out.print(arr2[i] + " ");
}

int[] arr3 = Arrays.copyOf(arr1, 10);

for (int i = 0; i < arr3.length; i++) {
    System.out.print(arr3[i] + " ");
}
1 2 3
1 2 3 4 5 0 0 0 0 0 

copyOfRange(T[] original, int from, int to)

전달받은 배열의 특정 범위에 해당하는 요소만을 새로운 배열로 복사하여 반환한다.

첫 번째 매개변수로 복사의 대상이 될 원본 배열을 받고,

두 번째 매개변수로는 원본 배열에서 복사할 시작 인덱스를 전달받고,

세 번째 매개변수로는 마지막으로 복사될 배열 요소의 바로 다음 인덱스를 전달받는다.

그리고 원본 배열과 같은 타입의 복사된 새로운 배열을 반환한다.

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

int[] arr2 = Arrays.copyOfRange(arr1, 2, 4);

for (int i = 0; i < arr2.length; i++) {
    System.out.print(arr2[i] + " ");
}
3 4 

fill(Object[] a, Object val)

전달받은 배열의 모든 요소를 특정 값으로 초기화 해준다.

첫 번째 매개변수로 초기화할 배열을 전달받고, 두 번째 매개변수로 초기값을 전달받는다.

이 메소드는 전달받은 원본 배열의 값을 변경한다.

int[] arr = new int[5];

Arrays.fill(arr, 7);
for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i] + " ");
}
7 7 7 7 7 

sort(Object[] a)

전달받은 배열의 모든 요소를 오름차순으로 정렬한다.

매개변수로 정렬할 배열을 전달받으며, 이 메소드는 전달받은 원본 배열의 순서를 변경한다.

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

Arrays.sort(arr);

for (int i = 0; i < arr.length; i++) {
    System.out.print(arr[i] + " ");
}
1 2 3 4 5

asList(T …a)

전달받은 배열을 고정 크기의 리스트로 변환하여 반환한다.

List<String> asList = Arrays.asList("a", "b", "c");
System.out.println(asList);
[a, b, c]

Arrays.asList() vs List.of()

  Array.asList List.of
삽입 (add) 불가능 불가능
삭제 (remove) 불가능 불가능
변경 (set, replace) 가능 불가능
Null 허용여부 허용 허용 x