1. 소개

Java 세계에서 null 유형은 널리 퍼져 있으며 이를 만나지 않고는 언어를 사용하기가 어렵습니다. 대부분의 경우, 그것이 아무것도 없음 또는 부족함을 나타낸다는 직관적인 이해만으로도 효과적으로 프로그래밍하기에 충분합니다. 그럼에도 불구하고 때때로 우리는 주제를 더 깊이 파고들고 철저하게 이해하기를 원합니다.

이 사용방법(예제)에서는 null 형식이 내부에서 어떻게 작동하고 다른 형식과 어떻게 관련되는지 살펴보겠습니다 .

2. 유형이란 무엇입니까?

null 유형 에 대한 특정 질문에 답하기 전에 유형이 실제로 무엇인지 정의해야 합니다. 경쟁 정의가 많기 때문에 쉬운 작업이 아닙니다. 우리에게 가장 유용한 것은 가치 공간의 정의입니다. 이 정의에서 유형은 보유할 수 있는 가능한 값 세트로 정의됩니다 .

부울 변수를 선언하고 싶다고 가정해 보겠습니다 .

boolean valid;

우리가 한 것은 "valid"라는 변수가 true 또는 false 의 두 가지 가능한 값 중 하나를 보유하도록 선언한 것입니다 . 가능한 값 세트에는 두 개의 요소만 있습니다. int 변수 를 선언하려는 경우 가능한 값 집합은 훨씬 더 크지만 여전히 명확하게 정의됩니다. 가능한 모든 숫자는 -2^31에서 2^31-1까지입니다.

3. null은 어떤 유형입니까 ?

null 은 가능한 값이 하나만 있는 특수 유형입니다. 즉, 가능한 값 집합에는 하나의 요소만 있습니다. 이 특성만으로도 null 유형이 매우 독특합니다. 일반적으로 변수의 전체 목적은 서로 다른 값을 가정할 수 있다는 것입니다. null 참조는 하나만 있으므로 null 유형 의 변수는 해당 특정 참조 하나만 보유할 수 있습니다. 변수가 존재한다는 것 외에는 정보를 가져오지 않습니다.

null 유형을 사용하는 방식으로 사용 가능하게 만드는 특성이 하나 있습니다 . null 참조 다른 모든 참조 형식으로 캐스팅될 수 있습니다. 즉, 기본 유형이 아닌 모든 유형이 될 수 있는 특수 리터럴처럼 취급할 수 있습니다. 실제로 null 참조는 이러한 형식의 가능한 값의 유효 집합을 확장합니다.

이는 완전히 다른 참조 유형의 변수에 정확히 동일한 null 참조를 할당할 수 있는 이유를 설명합니다.

Integer age = null;
List<String> names = null;

이는 또한 boolean 과 같은 기본 유형의 변수에 null 값을 할당할 수 없는 이유를 설명합니다 .

Boolean validReference = null // this works fine
boolean validPrimitive = null // this does not

null 참조는 기본 형식이 아닌 참조 형식으로 캐스팅될 수 있기 때문입니다  . 부울 변수 의 가능한 값 세트에는 항상 두 개의 요소가 있습니다.

4. 메소드 매개변수로서의 null

두 가지 간단한 메서드를 살펴보겠습니다. 둘 다 하나의 매개변수를 사용하지만 유형은 다릅니다.

void printMe(Integer number) {
  System.out.println(number);
}

void printMe(String string) {
  System.out.println(string);
}

Java의 다형성 때문에 다음과 같이 이러한 메서드를 호출할 수 있습니다.

printMe(6);
printMe("Hello");

컴파일러는 우리가 참조하는 메서드를 이해할 것입니다. 그러나 다음 명령문은 컴파일러 오류를 발생시킵니다.

printMe(null); // does not compile

왜요? null은 StringInteger 모두로 캐스팅될 수 있기 때문에 컴파일러는 어떤 메서드를 선택해야 할지 알 수 없습니다.

5. 널포인터 예외

이미 살펴본 것처럼 null이 기술적으로 다른 별도의 유형이더라도 참조 유형의 변수에 null 참조를 할당 있습니다  . null 이 아닌 것처럼 해당 변수의 일부 속성을 사용하려고 하면 런타임 예외인 NullPointerException이 발생합니다 . null 참조가 우리가 참조하는 유형이 아니고 예상되는 속성이 없기 때문에 발생합니다 .

String name = null;
name.toLowerCase(); // will cause exception at runtime

Java 14 이전에는  NullPointerExceptions 가 짧았으며 단순히 코드의 어느 줄에서 오류가 발생했는지 명시했습니다. 라인이 복잡하고 일련의 호출이 있는 경우 해당 정보는 유익하지 않습니다. 그러나 Java 14부터는 소위 Helpful NullPointerExceptions 에 의존할 수 있습니다 .

6. 결론

이 기사에서는 null 유형이 작동하는 방식을 자세히 살펴보았습니다 . 먼저 유형을 정의한 다음 null 유형이 해당 정의에 어떻게 부합하는지 찾았습니다. 마지막으로 null 참조를 다른 참조 유형으로 캐스팅하여 우리가 알고 사용하는 도구로 만드는 방법에 대해 배웠습니다 .

Generic footer banner