null은 개체입니까?


119

ObjectJava에서 null 입니까?


41
그렇지 않습니다. 왜 그런 질문이 있는지 궁금해하는 사람들을 위해, 예를 들어 Ruby와 같이 null이 실제로 객체 인 언어가 있습니다.
JRL

7
유형에 대해 매우 세심한 Scala 에는 단일 인스턴스를 갖는 유형 Null( 실제로 는 특성 )이 null있습니다.
Carl Smotricz 2009

1
@JRL : JRuby를 작동하는 방법 그냥 호기심에서, 나는 (I 구현의 수준에 익숙하지 충분히 확실히 알 수 있어요.) ... 어떻게 영향을 궁금해
벤자민 오크스

JRL의 코멘트 @에 추가하려면 - 루비의 거친 동등에 null이다 nil의 인스턴스 인 NilClass
엘리엇 사익스

또는 자바 스크립트가있는 null instanceof Object거짓에 불과하다 typeof(null)돌아갑니다 'object'. 이 경우 개체입니까? 누가 알아.
Don Hatch

답변:


166

널 (null)이 객체 인 경우에, 그것은의 방법을 지원하는 것 java.lang.Object등을 equals(). 그러나 이것은 사실이 아닙니다. null에 대한 모든 메서드 호출은NullPointerException . .

이 주제에 대한 Java 언어 사양 은 다음과 같이 말합니다.

또한 이름이없는 특수 널 유형 인 널 표현식 유형도 있습니다. 널 유형에는 이름이 없기 때문에 널 유형의 변수를 선언하거나 널 유형으로 캐스트 할 수 없습니다. 널 참조는 널 유형 표현식의 유일한 가능한 값입니다. 널 참조는 항상 모든 참조 유형으로 캐스트 될 수 있습니다. 실제로 프로그래머는 null 형식을 무시하고 null이 참조 형식이 될 수있는 특수 리터럴 인 척만 할 수 있습니다.

나는 이것이 "null은 특별하다"로 요약 될 수 있다고 생각한다.


1
따라서 Java의 객체는 같거나 하위 클래스 인 경우에만 객체 java.lang.Object입니다. 실질적으로-예. 당신은 java.lang.Object 상위의 서브 클래스가 아닌 클래스를 만들 수는 없지만, 내가보기의 철학적 관점에서 그것에 대해 생각하지 않았다
안드레아스 돌크에게

흥미롭게도 API 문서NullPointerException 는» null객체«… :) 그러나»null 포인터«에 대해 언급하는 것도 괜찮습니다.…
Lumi

"널 참조는 항상 모든 참조 유형으로 캐스트 될 수 있습니다."라고 말했습니다. 그렇다면 객체 참조 (반환) 유형을 가진 메소드에서 null (typecasted-if allowed)을 반환 할 수 있습니까?
Srichakradhar 2014

1
@Srichakradhar : 예, 우리는 할 수 있습니다! 여기에서 물어 보는 것보다 코드로 시도하면 더 쉽게 찾을 수 있습니다.
Michael Borgwardt 2014

1
"널 참조는 널 유형 표현식의 유일한 가능한 값입니다." 사양 문서를 읽을 때입니다. :)
sofs1

32

자바에 따르면 사양 , null(주석에 명시된 값으로) 객체 변수에 할당 될 수있는 타입이다. 이 유형의 변수를 인스턴스화하거나 만들 수는 없지만 null컴파일러에서 제공 하는 리터럴을 사용해야합니다 .


8
null은 유형 및 값입니다.
Joachim Sauer

5
null이름의 "인스턴스"입니다 null분명히 유형입니다.
strager

null변수가 아니라 리터럴입니다 : JLS, 3.10.7. The Null Literal
Gerold Broser 2015

Re " null는 할당 할 수있는 유형입니다 ": 1) null(코드에서) null 유형이 아닌 null 리터럴 2) 유형은 일반적으로 Java에서 변수에 할당 할 수 없습니다 . JLS 4.1을 참조하십시오 . " There are [... ] 변수에 저장 될 수있는 데이터의 2 종류의 값 [...]. 프리미티브 값 (§4.2) 및 기준값 (§4.3) " 그건 널 레퍼런스 비아 할당 될 수 리터럴. ... 계속 ...null
Gerold Broser

3) " 객체 변수 "의 객체 는 클래스 변수에 비해 일반적으로 유형이 아니라 수명을 나타냅니다. 유형을 참조 할 때 일반적으로 참조 유형의 변수 또는 간단히 참조 (유형) 변수라고합니다. 내가 예 / 개체 변수를 노출 자바 API에서 4 종류의 알고 있어요 (더있을 수 있습니다) : 그와 배열 과 클래스의 서브 클래스 . lengthjava.awt.geom.Point2D
Gerold Broser



