처음부터 차근차근

[Java] 변수와 초기화, null, null 본문

Language/Java

[Java] 변수와 초기화, null, null

HangJu_95 2023. 12. 21. 23:08
728x90

Java 변수의 종류

  • 멤버 변수(필드) : 클래스에 선언합니다
  • 지역 변수 : 메서드에 선언, 매개변수도 지역 변수의 한 종류입니다.
    • 지역 변수는 이름 그대로 특정 지역에서만 사용되는 변수라는 의미입니다.

(왜 전역 변수가 없을까..)

멤버 변수, 필드 예시

public class Student {
    String name;
    int age;
    int grade;
}

지역 변수 예시

public class Method1 {
    public static void main(String[] args) {
        Student student1 = new Student();
    }
}
static void initStudent(Student student, String name, int age, int grade) {
    student.name = name;
    student.age = age;
    student.grade = grade;
}

변수의 값 초기화

  • 멤버 변수 : 자동으로 초기화가 됩니다.
    • 인스턴스의 멤버 변수는 인스턴스를 생성할 때 자동으로 초기화됩니다.
    • int = 0 / boolean = false / 참조형 - null
    • 개발자가 초기값을 직접 지정할 수 있습니다.
public class InitData {
    int value1; // 초기화 하지 않음
    int value2 = 10; // 10으로 초기화
}
public class InitMain {
    public static void main(String[] args) {
        InitData data = new InitData();
        System.out.println("value1 = " + data.value1);
        System.out.println("value2 = " + data.value2);
    }
}
value1 = 0
value2 = 10

value1은 초기값을 지정하지 않았지만 멤버 변수는 자동으로 초기화 되기 때문에 0, value2는 초기값을 10으로 지정해뒀기 때문에 10이 출력됩니다.

null

null : 값이 존재하지 않는, 없다는 뜻을 의미합니다.

package ref;

public class Data {
    int value;
}
package ref;

public class NullMain1 {
    public static void main(String[] args) {
        Data data = null; // 아직 가리키는 객체가 없다.
        System.out.println("1. data = " + data);
        data = new Data(); // 새로운 객체를 할당
        System.out.println("1. data = " + data);
        data = null; // Data 인스턴스를 더 이상 참조하지 않는다.
        System.out.println("1. data = " + data);
    }
}

Data 타입을 받을 수 있는 참조형 변수 data에 null 값을 할당하면, 변수에는 아직 가리키는 객체가 없다는 뜻을 의미합니다.

Garbage Collection

data에 null을 할당하면 앞서 생성한 Data의 인스턴스는 더이상 아무도 참조하지 않습니다.

이렇게 아무도 참조하지 않게되면 해당하는 인스턴스의 참조값을 다시 구할 방법이 없습니다. 따라서 해당 인스턴스에는 다시 접근할 방법이 없죠.

이렇게 아무도 참조하지 않는 인스턴스는 사용되지 않고 메모리 용량만 차지할 뿐이며, JVM의 GC가 더 이상 사용하지 않는 인스턴스라고 판단하고 해당 인스턴스를 자동으로 메모리에서 지워줍니다.

그러나 참조하는 곳이 있으면 JVM이 종료할 때까지 계속 생존합니다.

NullPointerException

이 예외처리는 말 그대로, null을 가리키다(pointer)인데, 이때 발생하는 예외입니다.

주소가 없는 곳을 찾아갈 때 발생하는 예외처리입니다.

package ref;

public class NullMain2 {
    public static void main(String[] args) {
        Data data = null;
        // 주소가 없기 때문에 에러 발생
        data.value = 10; // NullPointerException 예외 발생
        System.out.println("data = " + data.value);
    }
}

멤버 변수와 null

기존의 data 클래스를 사용하고, 해당하는 클래스를 사용하는 BigData 클래스를 만들어보겠습니다.

package ref;

public class Data {
    int value;
}
package ref;

public class BigData {
    Data data; // 초기화 시 null이 들어간다.
    int count; // 자동 초기화 -> 0
}
package ref;

public class NullMain3 {
    public static void main(String[] args) {
        BigData bigData = new BigData();
        System.out.println("bigData.count=" + bigData.count);
        System.out.println("bigData.data=" + bigData.data);
        //NullPointerException
        System.out.println("bigData.data.value=" + bigData.data.value);
    }
}

bigData의 인스턴스를 생성하였고, 이때 멤버 변수는 초기화가 일어납니다.

이때 BigData의 data 멤버 변수는 참조형이므로 null로 초기화됩니다. 따라서 bigData.data가 null을 가리키기 때문에 value 값을 찾으려고 하면 nullPointerException이 발생합니다.

이를 해결하기 위해서는 bigData.data 멤버 필드에 참조값을 할당하면 됩니다.

package ref;

public class NullMain4 {
    public static void main(String[] args) {
        BigData bigData = new BigData();
        bigData.data = new Data();
        System.out.println("bigData.count=" + bigData.count);
        System.out.println("bigData.data=" + bigData.data);
        System.out.println("bigData.data.value=" + bigData.data.value);
    }
}

참조

 

김영한의 실전 자바 - 기본편 강의 - 인프런

실무에 필요한 자바 객체 지향의 핵심 개념을 예제 코드를 통해 쉽게 학습합니다., 국내 개발 분야 누적 수강생 1위, 제대로 만든 김영한의 실전 자바[사진][임베딩 영상]단순히 자바 문법을 안다

www.inflearn.com

 

'Language > Java' 카테고리의 다른 글

[Java] 생성자, this  (1) 2023.12.26
[Java] 객체 지향 프로그래밍  (1) 2023.12.24
[Java] 기본형과 참조형  (1) 2023.12.21
[Java] Class와 데이터  (1) 2023.12.21
[Java] Method  (1) 2023.12.15