IT/Java

[Java] null / NullPointerException

Huitopia 2024. 2. 26. 10:52
728x90

null

참조 타입 변수는 아직 번지를 저장하고 있지 않다는 뜻으로 null 값을 가질 수 있다. 초기값으로 사용할 수 있어 null로 초기화된 참조 변수는 스택 영역에 생성된다.

String val1 = "Java";
String val2 = null;

 

변수가 null 값을 가지는지 확인하려면 ==, != 연산을 수행할 수 있다.

val1 == null // false
var1 != null // true

 

NullPointerException

자바는 프로그램 실행 도중 발생하는 오류를 예외(Exception)라고 부르며, 참조 변수를 사용하며 가장 많이 발생하는 예외 중 하나는 NullPointerException이다. 변수가 null인 상태에서 객체의 데이터나 메소드를 사용할 때 예외가 발생한다.

int[] intArray = null;
intArray[0] = 10; // nullPointerException

intArray는 배열 객체가 없으므로 10을 저장할 수 없어 nullPointerException 예외가 발생한다.

예외가 발생된 곳에서 null인 상태의 참조 변수가 사용되고 있음을 알고, 참조 변수가 객체를 정확히 참조하도록 번지를 대입해야한다.

 

String val = "자바";
val = null;

참조 타입 변수에 일부러 null을 대입 할 수도 있다. 변수에 null을 대입하면 번지를 잃어 객체를 사용할 수 없다.

어떤 변수에서도 객체를 참조하지 않으면 해당 객체는 프로그램에서 사용할 수 없는 객체이다. 힙 메모리에는 있지만, 위치 정보를 모르기 때문에 사용할 수 없다. 자바는 이런 객체를 쓰레기로 취급하고, 쓰레기 수집기(Garbage Collector)를 실행시켜 자동으로 제거한다.

 

예제 코드

    public static void main(String[] args) {
        String hobby = "여행";
        hobby = null;
        System.out.println("hobby = " + hobby); // null

        String kind1 = "자동차";
        String kind2 = kind1;
        kind1 = null;
        System.out.println("kind1 = " + kind1); // null
        System.out.println("kind2 = " + kind2); // 자동차
    }

kind1 변수에 null을 대입해도 "자동차"에 해당하는 String 객체가 쓰레기가 되지는 않는다. kind2 변수는 여전히 "자동차"를 참조하기 때문이다.

 

 

 

728x90