초기화되지 않은 객체 변수와 Java에서 초기화 된 객체 변수의 차이점은 무엇입니까?


12

다음 두 가지 객체 변수가 있습니다

Date a;
Date b=null;

확실히 'a'와 'b'는 어떤 객체도 가리 키지 않습니다.

이제 다음 진술을 호출하면

System.out.println(a.toString());

컴파일 시간 오류가 발생하지만 다음 명령문을 호출하면

System.out.println(b.toString());

컴파일 시간 오류는 없지만 런타임 오류가 있습니다. 그 이유는 무엇이며 널 값을 나타 내기 위해 실제로 어떤 값이 'b'에 저장됩니까?


2
SO에서 여러 번 묻고 대답했습니다. 왜 로컬 변수가 Java에서 초기화되지 않습니까? , Java에서 초기화되지 않은 변수와 멤버 그리고 이것들과 관련된 많은 질문들
gnat

@ gnat, "초기화되지 않은"과 "null"의 차이점을 다루는 다른 질문이 있습니까? 대답이 비슷하다고해서 이것이 중복 된 질문이라는 의미는 아닙니다.
DougM

@DougM 확실히, 내가 언급 한 첫 번째 질문을 읽었습니까? "자바 디자이너가 로컬 변수에 기본값을 주어서는 안된다고 생각한 이유가 있습니까? 진지하게, 인스턴스 변수에 기본값을 부여 할 수 있다면 로컬 변수에 대해 같은 것을 할 수없는 이유는 무엇입니까?" (이것은 단순히 다른 사이트에 있기 때문에 기술적 으로 중복 될 수 없습니다 )
gnat

1
그것은 "초기화되지 않은"과 "초기화 된 것으로 null"의 차이점을 다루지 않고 "변수가 자동으로 null로 초기화되지 않는 이유는 무엇입니까?" 같은 주제, 약간 다른 질문.
DougM

답변:


3

지역 변수의 상태가 범위 내에서 제어되기 때문에

 // method/loop/if/try-catch etc...
 {
   Date d; // if it's not intialised in this scope then its not intialised  anywhere
 }

필드의 경우가 아닙니다

class Foo{
 Date d; // it could be intialised anywhere, so its out of control and java will set to null for you
}

이제 변수를 null로 설정하고 즉시 사용하는 것이 좋은 이유는 무엇입니까? 어쩌면 그것은 때때로 끔찍한 실수로 이어지는 역사적 실수 일 수도 있습니다.

 {
  Date d = null;
  try{
  }catch{ // hide it here 
  }
  return d;
 } 

이제 의미상의 차이점은 무엇입니까?

Date d;

유형의 객체를 가리키는 참조를 보유 할 수있는 변수를 선언 Date하지만

Date d= null; 

정확히 동일하지만 참조가 이번에는 null을 가리키고 있습니다. null은 다른 참조와 같습니다. 네이티브 포인터의 공간을 차지합니다. 즉 32 비트 시스템에서는 4 바이트, 64 비트 시스템에서는 8 바이트입니다.


이것은 단지 한 시간 전에 게시 된 이전 답변 에서 언급되고 설명 된 반복 된 것으로 보인다
gnat

@gnat 귀하의 의견에 감사드립니다, 그러나 나는 건배하지 않습니다
Sleiman Jneidi

null도 메모리 어딘가에 저장된 객체이며 null로 할당 된 모든 객체 변수는 해당 null 객체를 가리 킵니다.
Harish_N

@ Harish.N 아니오, 나는 그 말이 아니라 참조를 말했다
Sleiman Jneidi

이 예에서 'd'는 참조입니다. 참조는 Date 유형의 오브젝트에 대한 참조입니다. null이 참조 인 경우와 유사합니다.
Harish_N

19

클래스 필드에는 차이가 없습니다. 그들은는 null0 숫자 값과 객체, 기본적으로 false부울합니다.

메소드에 선언 된 변수의 경우 Java를 초기화해야합니다. 초기화하지 않으면 액세스 할 때 컴파일 시간 오류가 발생합니다.

이유가 뭐야? 클래스 필드는 모든 방법으로 수정할 수 있습니다. 어떤 순서로든 메소드가 호출됩니다. 개인이 아닌 모든 필드는 해당 클래스를 확장하는 다른 클래스 및 / 또는 클래스에 의해 수정 될 수 있습니다. 따라서 초기화되지 않은 변수는 여러 곳에서 할당 될 수 있기 때문에 초기화되지 않은 변수를 알리는 데 아무런 의미가 없습니다.

그러나 메소드 내부의 변수는 로컬이며 메소드 자체 내에서만 수정할 수 있습니다. 따라서 가능한 실수를 지적하는 것이 가능하고 합리적입니다. 그리고 컴파일러는 그것을하려고합니다. 이 경우 알고 필드가 초기화되지 않도록 당신이 원하는 적이 없기 때문에, 그것은 오류가 표시됩니다. 확실하지 않은 경우 경고를 표시하여 확실하게 할 수 있습니다.

public static class Test {
    Date a; // ok 
    Date b = null; // ok

    public void test() {
        Date c;
        Date d = null;

        System.out.println(a.toString());
        System.out.println(b.toString());
        System.out.println(c.toString()); // error
        System.out.println(d.toString()); // warning
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.