Java 배열 초기화 설명: 초보자와 중급 개발자를 위한 완전 가이드

1. 소개

배열은 동일한 타입의 여러 값을 함께 관리하고자 할 때 Java 프로그래밍에서 필수적인 자료구조입니다. 예를 들어, 10개의 서로 다른 점수를 개별 변수로 관리하거나 대량의 데이터를 개별 변수로 다루는 것은 비현실적입니다. 바로 이런 경우에 배열이 사용됩니다.

이 글은 Java에서 배열을 초기화하는 방법에 대해 명확하고 초보자 친화적으로 설명합니다. “배열이란 무엇인가?” 혹은 “배열을 어떻게 초기화하나요?” 라는 궁금증이 있다면, 이 가이드는 기본부터 고급 기술까지 모두 다룹니다. 끝까지 꼭 읽어보세요.

이 글을 읽음으로써 다음과 같은 혜택을 얻을 수 있습니다:

  • 배열 선언 및 초기화 전체 과정을 이해한다
  • 일반적인 실수와 흔히 발생하는 초기화 오류를 피한다
  • 실제 개발에 유용한 실용적인 코드 예제를 학습한다

이 내용은 프로그래밍 초보자뿐만 아니라 Java 기본기를 복습하고자 하는 사람들에게도 적합합니다.
이제 Java에서 배열의 기본을 배워봅시다.

2. Java에서 배열 기본

배열 선언 방법 및 기본 문법

Java에서 배열을 사용하려면 첫 번째 단계는 배열을 선언하는 것입니다. 선언은 프로그램에 “이 변수는 여러 값을 저장하는 배열로 사용될 것이다” 라는 것을 알려줍니다. 배열을 선언하는 방법은 여러 가지가 있지만, 가장 일반적인 두 가지는 다음과 같습니다:

int[] numbers;       // Recommended style
int numbers[];       // C-style syntax

Java에서 권장되는 스타일은 int[] numbers;와 같이 타입 이름 뒤에 []를 붙이는 것입니다. 이 표기법은 “int 배열”임을 명확히 나타냅니다.

배열 크기와 초기화의 중요성

배열은 선언 직후 바로 사용할 수 없습니다. 실제로 사용하려면 배열이 몇 개의 요소(또는 “슬롯”)를 가질지 지정하여 초기화해야 합니다.
초기화는 지정된 개수만큼 메모리를 할당하고 배열을 사용할 수 있게 합니다.

예를 들어, 다섯 개의 정수 배열을 초기화하려면:

int[] scores = new int[5];

이 코드는 scores[0]부터 scores[4]까지 접근 가능한 연속적인 5개의 정수 요소를 할당합니다.
Java에서는 배열의 크기를 초기화 시에 지정해야 하며 이후에 변경할 수 없습니다. 이는 초보자에게 흔히 발생하는 오류의 원인입니다.

배열 타입과 기본값

배열의 타입은 각 요소의 타입을 결정합니다. 예를 들어 int[]는 정수 배열이고, String[]는 문자열 배열입니다.
Java에서 배열을 초기화하면 각 요소는 타입에 따라 자동으로 기본값을 갖게 됩니다:

기본값 예시:

  • int → 0
  • double → 0.0
  • boolean → false
  • 참조 타입(예: String) → null

따라서 Java에서 배열은 “선언”과 “초기화” 두 단계가 필요하며, 이 두 단계는 프로그래밍 초기에 반드시 이해해야 하는 중요한 개념입니다.

3. 배열 초기화 방법

Java는 배열을 초기화하는 여러 방법을 제공합니다. 최적의 방법은 프로그램의 요구에 따라 달라지므로 각 접근 방식이 어떻게 동작하는지 아는 것이 중요합니다.

3.1 선언 시 배열 초기화

가장 간단하고 직관적인 방법은 배열을 선언할 때 초기값을 직접 제공하는 것입니다. 값이 고정되어 미리 알려져 있을 때 특히 유용합니다.

int[] numbers = {1, 2, 3, 4, 5};
String[] fruits = {"apple", "banana", "orange"};

new 키워드나 크기 지정이 필요 없습니다. Java는 제공된 요소 개수만큼 자동으로 배열을 생성합니다.

3.2 new 키워드를 사용한 초기화

다음으로 흔히 쓰이는 방법은 new 키워드를 사용해 배열 크기를 지정하는 것입니다.

int[] scores = new int[5];  // Five integers (default value: 0)
String[] names = new String[3]; // Three Strings (default value: null)

이 초기화 방식에서는 모든 요소가 자동으로 기본값을 할당받습니다.

  • 숫자형: 0 또는 0.0
  • boolean: false
  • 참조형: null

