개요
이번 글에서는 예제를 통해 자바가 배열을 생성하는 원리를 자세히 알아봅니다.
자바에서 배열은 데이터의 집합을 다루는 데 매우 유용하며, 올바르게 초기화하고 사용하는 방법을 이해하면 코드의 가독성과 안정성을 높일 수 있습니다.
또한 알고리즘 풀이에 아주 유용하게 쓰일수 있습니다.
// CASE1
int[] arr;
arr = {1, 21, 312, 3, 123, 1};
// CASE2
int[] arr = new int[6]{1, 21, 312, 3, 123, 1};
위의 코드는 오류가 날까요?
배열 선언과 초기화
자바에서 배열은 일반적으로 아래 두 단계를 통해 생성해서 씁니다.
- 배열 선언: 배열의 데이터 타입과 이름을 지정합니다.
- 배열 생성: 메모리를 할당하고 배열 요소를 초기화합니다.
int[] arr; // 배열 선언
arr = new int[5]; // 배열 생성
배열 초기화 블록과 배열 생성 구문
자바 언어 사양(JLS) 10.6에 따르면
배열 초기화 블록 { ... }는 배열 변수를 초기화하는 문법으로만 사용되며, 다음 두 경우에만 허용됩니다
- 선언과 동시에 초기화
int[] arr = {1, 2, 3};
- new 키워드와 함께 배열 초기화
int[] arr = new int[]{1, 2, 3};
배열 크기와 초기값 동시 명시 불가
크기와 초기값을 동시에 명시하면 컴파일 오류 발생:
int[] arr = new int[5]{1, 2, 3, 4, 5}; // 컴파일 오류
올바른 방법:
int[] arr = new int[]{1, 2, 3, 4, 5};
오류가 발생하는 이유
자바에서 배열 초기화는 컴파일 시점과 런타임 시점 모두 관여하는 부분이 있습니다. 이를 유의해서 팔로우를 해보겠습니다.
[컴파일 이 끝나야지 런(실행) 타임이 진행된다]
먼저 컴파일러의 특성을 확인해보면 배열의 크기나 초기값이 명확히 주어졌을 때 이를 컴파일 시점에 검증하거나 필요한 코드를 생성합니다.
아래의 배열 선언식이 생성되는 흐름을 살펴본다면
컴파일 시점에는
int[] arr = {1, 2, 3};
위의 코드가
컴파일러에 의해 암묵적으로 아래와 같은 형태로 반환됩니다.
int[] arr = new int[]{1, 2, 3};
다음으로 런타임 시점에서는 배열의 메모리 할당과 초기화가 이루어집니다. 자바는 배열을 동적으로 생성하며, 이 과정에서 배열 초기화 표현식(하단에 기술,, )
하단의 코드의 경우에는 런타임 시점에 생성됩니다.
int n = 5;
int[] arr = new int[n];
or
int[] arr = new int[5];
이유는 뭘까요??
런타임에는 메모리 할당이 이루어지고 변수 n 의 할당 또한 런타임에 이루어집니다.
- 배열 크기가 변수 n에 의해 결정됩니다.
- n의 값은 런타임에만 알 수 있으므로, 배열 생성과 초기화는 런타임에 이루어집니다.
따라서
int n = 5;
int[] arr = new int[n] {1,2,3,4,5};
자바에서 배열 초기화 시 new int[n] 형태와 {1, 2, 3, 4, 5} 형태를 동시에 사용할 수 없기 때문이기도 하고, 컴파일, 런타임 시의 할당 이념에도 맞지 않습니다.
*자바 배열 초기화의 설계 원리
배열 생성 표현식(Array Creation Expressions)
배열 생성 표현식은 새로운 배열 객체를 생성하는 데 사용됩니다.
배열은 기본 타입(Primitive Type)이나 클래스/인터페이스 타입(Class or Interface Type)을 요소로 가질 수 있습니다.
배열 생성 표현식의 문법
배열 생성 표현식은 아래와 같은 형태를 가집니다
- DimExprs: 배열의 크기를 지정하는 표현식.
- Dims: 배열의 차원을 나타내며, 크기를 명시하지 않는 빈 대괄호([ ])로 표현.
- ArrayInitializer: 배열 초기화 블록 { ... }.
배열 생성의 제약 사항
- 타입 검증: 클래스나 인터페이스 타입은 구체화 가능한 타입(reifiable type)이어야 하며, 매개변수화된 타입은 사용할 수 없습니다.
- 크기 표현식: 배열 크기를 지정하는 표현식은 정수 타입으로 변환 가능해야 하며(int 또는 long), 음수일 경우 NegativeArraySizeException이 발생합니다.
올바른 배열 초기화 방법
int[] arr1 = {1, 2, 3};
int[] arr2 = new int[]{1, 2, 3};
int[] arr3 = new int[3];
arr3[0] = 1;
arr3[1] = 2;
arr3[2] = 3;
결론 & 참고자료
자바에서 배열 초기화는 컴파일 시점과 런타임 시점의 특성을 이해하는 것이 중요합니다.
배열의 크기와 초기값을 동시에 명시할 수 없다는 점은 설계 원칙에 따라 엄격하게 적용됩니다.
배열 생성 시 초기값을 명시하려면 new int[]{...}와 같이 초기화 블록을 사용하거나, 별도로 배열 크기와 요소 값을 각각 설정하는 방식으로 코드를 작성해야 합니다.
Java Docs Chapter 10. Array
https://docs.oracle.com/javase/specs/jls/se17/html/jls-10.html#jls-ArrayInitializer
Chapter 10. Arrays
int[] ai; // array of int short[][] as; // array of array of short short s, // scalar short aas[][]; // array of array of short Object[] ao, // array of Object otherAo; // array of Object Collection [] ca; // array of Collection of unknown type The declara
docs.oracle.com
Java SE 17 docs
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/Arrays.html
Arrays (Java SE 17 & JDK 17)
public class Arrays extends Object This class contains various methods for manipulating arrays (such as sorting and searching). This class also contains a static factory that allows arrays to be viewed as lists. The methods in this class all throw a NullPo
docs.oracle.com
'Java' 카테고리의 다른 글
예제로 배우는 결국 알아야하는 JVM 메모리 구조(순한맛) (0) | 2025.01.22 |
---|---|
예제로 배우는 제한자와 자바변수 설계 전략 (1) | 2025.01.22 |
Java 조각모음 [3] (0) | 2025.01.20 |
예제로 배우는 자바 String Pool 이해하기 (0) | 2025.01.20 |
Java 조각모음 [2] (0) | 2025.01.17 |