1. 소개
배열은 같은 타입의 여러 값을 함께 관리하고자 할 때 Java 프로그래밍에서 필수적인 자료구조입니다. 예를 들어, 10개의 서로 다른 점수를 개별 변수로 관리하거나 방대한 데이터를 각각의 변수에 저장하는 것은 비현실적입니다. 바로 이런 경우에 배열이 사용됩니다.
이 글에서는 Java에서 배열을 초기화하는 방법을 명확하고 초보자 친화적으로 설명합니다. “배열이란 무엇인가?” 혹은 “배열을 어떻게 초기화하나요?” 라는 궁금증이 있다면, 기본부터 고급 기법까지 모두 다룹니다. 끝까지 꼭 읽어보세요.
이 글을 읽고 얻을 수 있는 혜택은 다음과 같습니다:
- 배열 선언 및 초기화 전체 과정을 이해
- 흔히 저지르는 실수와 전형적인 초기화 오류 방지
- 실제 개발에 유용한 실용적인 코드 예제 학습
이 내용은 프로그래밍 초보자뿐만 아니라 Java 기본기를 복습하고 싶은 분들에게도 적합합니다.
그럼 이제 Java 배열의 기본부터 배워봅시다.
2. Java에서의 배열 기초
배열 선언 방법 및 기본 문법
Java에서 배열을 사용하려면 먼저 배열을 선언해야 합니다. 선언은 프로그램에 “이 변수는 여러 값을 저장하는 배열로 사용할 것이다” 라는 뜻을 알려줍니다. 배열을 선언하는 방법은 여러 가지가 있지만, 가장 흔한 두 가지는 다음과 같습니다:
int[] numbers; // Recommended style
int numbers[]; // C-style syntax
Java에서 권장되는 스타일은 int[] numbers; 와 같이 타입 이름 뒤에 [] 를 붙이는 방식입니다. 이 표기법은 “int형 배열”이라는 의미를 명확히 나타냅니다.
배열 크기와 초기화의 중요성
배열은 선언만으로는 바로 사용할 수 없습니다. 실제로 사용하려면 배열이 몇 개의 요소(또는 “슬롯”)를 가질지 지정하여 초기화해야 합니다.
초기화는 지정된 개수만큼 메모리를 할당하고 배열을 사용할 수 있게 합니다.
예를 들어, 정수 5개를 저장할 배열을 초기화하려면 다음과 같이 합니다:
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에서 배열 초기화와 관련된 일반적인 질문을 해결하는 데 도움이 되길 바랍니다.