이 방법은 배열 크기는 미리 알고 있지만 값은 나중에 할당될 경우에 이상적입니다.

3.3 Arrays.fill() 으로 배열 초기화

모든 배열 요소를 같은 값으로 초기화하고 싶다면 Arrays.fill() 메서드가 매우 유용합니다.
예를 들어, 배열을 값 7로 채우려면 다음과 같이 합니다:

import java.util.Arrays;

int[] data = new int[5];
Arrays.fill(data, 7);  // All elements become 7

이 방법은 루프를 돌면서 같은 값을 수동으로 할당하는 것보다 더 효율적입니다.

3.4 루프를 사용한 배열 초기화

각 배열 요소에 다른 값을 할당하거나 일정한 패턴을 따르는 경우, for 루프를 사용하는 것이 표준적인 접근 방식입니다.

int[] squares = new int[5];
for (int i = 0; i < squares.length; i++) {
    squares[i] = i * i;  // 0, 1, 4, 9, 16
}

향상된 for‑loop( for‑each )는 값을 읽는 데는 적합하지만 인덱스로 값을 할당하는 데는 사용할 수 없다는 점에 유의하세요.

보시다시피, Java는 여러 초기화 기법을 제공하므로 상황에 가장 적합한 방법을 선택하면 됩니다.

4. 배열 초기화에 관한 중요한 주의사항

배열을 다룰 때는 초기화 방법뿐만 아니라 자주 발생하는 함정과 일반적인 실수도 이해하는 것이 중요합니다. 이를 알면 버그와 예기치 않은 동작을 예방할 수 있습니다.

초기화되지 않은 배열 사용으로 인한 오류

배열은 올바르게 초기화된 후에만 사용할 수 있습니다. 선언만 하고 초기화하지 않은 배열을 사용하려 하면 NullPointerException이 발생합니다.

int[] numbers;
System.out.println(numbers[0]); // Error: numbers is not initialized

이 실수를 피하려면 “선언”과 “초기화”를 반드시 동시에 수행해야 함을 기억하세요.

ArrayIndexOutOfBoundsException 방지

배열의 유효 범위를 벗어난 인덱스에 접근하려 하면 Java는 ArrayIndexOutOfBoundsException을 발생시킵니다.
배열 인덱스는 항상 0부터 시작해 배열 길이 – 1까지입니다.

int[] data = new int[3];
data[3] = 10; // Error: index 3 does not exist (valid: 0, 1, 2)

배열을 순회할 때는 항상 arrayName.length를 사용해 안전하게 접근하도록 하세요.

for (int i = 0; i < data.length; i++) {
    // Safe access
}

초기화 리스트({}) 사용의 제한

초기화 리스트 {}선언 시점에만 사용할 수 있습니다.
이미 선언된 배열에 대해서는 사용할 수 없습니다:

int[] numbers;
numbers = {1, 2, 3}; // Error: initializer list cannot be used here

대신 new 키워드와 함께 사용해야 합니다:

numbers = new int[]{1, 2, 3}; // Correct usage

배열 크기는 변경할 수 없음

한 번 초기화된 Java 배열의 크기는 변경할 수 없습니다.
요소 개수를 늘리려면 새 배열을 만들고 기존 값을 복사해야 합니다.

이러한 제한 사항을 이해하면 흔히 발생하는 배열 관련 오류를 예방할 수 있습니다.

5. 고급 주제: 다차원 배열 초기화

Java에서 배열은 1차원뿐 아니라 다차원도 가능합니다. 2차원 배열은 행렬이나 표 형태의 데이터를 다룰 때 특히 유용합니다. 여기서는 주로 2차원 배열을 중심으로 다차원 배열 초기화 방법을 설명합니다.

2차원 배열 선언 및 초기화

2차원 배열은 본질적으로 “배열의 배열”입니다. 선언 시점에 초기화하거나 new 키워드를 사용해 초기화할 수 있습니다.

선언 시 초기화

int[][] matrix = {
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9}
};

이 코드는 정수형 3×3 2차원 배열을 생성합니다.

new 키워드 사용 초기화

int[][] table = new int[2][3]; // Creates a 2×3 array

모든 요소는 기본값인 0으로 초기화됩니다.
나중에 값을 설정할 수도 있습니다:

table[0][0] = 10;
table[0][1] = 20;
table[1][2] = 30;

비정형(불규칙) 배열 생성

(이후 내용은 원문에 이어서 작성하십시오.)

Java는 각 행이 서로 다른 열 수를 가질 수 있는 “지그재그 배열”(jagged arrays)을 허용합니다.

