null은 왜 "모든 참조 타입의 하위"로 간주되는가?

2025. 4. 30. 16:10High Level Programming Language/Learning the Java Language

자바에서 흔히 "null은 모든 참조 타입의 하위 타입(subtype)"이라고 표현하는 이유는, 타입 계층 상의 직접적인 '하위 클래스'라는 뜻이 아니라, 타입 시스템에서 null 값이 모든 참조형 변수에 대입될 수 있기 때문입니다.
즉, null은 특별한 리터럴로, 참조형 타입의 모든 변수에 할당할 수 있는 공통의 "값"이기 때문입니다.

 

null은 왜 "모든 참조 타입의 하위"로 간주되는가?

🔹 자바 타입 시스템 관점에서

  • 자바에서는 기본 타입(primitive type)을 제외한 모든 클래스, 배열, 인터페이스는 참조 타입(reference type)입니다.
  • null은 이들 모든 참조 타입 변수에 할당할 수 있는 유일한 값입니다.
String s = null;
Number n = null;
List<String> list = null;
Object obj = null;
Runnable r = null;

위 모든 문장은 문제 없이 컴파일됩니다. 이 말은 곧 null이 모든 참조 타입의 값 공간(value space)에 포함된다는 뜻이고,
타입 이론 상에서 이를 모든 참조 타입의 공통된 하위 타입으로 취급합니다.

 

✅ JVM 관점에서의 정리

  • null은 실제 메모리에 객체를 참조하지 않는 상태입니다.
  • 내부적으로는 특정 주소(대개 0 또는 특별한 null 표시값)를 참조로 저장하고 있음
  • 어떤 타입의 레퍼런스 변수든 null이라는 동일한 메모리 상태를 가질 수 있기 때문에 호환성 상의 최하위로 간주됩니다.

 

✅ 자바 컴파일러 입장에서

  • 다음 코드는 모두 유효합니다:
String s = null;
Object o = null;
Runnable r = null;
  • 하지만 다음은 에러입니다:
int i = null;  // ❌ 기본 타입에는 null 할당 불가

이는 null참조 타입 전용 값임을 명확히 보여주며, 따라서 null은 참조 타입 계층 내에서 공통적으로 호환 가능한 하위 값입니다.

 

🔎 타입 이론의 표현

타입 이론에서는 nullBottom Type 또는 null type이라 부르며,
이는 "모든 참조 타입의 하위 타입"으로 간주됩니다.

 

✅ 결론

  • null은 자바 타입 시스템에서 "모든 참조 타입의 하위 타입"처럼 작동합니다.
  • 이것은 형식적으로 상속 구조를 따른다는 의미가 아니라,모든 참조 타입 변수에 null을 대입할 수 있다는 점에서 하위 호환 타입(substitutable type)으로 취급된다는 뜻입니다.