12

Null은 개체가 없습니다.


그러나 null 유형은 모든 참조 유형에 할당 할 수 있습니다.
Tom Hawtin-tackline

"null 유형"이 없습니다. null은 원시적이지 않은 표현식의 특정 값입니다 (예 : 참조; Java에도 "참조 유형"이 없습니다.).
Tommy McGuire

3
Tommy : JLS 4.1 : "이름이없는 null 표현식 유형 인 특수 null 유형도 있습니다."
Ken

@TommyMcGuire Re» Java에는 "참조 유형"이 없습니다. « JLS 4.1
Gerold Broser

12

JRL은 다음과 같이 썼습니다.

아니, 아니야 ...

자주, 그것은 당신이 그것을 보는 곳, 당신이 더 믿는 사람에 달려 있습니다.

JLS에 따르면 예, . 특히 질문을 "Is the nullliteral of type Object?"로 바꾸면 특히 그렇습니다 . 위의 Michael Borgwardt가 인용 한 JLS 4.1 외에도 :

JLS 3.10.7 참조 :

널 리터럴은 항상 널 유형입니다.

JLS 4.10 :

유형 T의 하위 유형은 T가 U의 상위 유형이고 널 유형 인 모든 유형 U 입니다.

또는 JLS 4.10.2 :

널 유형의 직접 상위 유형은 널 유형 자체가 아닌 모든 참조 유형 입니다.

[내가 강조합니다.]

이클립스 2019-09의 컴파일러에 따르면 그렇지 않다 :

true.toString();  // Cannot invoke toString() on the primitive type boolean
null.toString();  // Cannot invoke toString() on the primitive type null

OpenJDKs에 따르면 12.0.1 javac 이있다 :

true.toString();  // error: boolean cannot be dereferenced
null.toString();  // error: <null> cannot be dereferenced

꺾쇠 괄호 null는 기본 유형이 아닌 다른 유형을 의미합니다 . 그리고 JLS 4.1 에 따르면 :

Java 프로그래밍 언어에는 기본 유형 (...)과 참조 유형 (...)의 두 가지 유형이 있습니다.

하나가 아니라면 다른 것입니다.


Claudiu는 다음과 같이 썼습니다.

null은 추한 것입니다.

Au contraire, null아름답습니다. 대신 참조 유형 변수의 기본값으로 무엇을 제안 하시겠습니까? 임의의 비트 조합? 액세스 위반 또는 더 나쁜 경우 포인터 지옥에 오신 것을 환영합니다!


Joachim Sauer는 다음과 같이 썼습니다.

null은 유형 및 값입니다.

실제로 null 과 관련된 세 가지 항목이 있습니다 ( JLS 3.10.7 참조 ).

  1. (그렇지 않으면 이름이 지정되지 않은) null 유형 입니다.
  2. null 문자 .
  3. 널 레퍼런스 값. (일반적으로 null 값 또는 간단히 null 로 축약됩니다 .)

(1) 위에 언급 된 JLS 4.10.2 에 따르면 null 유형 은 인터페이스뿐만 아니라 클래스에도 다중 상속을 사용합니다. 우리 모두가 알고있는 것은 우리 애플리케이션 프로그래머에게는 불가능합니다.

(2) 널 리터럴 은 다음과 같이 정의되는 변수로 상상할 수 있습니다.

JVM_global final null_type null = new null_type();

JLS 3.9 참고 :

다양한 문자 시퀀스가 ​​때때로 키워드로 잘못 가정됩니다.

  • null키워드가 아니라 null 리터럴 ( §3.10.7 )입니다.

에 관하여 null instanceof <any type>

JLS 4.10.2를 염두에두고 ( " null 유형 은 모든 유형의 하위 유형입니다") null instanceof <any type>로 평가 true해야합니다. 그렇지 않습니까? 첫눈에 수 있지만 JLS 15.20.2 는 통찰력에 대한 답을 제공합니다.

[...] 결과instanceof연산자 이다 true값 경우RelationalExpression이 아니다null [...]. 그렇지 않으면 결과는false 입니다.

[내가 강조합니다.]

