자바에서 null이란 무엇인가?
뭐가null
?
이다null
어떤 예라도?
무엇을 할 것인가?null
소속은?
그것은 기억 속에 어떻게 표현되어 있는가?
null이 어떤 예인가?
아니, 어떤 타입도 없다.null
이다instanceof
.
15.20.2 형식 비교 연산자instanceof
RelationalExpression: RelationalExpression instanceof ReferenceType
, 그 그과.
instanceof
연산자는true
RelationalExpression 값이 아닌 경우null
그리고 레퍼런스 유형에 대한 참조를 올리지 않고 캐스팅할 수 있다.ClassCastException
. 그렇지 않으면 결과는false
.
이는 모든 유형에 대해E
그리고R
, 어떤 것이든E o
, whereo == null
o instanceof R
항상false
.
null'은 어떤 세트에 속해 있는가?
JLS 4.1 유형과 가치의 종류
식의 유형인 특별한 null 유형도 있다.
null
, 그것은 이름이 없다.null 타입은 이름이 없기 때문에 null 타입의 변수를 선언하거나 null 타입에 캐스팅하는 것은 불가능하다.그null
참조는 null 형식의 식에서 가능한 유일한 값이다.그null
참조는 항상 모든 참조 유형에 캐스팅될 수 있다.실제로 프로그래머는 null 타입을 무시하고 그냥 그런 척 할 수 있다.null
단지 어떤 기준 형식일 수 있는 특수한 문자일 뿐이다.
null이란 무엇인가?
위의 JLS 인용구가 말하듯이, 실제로 당신은 단순히 "어느 종류의 참고문자라도 될 수 있는 특별한 문자"인 척 할 수 있다.
자바에서는null == null
(다른 언어에서는 항상 그렇지 않다.)또한 계약에 따라 다음과 같은 특수 재산도 보유한다는 점에 유의하십시오.
public boolean equals(Object obj)
비-비-비-비-비-비-비-비-비-비-
null
값 값값 값x
x.equals(null)
해야 한다return false
.
이 값은 모든 참조 유형에 대한 기본값(변수가 있는 경우)이기도 하다.
JLS 4.12.5 변수의 초기 값
- 각 클래스 변수, 인스턴스 변수 또는 배열 구성 요소가 생성될 때 기본값으로 초기화됨:
- 모든 참조 유형의 경우 기본값은
null
.
이것을 사용하는 방법은 다양하다.필드의 초기 값을 갖는 필드의 게으른 초기화를 활성화하는 데 사용할 수 있다.null
실제로 사용될 때까지 "실제" 값으로 대체될 때까지(계산하는 데 비용이 많이 들 수 있음).
다른 용법도 있다.다음에서 실제 예를 들어보자.
public static Console console()
반환:시스템 콘솔(있을 경우)
null
.
이는 매우 일반적인 사용 패턴이다.null
물체가 존재하지 않음을 나타내기 위해 사용된다.
다음 다른 사용 예제를 참조하십시오.
public String readLine() throws IOException
반환:a
String
행의 는 일체 , 행의 문자는 다음과 같다.null
개울의 종점에 도달했다면
그래서 여기,readLine()
돌아올 것이다instanceof String
각 행에 대해, 마침내 a를 반환할 때까지.null
끝을 나타내기 위해서.이를 통해 각 라인을 다음과 같이 처리할 수 있다.
String line;
while ((line = reader.readLine()) != null) {
process(line);
}
종료 조건이 좌우되지 않도록 API를 설계할 수 있다.readLine()
돌아오는null
그러나 이 디자인이 사물을 간결하게 만드는 이점이 있다는 것을 알 수 있다.빈 라인은 빈 라인이므로 문제가 없다는 점에 유의하십시오."" != null
.
이번에는 다음에서 다른 예를 들어보자:
V get(Object key)
지정한 키가 매핑되는 값을 반환하거나
null
이 지도에 키에 대한 매핑이 없는 경우.이 지도가 허용하는 경우
null
그 값, 그치다 값null
매핑이 되어 있지 않다는 것은 에 대한 도 있다. 또한 지도가 키에 대한 매핑을 명시적으로 할 수도 있다.null
. The . The.containsKey
이 두 경우를 구별하기 위해 조작을 사용할 수 있다.
이제 어떻게 사용하는지 알아보자.null
일을 복잡하게 만들 수 있어첫 번째 진술에 따르면, 키가 지도화되지 않으면null
반환된다.두 번째 진술서에 따르면, 키가 매핑되어 있더라도null
또한 반환될 수 있다.
이와는 대조적으로, 허락하지 않음으로써 상황을 단순하게 한다.null
키와 값; 그것의V get(Object key)
, 반환되는 경우null
, 명확하게는 키가 매핑되지 않았다는 것을 의미한다.
나머지 API를 통해 읽고 어디서 어떻게 하는지 찾을 수 있다.null
사용된다.그들이 항상 모범적인 연습 예는 아니라는 것을 명심해라.
일반적으로 말해서null
다음을 나타내는 특수 값으로 사용됨:
- 초기화되지 않은 상태
- 종료조건
- 존재하지 않는 개체
- 알 수 없는 값
그것은 기억 속에 어떻게 표현되어 있는가?
자바에서?신경 쓰지 마.그리고 그렇게 유지하는 것이 가장 좋다.
이다null
일 은 일?
이것은 이제 아주 주관적이다.라고 말하는 사람도 있다.null
피할 수 있었던 많은 프로그래머 오류를 야기한다.어떤 사람들은 잡히는 언어로NullPointerException
자바처럼, 프로그래머 오류에 빨리 실패하기 때문에 그것을 사용하는 것이 좋다.어떤 사람들은 피한다.null
Null 객체 패턴 등을 사용하여
이것은 그 자체로 큰 주제여서 다른 질문에 대한 답으로 가장 잘 논의된다.
나는 이 일을 의 발명가의 인용으로 끝낼 것이다.null
그 자신, C.A.R Hoare (급속한 명성의):
나는 그것을 내 억만 달러의 실수라고 부른다.의 발명이었다.
null
1965 년참 조 조 조 나는 그 ALGOL W로당시 나는 개체 지향 언어(ALGOL W)로 참조를 위한 최초의 종합 타입 시스템을 설계하고 있었다.내 목표는 컴파일러에 의해 자동으로 수행되는 검사로, 참조의 모든 사용이 절대적으로 안전해야 한다는 것이었다.그러나 나는 그것을 집어넣고 싶은 유혹을 참을 수가 없었다.null
단순히 구현이 너무 쉽다는 이유만으로 참고할 수 있다.이로 인해 수많은 오류와 취약성, 시스템 충돌로 이어져 지난 40년 동안 아마도 10억 달러의 고통과 피해를 입혔을 것이다.
이 프리젠테이션의 비디오는 더 깊이 들어가는데, 그것은 권장되는 시계다.
null이 어떤 예인가?
ㅇㅇㅇ. 그래서 그런거야null instanceof X
돌아올 것이다false
모든 계층에 걸쳐X
. (할당할수 있다는 사실에 속지 말라.null
개체 유형인 변수에 연결하십시오.엄밀히 말하면, 이 과제는 암묵적 유형 변환을 포함한다. 아래를 참조)
null'은 어떤 세트에 속해 있는가?
null 유형의 유일한 멤버로, 여기서 null 유형은 다음과 같이 정의된다.
"이름이 없는 null이라는 표현 유형인 특별한 null형도 있다.null 타입은 이름이 없기 때문에 null 타입의 변수를 선언하거나 null 타입에 캐스팅하는 것은 불가능하다.null 참조는 null 형식의 식에서만 가능한 값이다.null 참조는 항상 모든 참조 유형에 캐스팅할 수 있다.실제로 프로그래머는 null 타입은 무시하고 null 타입은 어떤 참조 타입도 될 수 있는 특별한 문자 그대로인 척 할 수 있다." JLS 4.1
null이란 무엇인가?
위 내용을 참조하십시오.어떤 맥락에서 보면null
"무개체" 또는 "무개체" 또는 "무개체"를 나타내기 위해 사용되지만, 이러한 의미는 적용에 특유하다.
그것은 기억 속에 어떻게 표현되어 있는가?
그것은 구현에 특정한 것이며, 당신은 다음 사항의 대표성을 볼 수 없을 것이다.null
순수한 자바 프로그램에서. (하지만)null
모든 Java 구현은 아니더라도 대부분 제로 머신 주소/포인터로 표시됨.)
null이란 무엇인가?
그건 아무것도 아니다.
null이 어떤 예인가?
아니 아무것도 아니니까. 그것은 어떤 것의 예시일 수 없다.
null이 속한 집합은?
세트 없음
그것은 기억 속에 어떻게 표현되어 있는가?
일부 참조가 다음과 같이 이를 가리킬 경우:
Object o=new Object();
힙 메모리에는 새로 생성된 개체에 할당된 공간이 있다.그리고 o는 메모리에 할당된 그 공간을 가리킬 것이다.
지금o=null;
이것은 이제 o가 그 물체의 기억공간을 가리키지 않는다는 것을 의미한다.
아니, 그건 그 어떤 것의 예가 아니야. 그 예는 항상 거짓일 거야.
Java(tm)의 Null
C와 C++에서 "NULL"은 헤더 파일에 정의된 상수로, 다음과 같은 값을 갖는다.
0
또는:
0L
또는:
((void*)0)
컴파일러 및 메모리 모델 옵션에 따라 달라짐.NULL은 엄밀히 말하면 C/C++ 그 자체의 일부가 아니다.
자바(tm)에서 "null"은 키워드가 아니라 null 형식의 특별한 리터럴이다.어떤 기준 형식에도 캐스팅할 수 있지만 int나 boolean과 같은 원시 형식에는 캐스팅할 수 없다.null 리터럴이 반드시 값이 0인 것은 아니다.그리고 null 타입으로 캐스팅하거나 이런 타입의 변수를 선언하는 것은 불가능하다.
null 키워드는 null 참조를 나타내는 리터럴로, 어떤 개체도 참조하지 않는 리터럴이다.null은 기준 유형 변수의 기본값이다.
그리고 아마 이것 좀 봐.
Null은 클래스의 인스턴스가 아니다.
그러나 (개체 또는 배열) 유형의 변수에 null을 할당할 수 있다.
// this is false
boolean nope = (null instanceof String);
// but you can still use it as a String
String x = null;
"abc".startsWith(null);
바이트코드 표현
자바의null
세 을 사용한다 :접접 JVM 지만: 구에에 따라 에에 지만:
aconst_null
: 예: 변수를 다음으로 설정하는 방법null
에 있어서와 같이Object o = null;
ifnull
그리고ifnonnull
: 예: 대상과 대상의 비교null
에 있어서와 같이if (o == null)
6장 "Java Virtual Machine 명령 집합"은 다음 의 효과를 언급한다.null
다른 지시사항으로: 그것은 a를 던진다.NullPointerException
그들 중 많은 이들에게
2.4. "참조 유형 및 값"도 언급함null
일반적인 용어로:
기준 값은 또한 특별한 null 참조일 수 있으며, no object에 대한 참조일 수 있으며, null로 여기에 표시된다.null 참조는 처음에 런타임 유형이 없지만 어떤 유형에도 캐스트될 수 있다.참조 유형의 기본값은 null이다.
null
특별한 가치가 있는 것이지, 그 어떤 것의 예가 아니다.분명한 이유로 그것은 있을 수 없는 일이다.instanceof
아무거나
null
어떤 종류의 예도 아닌 특별한 값이다.이는 다음 프로그램으로 설명된다.
public class X {
void f(Object o)
{
System.out.println(o instanceof String); // Output is "false"
}
public static void main(String[] args) {
new X().f(null);
}
}
자바에는 원시형과 참조형의 두 가지 주요 범주가 있다.원시 유형 저장소 값으로 선언된 변수, 참조 유형 저장소로 선언된 변수는 참조한다.
String x = null;
이 경우 초기화 문은 변수 "x"를 선언한다. "x"는 문자열 참조를 저장한다.여기는 무효다.우선 null은 유효한 개체 인스턴스가 아니므로 할당된 메모리가 없다.단순히 개체 참조가 현재 개체를 참조하고 있지 않음을 나타내는 값이다.
자바에서 null은 C++에서 nullptr과 유사하다.
프로그램(C++):
class Point
{
private:
int x;
int y;
public:
Point(int ix, int iy)
{
x = ix;
y = iy;
}
void print() { std::cout << '(' << x << ',' << y << ')'; }
};
int main()
{
Point* p = new Point(3,5);
if (p != nullptr)
{
p->print();
p = nullptr;
}
else
{
std::cout << "p is null" << std::endl;
}
return 0;
}
Java의 동일한 프로그램:
public class Point {
private int x;
private int y;
public Point(int ix, int iy) {
x = ix;
y = iy;
}
public void print() { System.out.print("(" + x + "," + y + ")"); }
}
class Program
{
public static void main(String[] args) {
Point p = new Point(3,5);
if (p != null)
{
p.print();
p = null;
}
else
{
System.out.println("p is null");
}
}
}
이제 위의 코드에서 자바에서 null이 무엇인지 이해하셨습니까?싫다면 C/C++에서 포인터를 배우라고 권하면 이해하게 될 거야.
Note that in C, unlike C++, nullptr is undefined, but NULL is used instead, which can also be used in C++ too, but in C++ nullptr is more preferable than just NULL, because the NULL in C is always related to pointers and that's it, so in C++ the suffix "ptr" was appended to end of the word, and also all letters are now lowercase, but this is less i마포르탕의
Java에서는 유형 클래스 비원격의 모든 변수가 해당 유형의 객체에 항상 참조되며 null 클래스 개체 참조는 null이지만 null 포인터는 아니다. 왜냐하면 Java에서는 "pointer"가 없지만 클래스 개체에 대한 참조가 대신 사용되며, Java에서는 null을 클래스 개체 참조와 관련이 있기 때문에 당신은 또한 호출할 수 있다."nullref" 또는 "nullrefobj"로 부르지만, 이것은 길기 때문에 그냥 "null"라고 불러라.
C++에서는 선택적 멤버/변수에 포인터와 nullptr 값을 사용할 수 있다. 즉, 값이 없고 값이 없으면 nullptr과 같으므로, 예를 들어 Java에서 null을 얼마나 사용할 수 있는가.
내 생각에 자바에서 null을 보는 흥미로운 방법은 정보의 부재를 나타내는 것이 아니라 단순히 어떤 유형의 참조에 할당될 수 있는 문자적 가치로 보는 것이다.만약 그것이 정보의 부재를 나타내었다면, a1==a2가 진실이라고 하는 것은 말이 되지 않는다. 왜냐하면 그들이 정말로 어떤 물체를 가리킬 수 있기 때문이다.그런데 자바에서는 null == null returns true.만약 자바(Java)가 SQL:1999와 같다면 null==null은 알 수 없는 상태로 반환될 것이다(SQL:1999의 부울 값은 참, 거짓 및 알 수 없는 세 가지 값을 가질 수 있지만 실제로는 알 수 없는 것이 실제 시스템에서는 null로 구현된다).http://en.wikipedia.org/wiki/SQL
JLS의 모든 질문에 정식으로 답변하는 짧고 정확한 답변:
3.10.7. Null 리터럴
null 형식은 하나의 값인 null 참조를 가지며, null 리터럴 null로 나타내며, ASCII 문자로 구성된다.
null 리터럴은 항상 null 유형이다.
null에 할당된 형식의 참조만 할당된다.참조에 값(개체)을 할당하지 않은 경우.이러한 할당은 JVM에 한정되며, 참조가 어느 정도 소요되며 어떤 메모리 영역에 할당될 것인가에 한정된다.
참조URL: https://stackoverflow.com/questions/2707322/what-is-null-in-java
'programing' 카테고리의 다른 글
HttpServletRequest에서 POST 요청 본문 가져오기 (0) | 2022.04.23 |
---|---|
Vuetify Select 입력으로 어레이 데이터를 로드하는 방법 (0) | 2022.04.23 |
C의 엄격한 별칭 위반, 주물 없음에도 불구하고? (0) | 2022.04.23 |
유사한 기능 구성요소에 대한 기존 Vue 구조(Vuex 포함) (0) | 2022.04.23 |
C구조와 C++구조 (0) | 2022.04.23 |