[Java] 기초 - 배열

이지연·2025년 12월 11일

개요

아래의 내용은 java_grammer 레파지토리 C01Basic 디렉터리에 저장되어있는 내용을 정리하였다.


배열 기본 문법과 특징

자바 배열은 같은 타입의 여러 값을 연속된 공간에 저장 하는 자료구조이며, 길이가 고정 이라는 특징이 있음.

기본적인 선언 방식은 세 가지가 있음

// (1) 길이만 먼저 지정
int[] arr1 = new int[5]; // 기본값으로 0으로 초기화

// (2) 리터럴 방식
int[] arr2 = {10, 20, 30, 40, 50};

// (3) 명시적 배열 생성 방식
int[] arr3 = new int[]{10, 20, 30, 40, 50};

특징을 정리하면 아래와 같음.

  • 한 번 생성하면 길이를 바꿀 수 없음 (동적 크기가 필요하면 ArrayList 같은 컬렉션 사용)
  • 인덱스는 0부터 시작해서 length - 1 까지만 유효
  • 범위를 벗어난 인덱스를 접근하면 ArrayIndexOutOfBoundsException 발생
  • 생성 시 타입에 따라 기본값으로 자동 초기화됨
    • 숫자형: 0, 실수형: 0.0, boolean: false, 참조형: null 등

배열을 다른 메서드의 인자로 넘길 때는 new int[]{...} 형태로 명시적으로 새 배열 객체를 만들어 넘길 수 있음.

List<int[]> myList = new ArrayList<>();
myList.add(new int[5]);
myList.add(new int[]{10, 20, 30, 40, 50});

이처럼 배열은 고정 길이 + 동일 타입 이라는 제약이 있지만, 반복 처리, 합계/평균, 최대·최소값 탐색 등 기본 알고리즘 구현에 가장 많이 사용되는 기본 자료구조임.


배열 선언과 초기화

int[] arr1 = new int[5];
arr1[0] = 10;
arr1[1] = 20;
arr1[3] = 40;
arr1[4] = 50;

배열은 선언 시 기본값으로 초기화됨.

  • int → 0
  • boolean → false
  • 참조형 → null

다른 초기화 방식도 가능함.

int[] arr2 = {10, 20, 30, 40, 50};
int[] arr3 = new int[]{10, 20, 30, 40, 50};

리터럴 방식과 명시적 방식이 있음. 리터럴 방식은 선언 시, 명시적 방식은 다른 메서드 인자로 전달할 때 주로 씀.


배열 정렬

Arrays.sort() 메서드를 사용하면 배열을 쉽게 정렬할 수 있음.
기본은 오름차순이며, Comparator.reverseOrder()로 내림차순 정렬 가능.

String[] stArr = {"abc", "aaa", "acd", "add"};
Arrays.sort(stArr);
Arrays.sort(stArr, Comparator.reverseOrder());

직접 선택정렬 구현 예제

선택정렬은 성능이 좋은 편은 아니지만, 알고리즘 이해에 도움이 됨.

int[] sortArr = {17, 12, 20, 10, 15};
for (int i = 0; i < sortArr.length; i++) {
    int minIdx = i;
    for (int j = i + 1; j < sortArr.length; j++) {
        if (sortArr[minIdx] > sortArr[j]) {
            minIdx = j;
        }
    }
    int temp = sortArr[i];
    sortArr[i] = sortArr[minIdx];
    sortArr[minIdx] = temp;
}

정렬 알고리즘 복잡도

  • 선택정렬 : O(n^2)
  • 자바 기본 내장정렬 : O(n log n)

데이터가 많아질수록 내장 정렬 함수의 효율성이 훨씬 높다.


배열 검색

배열에서 원하는 값을 찾는 방법으로는 두 가지가 있다.

모든 값을 순차적으로 돌며 검사한다. 복잡도는 O(n).

int[] findArr = {1, 3, 6, 8, 9, 11, 15};
int target = 11;
int targetIdx = -1;
for (int i = 0; i < findArr.length; i++) {
    if (findArr[i] == target) {
        targetIdx = i;
        break;
    }
}

정렬된 배열에서만 사용 가능하며, 데이터를 절반씩 나눠가며 찾는다. 복잡도는 O(log n).

int targetIdx2 = Arrays.binarySearch(findArr, 11);

값이 없을 때는 음수값을 반환한다.


배열 값 비교

== 연산자는 참조 비교, Arrays.equals()는 값 비교를 수행한다.

int[] arr1 = {10, 20, 30};
int[] arr2 = {10, 20, 30};
System.out.println(arr1 == arr2); // false
System.out.println(Arrays.equals(arr1, arr2)); // true

배열 복사

배열을 복사할 때는 Arrays.copyOf() 또는 Arrays.copyOfRange()를 사용한다.

int[] arr = {1, 4, 6, 7, 8};
int[] copy1 = Arrays.copyOf(arr, 4);
int[] copy2 = Arrays.copyOfRange(arr, 2, 5);

배열 채우기

Arrays.fill()을 사용하면 배열을 특정 값으로 한 번에 채울 수 있다.

String[] fillArr = new String[5];
Arrays.fill(fillArr, "");

2차원 배열

2차원 배열은 배열 안에 배열이 들어 있는 구조다.

int[][] multiArr = new int[3][4];
int num = 1;
for (int i = 0; i < multiArr.length; i++) {
    for (int j = 0; j < multiArr[i].length; j++) {
        multiArr[i][j] = num++;
    }
}

출력 시 Arrays.deepToString()을 사용해야 내부 값이 보인다.


가변 배열

Java에서는 2차원 배열의 각 행 길이가 다를 수 있다. 이를 가변 배열이라 한다.

int[][] jaggedArr = new int[3][];
jaggedArr[0] = new int[2];
jaggedArr[1] = new int[3];
jaggedArr[2] = new int[4];
System.out.println(Arrays.deepToString(jaggedArr));
profile
Eazy하게

1개의 댓글

comment-user-thumbnail
2025년 12월 11일

Fill arr?
아르르르르르륵 ㅋㅋ 콱 ㅋㅋ!!

답글 달기