(응용 프로그램 프로그래머의 관점에서) 더 의미있는 것이 무엇인지 자문 해보십시오.

  • 제공 false하고 따라서 참조 표현식이 우리에게 노출 된 유형이 아님을 나타냅니다. 즉, 우리에게 유용한 것을 참조하지 않음을 나타냅니다.

  • 또는 제공 true하여 표현식이 특수 참조로 평가된다는 사실을 알려줍니다 . "객체"를 참조하는 null 참조 는 존재 여부와 이름이없는 특수 null 유형 인지 알 수 없습니다. 우리가 null 리터럴을 통해 다중 상속을 포함하는 모든 유형의 하위 유형이며 어쨌든 무시해야합니까? 더 실용적인 예도 고려하십시오.

     class Car implements Vehicle {  
     ...
     Vehicle car = null;
     ...
     boolean b = car instanceof Car;  // True? There's not even an instance
     ...                              // which could be of type Car.

또한 다음으로 이어집니다.

instanceof무언가를 말하는 적절한 방법 이 아닌 이유null '객체 성' 아닌가?

instanceofnot 이라고 sameorsubtypeof합니다. 즉, 인스턴스의 유형을 두 유형이 아닌 유형과 비교하고 있음을 의미합니다. 이제는 null"인스턴스가 없습니다"를 의미하며 인스턴스가 없으면 인스턴스 유형이 없습니다. 아무것도 비교하지 않으면false .

또는 "더 많은"실제 사례에서 :

  • »Big Apple«( = 참조 유형 이름 ) 을 사용하여 실제 크기의 사과 사진 ( = 참조 유형 )을 손에 들고 있습니다. )이 적힌 을 가지고 있습니다.
  • 테이블이 있습니다 ( = heap내 앞에 )이 있습니다.
  • 테이블에 사과 ( = instance )가 있으면 코드 ( = reference 연결된 )가 있습니다.
  • 이 코드의 다른 쪽 끝을 손에 쥐고 있습니다 ( = reference 변수 ).
  • 코드를 따라 사과를 따라 내 그림 ( = instanceof ) 과 비교합니다 .
  • 사과의 크기가 그림과 같거나 큰 경우»Big Apple«이라는 글씨가 적용됩니다 ( = true ).
  • 더 작 으면 그렇지 않습니다 ( = false ).
  • 테이블에 사과가없고 (= 인스턴스 없음) 코드가 없으면 ( = null ) 쓰기도 적용되지 않습니다 ( = false ). 때문에 : 없습니까 사과는 큰 사과? 아니, 그렇지 않습니다.


Michael이 요약 한 것처럼 "null은 특별합니다".


2
애플과 널? 소송을 두려워하지 않습니까? :)
Gábor Lipták 2014

9

아니요, 클래스 나 클래스의 인스턴스가 아닙니다. 아무것도에 대한 언급입니다.

편집 : 사양을 읽지 않았으므로 위의 내용이 100 % 정확하지 않을 수 있습니다.


5

4.1 Java 언어 사양 의 유형 및 값종류 장에서 설명했듯이 null은 하나의 값인 null 참조 (그리고 리터럴로 null표시됨) 를 갖는 유형입니다 .

이름이없는 표현식의 유형 인 특수 유형 도 있습니다 null. 널 유형에는 이름이 없기 때문에 널 유형의 변수를 선언하거나 널 유형으로 캐스트 할 수 없습니다. 널 참조는 널 유형 표현식의 유일한 가능한 값입니다. 널 참조는 항상 모든 참조 유형으로 캐스트 될 수 있습니다. 실제로 프로그래머는 널 유형을 무시하고 null참조 유형이 될 수있는 특수 리터럴 인 척할 수 있습니다.

그래도 Null 개체 패턴 (권장하지 않음) 에 대해 읽고 싶을 수 있습니다 . 이 패턴에 대한 자세한 내용은 C2 Wiki 또는 Wikipedia 를 참조하십시오 .



4

아니요, null instanceof Object는 항상 false를 반환하므로 개체가 아닙니다. 또한 각 클래스에 대해 하나가 아닌 하나의 null 만 있습니다.


3
사실은를 null instanceof <anytype>반환 false합니다.
Bombe

4

Java Spec 에 따르면 ,

모든 참조 유형에 대한 값으로 사용할 수있는 특수 null 리터럴도 있습니다. 기본 유형의 변수를 제외한 모든 변수에 널을 지정할 수 있습니다. null 값으로 존재 여부를 테스트하는 것 외에는 할 수있는 일이 거의 없습니다. 따라서 null은 프로그램에서 일부 개체를 사용할 수 없음을 나타내는 마커로 자주 사용됩니다.


4

Java는 참조를 통해 객체를 처리합니다. Null은 OO 수준 아래로 떨어지기 때문에 Java의 OO-ness를 분석 한 것입니다. 아니오 그것은 객체가 아니며 참조의 가치입니다. 그리고 그것은 객체 패러다임과는 아무런 관련이 없지만 객체를 가능하게하는 Java의 배관과 관련이 있습니다.


3

null은의 인스턴스 java.lang.Object입니까? 아니.

null은 객체 입니까? " is " 의 정의에 따라 다릅니다 .


2
Object foo = null;
System.out.println(foo.toString()); 

첫 번째 줄은 null유형에 할당 할 수 Object있지만 두 번째 줄은 이것이 확실히 아니고 Object결과적으로java.lang.NullPointerException


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.