클래스를 만들고 클래스의 인스턴스를 만들 때 해당 클래스의 멤버 변수는 값이 어떻게 들어갈까? 예를 들어 다음 코드를 보자.
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을 넣게 된다. 그래서 가리키는 대상이 누군지 모르는데 어떻게 이름을 찾느냐? 라는것이다.
'JAVA의 가장 기본이 되는 내용' 카테고리의 다른 글
생성자 - this()와 오버로딩 (0) | 2024.03.26 |
---|---|
객체 지향 프로그래밍 (0) | 2024.03.26 |
Null / GC (Garbage Collection) (0) | 2024.03.25 |
형변환, 형변환 시 오버플로우, 연산 시 형변환 (0) | 2024.03.25 |
JAVA는 항상 변수의 값을 복사해서 대입한다. (0) | 2024.03.25 |