JAVA의 가장 기본이 되는 내용

NullPointerException

cwchoiit 2024. 3. 25. 21:13
728x90
반응형
SMALL

클래스를 만들고 클래스의 인스턴스를 만들 때 해당 클래스의 멤버 변수는 값이 어떻게 들어갈까? 예를 들어 다음 코드를 보자.

public class Student {
    private String name;
    private int grade;
    
    public Student() {
    }

    public Student(String name, int grade) {
        this.name = name;
        this.grade = grade;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }
}

 

Student 클래스가 있고 이 클래스의 객체 하나를 만들어보자. 

Student student = new Student();

 

이 인스턴스(객체)가 가지고 있는 멤버 변수들은 어떤 값을 가지는지 출력해보자.

public class StudentMain {
    public static void main(String[] args) {
        Student student = new Student();
        System.out.println("student name = " + student.getName());
        System.out.println("student grade = " + student.getGrade());
    }
}

 

출력 결과는 다음과 같다.

student name = null
student grade = 0

 

이렇듯, 클래스를 만들고 그 클래스의 객체를 만들 때 멤버 변수에 값을 집어 넣지 않으면 다음과 같이 초기화 값이 들어가게 된다. 숫자는 0으로 초기화가 되고 그 외 참조변수는 null이 들어간다. (String도 참조 변수다)

 

그럼 다음 클래스를 하나 더 만들어보자.

public class Department {
    private String name;
}

 

그리고 Student 클래스의 멤버 변수로 이 클래스를 넣어보자.

public class Student {
    private String name;
    private int grade;
    private Department department;

    public Student() {
    }

    public Student(String name, int grade, Department department) {
        this.name = name;
        this.grade = grade;
        this.department = department;
    }
    
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getGrade() {
        return grade;
    }

    public void setGrade(int grade) {
        this.grade = grade;
    }

    public Department getDepartment() {
        return department;
    }

    public void setDepartment(Department department) {
        this.department = department;
    }
}

 

이 상태에서도 위에서 생성한 인스턴스와 마찬가지로 Student 객체를 만들어보자.

Student student = new Student();

 

그리고 이렇게 실행해보자.

public class StudentMain {
    public static void main(String[] args) {
        Student student = new Student();
        System.out.println("student name = " + student.getName());
        System.out.println("student grade = " + student.getGrade());
        System.out.println("student department = " + student.getDepartment());
    }
}

 

출력 결과는 다음과 같다.

student name = null
student grade = 0
student department = null

 

Deparment 타입의 department, String 타입의 name 모두 참조변수이므로 null로 초기화된다. 그럼 여기서 이런 코드를 작성하면 어떻게 될까?

System.out.println("student department = " + student.getDepartment().getName());

 

여기서 NullPointerException이 발생한다. 그 이유는 student.getDepartment()가 null인데 null.getName()을 하면 당연히 어떤 주소의 객체에 해당하는 name을 가져와야 하는지 자바입장에서는 모르기 때문이다. 이게 NullPointerException이다. 이전 포스팅에서도 봤지만 null은 현재 가리키는 대상이 없을 때 주소대신 null을 넣게 된다. 그래서 가리키는 대상이 누군지 모르는데 어떻게 이름을 찾느냐? 라는것이다.

 

728x90
반응형
LIST