2014년 9월 30일

자바에서 NULL 의 정체

String x = null ;

위 코드는 정확하게 무엇을 하는가?

잠시 변수(variable)와 값(value)의 의미를 상기해보자. 흔히,  변수(variable)를 상자로 비유한다. 상자를 사용하여 무엇인가를 보관할 수 있는 것 처럼, 변수를 사용하여 값을 보관할 수 있다.
그림 1. 상자와 물건들

변수를 사용하려면 선언(deciaration)이 필요한데, 반듯이 선언하는 변수의 테이터 종류(data type)을 지정하여야 한다.

자바에서 데이터 종류는 크게 자바 언어 자체에 정의된 기본 타입(primitive type)과 객체를 가르키는 참조 타입(reference type) 로 분류된다. 기본 타입(primitive type)으로 선언된 변수는 값을 보관하고, 참조 타입(reference type)으로 선언된 변수는 객체을 가리키는 주소 역할을 하는 레퍼런스(reference) 을 보관한다.

 위 코드의 경우, 변수 "x" 를 선언한다. 변수 "x" 는 String 레퍼런스을 보관한다. 여기에서는 null 으로 초기화 되었다.
그림 2. 코드 도식화

NULL 은 메모리 어디에 위치하는 가?

무엇보다도 null 은 유효한 객체 인스턴스가 아니기 때문에, 할당되는 메모리 공간이 없다. null 은  레퍼런스가 현재 가리키는 객체가 없음을 의미한다.


참고로 null 은 값이 없기 때문에 기본 타입 변수에는 사용할 수없다.

NULL 은 필요한가 ?

이 부분에 있어서는 많은 논쟁이 있는것 같다.어떤 이들은 null 은 피할 수 없는 많은 에러를 유발한다고 말한다. 어떤 이들은 자바와 같이 "NullPointerExecption" catch를 지원하는 언어에서, 개발자 오류들을 fail-fast(1) 을 할 수 있어 좋은 것이라고 말한다.어떤 이들은 "Null object parrern" 을 사용하면 null 을 피할 수 있다고 말한다.

참고로 처음으로 null 고안한 C.A.R Hoare 는 "10억불 짜리 실수" 였다고 고백했다.

I call it my billion-dollar mistake. It was the invention of the null reference in 1965. At that time, I was designing the first comprehensive type system for references in an object oriented language (ALGOL W). My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.

Null References: The Billion Dollar Mistake 비디오

참고 자료

What exactly is null in Java?
Incorrect Core Java Interview Answers
What is null in Java?


1. 순차적 접근에 실패하면 예외를 발생하도록 되어 있는 방식을 fail-fast 라고 한다

댓글 없음:

댓글 쓰기