클라우드 낚시꾼

[JAVA 자바] 변수의 종류와 초기화 + Null 본문

Programming Language/JAVA

[JAVA 자바] 변수의 종류와 초기화 + Null

KanuBang 2023. 12. 31. 17:18
728x90

이 글에서는 JAVA에서 변수의 종류와 초기화, Null에 대해 알아볼 것이다. 


변수의 종류

 

변수의 종류

 

자바에서는 변수의 선언 위치가 변수의 종류를 결정한다.

  1. 멤버 변수 = 클래스 영역에서 선언된 변수
    • 클래스 변수 = static 키워드가 있고, 클래스가 메모리에 올라갈 때 생성
    • 인스턴스 변수 = static 키워드가 없고, 클래스로부터 인스턴스가 생성될 때 생성
  2. 지역 변수 = 블럭 내부에서 선언된 변수
    • 변수 선언문이 수행되었을 때 생성
    • 매개변수도 지역 변수다

클래스 변수와 인스턴스 변수

public class Student {
// 클래스 변수
    static int amountOfStudent; // 학생의 수
// 인스턴스 변수
    String name;
    int age;
    int grade;
}
  1. 클래스 변수
    • 저장공간의 특성: 모든 인스턴스가 공통 저장공간을 공유한다.
    • 쓰임새: 모든 인스턴스가 공유하는 특성을 나타낼 때 사용한다.
  2. 인스턴스 변수
    • 저장공간의 특성: 각 인스턴스 별로 독립적인 저장공간이 있다.
    • 쓰앰새: 인스턴스의 고유 특성을 나타낼 때 사용한다.

위 코드에서 학생의 이름, 나이, 성적은 학생의 고유 특성이기에 인스턴스 변수로 선언했다. 인스턴스 변수 덕분에 학생1, 학생2, 학생3의 이름, 나이, 성적 정보를 개별적으로 관리할 수 있게 되었다.

반면, 학생의 수는 모든 인스턴스가 공유하는 특성이기 때문에 클래스 변수로 선언했다. 클래스 변수 덕분에 학생 객체를 생성할 때마다 amountOfStudent를 증가시켜서 학생의 총 수를 추적하는 데 사용할 수 있게 되었다.


변수의 초기화

 

변수의 초기화 특성

 

  1. 멤버 변수
    • 멤버 변수는 생성될 때 자동으로 타입의 Default Value로 초기화되기 때문에 초기화가 필수는 아니다.
    • Default Value의 대표적인 예시로는 int 0, 참조형 NULL, boolean False 등이 있다.
  2. 지역 변수
    • 지역 변수는 초기화 되지 않으면 "variable might not have been initialized" 에러가 발생한다.
    • 지역 변수는 반드시 개발자가 선언함과 동시에 초기화 해야 한다.

NULL과 가비지 컬렉션(GC)

 

NULL과 가바지 컬렉션

 

NULL이란 값은 아직 존재하지 않고 비어 있음을 나타낸다. 특히, 참조형 변수에게 있어서 NULL은 참조형 변수가 아직 가리키는 대상이 없다라는 의미를 내포하도록 도와주었다. 이는 참으로 참조형 변수 입장에서 고마운 일이다. 왜냐하면, 참조형 변수가 아직 마땅히 가르키는 대상이 없다고 해서 무작위로 어떤 참조값(주소)를 할당하는 것은 진정으로 "아무 것도 가르키지 않는 상태"가 아니기 때문이다.

다음으로, 위 예시를 살펴보자. 위 예시에서는 Data 클래스 타입 data 참조변수가 x001이라는 참조값을 저장하고 있다가 null을 할당 받게되어 아무것도 가르키지 않는 상태가 되었다. 그 결과 x001 주소에 저장되어 있는 Data 인스턴스는 주인 없는 낙동강 오리알 신세가 되었다. 아무도 참조하지 않게 된 인스턴스는 더 이상 참조될 수 없기 때문에 사용되지 않고 메모리 용량만 차지할 뿐이다. 이렇게 되면 메모리 누수(메모리 부족 오류)와 같은 심각한 문제가 발생할 수 있다. 하지만, 자바에서는 JVM의 가비지 컬렉션(GC)이 이러한 주인 없는 낙동강 오리알 인스턴스를 알아서 청소해주기 때문에 개발자가 직접적으로 신경 쓸 필요가 없다.

다시 한번 정리하자면, 객체는 해당 객체를 참조하는 곳이 있으면, JVM이 종료할 때 까지 계속 생존한다. 그런데 중간에 해당 객체를 참조하는 곳이 모두 사라지면 그때 JVM은 필요 없는 객체로 판단다고 GC(가비지 컬렉션)를 사용해서 제거한다.


NullPointerException

public class NullMain2 {
    public static void main(String[] args) {
        Data data = null;
        data.value = 10; // Dereference of 'data' will produce 'NullPointerException'
        System.out.println("data = " + data.value); //java.lang.NullPointerException
    }
}

 

NullPointerException이란 참조변수의 참조값이 NULL이라서 찾아갈 수 있는 객체(인스턴스)가 없는데, dot(.)으로 접근을 시도할 때 발생하는 에러다.

예시 코드에서 data는 null이기 때문에 data.value = null.value가 된다. 참조할 객체(인스턴스)가 없는 상태에서 접근을 시도하니java.lang.NullPointerException 예외가 발생하고 예외가 처리되지 않는 한 다음 코드는 실행되지 않고 종료된다.


참고 및 출처

이 글은 김영한 님의 "실전 자바 - 기본편"을 듣고 작성했습니다.

 

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

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

www.inflearn.com

 

 

728x90