int[][] jagged = new int[3][];
jagged[0] = new int[2]; // Row 1 has 2 columns
jagged[1] = new int[4]; // Row 2 has 4 columns
jagged[2] = new int[1]; // Row 3 has 1 column

다차원 배열 초기화에 대한 참고 사항

  • 2차원 배열은 요소 타입에 따라 기본값을 받습니다 (예: int → 0, String → null).
  • new int[rows][columns] 를 사용할 때는 첫 번째 차원(행)을 지정해야 합니다.
  • 초기화되지 않은 행을 사용하면 NullPointerException이 발생합니다.

Java는 필요에 따라 다차원 배열을 초기화하는 다양한 유연성을 제공합니다.

6. 요약

우리는 Java에서 배열을 초기화하는 기본부터 고급 기술까지 모두 다루었습니다. 핵심 포인트를 정리해 보겠습니다.

배열 초기화의 핵심 포인트

  • 사용하기 전에 항상 배열을 선언하고 초기화하세요
  • 초기화되지 않은 배열은 NullPointerException과 같은 오류를 일으킵니다.
  • 상황에 맞는 초기화 방법을 선택하세요
  • 값이 고정된 경우 초기화 리스트를 사용하고, 크기만 알려진 경우 new를 사용하며, 동일한 값을 설정할 때는 Arrays.fill()을, 고유한 값을 할당할 때는 루프를 사용합니다.
  • 인덱스 경계에 주의하세요
  • 배열 인덱스는 0부터 시작하며, 범위를 벗어난 접근은 예외를 발생시킵니다.
  • 다차원 배열도 1차원 배열과 동일한 기본 규칙을 따릅니다
  • 지그재그 배열은 행마다 다른 길이를 허용합니다.

초보자를 위한 조언 및 다음 단계

배열 초기화에 대한 이해는 Java 프로그래밍의 탄탄한 기초를 다지는 데 필수적입니다.
간단한 1차원 배열부터 시작하고, 익숙해지면 다차원 배열 및 배열 기반 로직으로 확장하세요.

또한 Java는 ArrayList와 같은 강력한 “동적 배열”을 제공합니다. 기본 배열을 마스터한 후에는 Java 컬렉션 프레임워크를 배우는 것이 자연스러운 다음 단계입니다.

다음 장에서는 배열 초기화에 대한 자주 묻는 질문(FAQ)을 요약합니다.
궁금한 점이 있으면 관련 Q&A를 반드시 검토하세요.

7. 자주 묻는 질문 (FAQ)

여기에서는 Java에서 배열 초기화와 관련된 일반적인 질문과 혼동되는 점들을 다룹니다.

Q1. 배열의 크기를 나중에 변경할 수 있나요?
A. 아니요. 한 번 초기화된 Java 배열의 크기는 변경할 수 없습니다. 다른 크기가 필요하면 새 배열을 만들고 값을 복사해야 합니다. 가변 크기 구조가 필요하면 ArrayList를 사용하는 것을 고려하세요.

Q2. 배열을 초기화하지 않고 사용하면 어떻게 되나요?
A. 선언만 하고 초기화하지 않은 배열을 사용하면 NullPointerException이 발생합니다. 사용하기 전에 반드시 new나 초기화 리스트로 초기화하세요.

Q3. Arrays.fill()과 for 루프의 차이점은 무엇인가요?
A. Arrays.fill()은 모든 요소를 동일한 값으로 설정하고, for 루프는 각 요소에 서로 다른 값을 할당할 수 있습니다.

Q4. 배열에 기본값은 어떻게 할당되나요?
A. new를 사용할 때 기본값이 자동으로 할당됩니다: int → 0, double → 0.0, boolean → false, 참조 타입 → null.

Q5. 2차원 배열의 행마다 다른 길이를 가질 수 있나요?
A. 네. Java는 각 행이 서로 다른 열 수를 갖는 지그재그 배열을 지원하지만, 각 행은 사용하기 전에 초기화되어야 합니다.

Q6. 배열을 복사하려면 어떻게 해야 하나요?
A. System.arraycopy() 또는 Arrays.copyOf()와 같은 메서드를 사용하세요. 루프를 이용한 수동 복사도 가능하지만, 내장 메서드가 더 간단하고 안전합니다.

Q7. 배열과 ArrayList의 차이점은 무엇인가요?
A. 배열은 고정된 크기와 단일 타입을 가지며, ArrayList는 동적 크기 조절을 지원하고 유연한 연산을 제공합니다.

이 FAQ가 Java 배열 초기화와 관련된 일반적인 질문을 해결하는 데 도움이 되길 바랍니다.