Java에서 배열의 기본 초기화는 무엇입니까?


144

그래서 int 배열을 선언하고 초기화하고 있습니다 :

static final int UN = 0;
int[] arr = new int[size];
for (int i = 0; i < size; i++) {
    arr[i] = UN;
}

대신이 작업을 수행한다고 가정 해 보겠습니다.

int[] arr = new int[5];
System.out.println(arr[0]);

... 0표준 출력으로 인쇄합니다. 또한 내가 이것을하면 :

static final int UN = 0;
int[] arr = new int[5];
System.out.println(arr[0]==UN);

... true표준 출력으로 인쇄합니다. 그렇다면 Java는 기본적으로 배열을 어떻게 초기화합니까? 기본 초기화가 배열 인덱스를 설정한다고 가정해도 안전합니다. 즉, 배열 0을 반복하고 초기화 할 필요가 없습니다.

감사.


답변:


281

프로그래머가 명시 적으로 설정하지 않은 Java 프로그램의 모든 것은 0 값으로 초기화됩니다.

  • 참조 (객체를 보유한 모든 것)는입니다 null.
  • int / short / byte / long의 경우는입니다 0.
  • float / double의 경우 0.0
  • 부울의 경우 false.
  • '\u0000'( null) 문자 인 10 진수에 해당 하는 char의 경우

무언가의 배열을 만들면 모든 항목도 0이됩니다. 따라서 배열은에 의해 생성 된 직후 5 개의 0을 포함합니다new .

참고 (주석 기반) : Java 가상 시스템은 로컬 변수를 할당 할 때 기본 메모리를 제로화 할 필요가 없으므로 (필요한 경우 효율적인 스택 작업이 가능함) 임의의 값을 피하기 위해 Java 언어 사양에서 로컬 변수를 초기화해야합니다.


의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Brad Larson

컴파일러가 알려주는 것처럼 로컬 변수를 제외한 모든 것은 초기화되지 않습니다.
Lorne의 후작 9

답변 끝에 언급 된 @ user207421.
Thorbjørn Ravn Andersen

답변의 첫 문장이 정확하지 않고 수정되어야 함을 의미합니다. 그리고 채팅에서 당신의 '어떻게 아십니까'질문은 의미가 없습니다. JLS는 그렇게 말합니다. 컴파일러가이를 강제합니다.
Lorne의 후작

@ user207421 "프로그래머가 명시 적으로 설정하지 않음"(컴파일러에 필요할 수 있음)
Thorbjørn Ravn Andersen 님

60

로부터 Java 언어 사양 :

  • 각 클래스 변수, 인스턴스 변수 또는 배열 구성 요소는 작성 될 때 기본값으로 초기화됩니다 (§15.9, §15.10).

    • 바이트 유형의 경우 기본값은 0, 즉 값입니다 (byte)0.
    • short 유형의 경우 기본값은 0, 즉 값입니다 (short)0.
    • int 유형의 경우 기본값은 0 0입니다.
    • long 유형의 경우 기본값은 0, 즉입니다 0L.
    • float 유형의 경우 기본값은 양의 0, 즉입니다 0.0f.
    • double 유형의 경우 기본값은 양의 0, 즉입니다 0.0d.
    • char 유형의 경우 기본값은 null 문자 '\u0000'입니다.
    • 부울 유형의 경우 기본값은 false입니다.
    • 모든 참조 유형 (§4.3)의 기본값은 null입니다.

2
그리고 Long과 Integer의 배열은 어떻습니까?
Georgy Dobrev

1
@GeorgyDobrev. 그것들은 참조 유형입니다. 위의 사양에 따라 null입니다.
Dave Costa

문자열 배열은 어떻습니까?
Zac

1
@Zac는 위와 동일하지만 String은 객체이므로 배열의 기본값은입니다 null.
Dave Costa

18

JLS는 분명히 말한다

배열 이니셜 라이저는 배열을 작성하고 모든 구성 요소에 대한 초기 값을 제공합니다.

이것은 배열이 인스턴스 변수인지 로컬 변수인지 또는 클래스 변수인지에 관계없이 적용됩니다.

기본 유형의 기본값 : 문서

객체의 기본값은 null입니다.


1
질문에 대답하지 않습니다. 그는 기본 초기화에 대해 묻고 있습니다.
Lorne의 후작

3

자바에 따르면

데이터 유형-기본값

바이트-0

짧은-0

정수-0

긴-0L

플로트-0.0f

더블-0.0d

char- '\ u0000'

문자열 (또는 모든 객체)-null

부울-거짓


2
그는 필드에 대해 묻지 않고 배열 구성 요소에 대해 묻고 있습니다.
Lorne의 후작

3
@ EJP는 배열 구성 요소의 의미를 정교하게 설명 할 수 있습니까 ???? 일반적으로 배열은 위와 같이 초기화 된 일부 데이터 유형 (동일한 유형)을 가지고 있으므로 u 구성 요소의 평균을 말해 줄 수 있습니까 ???
Abhishek Singh

3

Thorbjørn Ravn Andersen은 대부분의 데이터 유형에 대해 답변했습니다. 어레이에 대한 열띤 토론이 있었기 때문에

jls 사양에서 인용 http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 "어레이 구성 요소는 생성 될 때 기본값으로 초기화됩니다"

배열이 로컬인지 인스턴스인지 클래스 변수인지에 관계없이 기본값을 사용합니다.


2

Java의 모든 클래스에는 생성자가 있습니다 (생성자는 새 객체가 작성 될 때 호출되는 메소드이며 클래스 변수의 필드를 초기화합니다). 따라서 클래스의 인스턴스를 만들 때 객체를 만드는 동안 생성자 메서드가 호출되고 그 때 모든 데이터 값이 초기화됩니다.

정수 배열 유형의 객체의 경우 배열의 모든 값은 생성자 메서드에서 0으로 초기화됩니다. 부울 배열의 객체와 마찬가지로 모든 값이 false로 초기화됩니다.

따라서 Java는 객체를 만드는 동안 생성자 메서드를 실행하여 배열을 초기화하고 있습니다.


1

자바는 초기화시 JAVA 배열의 기본 길이는 10이라고 말합니다.

private static final int DEFAULT_CAPACITY = 10;

그러나이 size()메서드는 배열에 삽입 된 요소 수를 반환하며 초기화시 배열에 요소를 삽입하지 않은 경우 0을 반환합니다.

private int size;

public boolean add(E e) {
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    elementData[size++] = e;
    return true;
}

public void add(int index, E element) {
    rangeCheckForAdd(index);
    ensureCapacityInternal(size + 1);  // Increments modCount!!
    System.arraycopy(elementData, index, elementData, index + 1,size - index);
    elementData[index] = element;
    size++;
}

2
이것은 배열이 아닌 ArrayList처럼 보입니다.
Thorbjørn Ravn Andersen 님이
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.