[JVM] 인스턴스 변수는 초기화를 안 해도 되지만 지역 변수는 초기화해야만 하는 이유 본문

백앤드 개발일지/자바

[JVM] 인스턴스 변수는 초기화를 안 해도 되지만 지역 변수는 초기화해야만 하는 이유

giron 2024. 8. 9. 01:10
728x90

인스턴스 변수 (Instance Variable)

  • 각 객체가 독립적으로 가지는 변수, 객체의 상태 표현
  • 각 객체간 독립적이다.

클래스 변수 (Class Variable)

  • static을 사용한 정적 변수, 클래스의 상태 저장
  • 모든 객체가 클래스 변수를 공유한다.

지역 변수 (Local Variable)

  • 메서드나 블록 안에서 선언되는 변수
  • 해당 블록 안에서만 사용 가능
  • 기본값이 없어서 반드시 초기화하고 사용해야 함

인스턴스 변수와 클래스 변수의 초기화

그렇다면 초기화하지않고 선언만 해주었을때 아래의 코드의 결과는 무엇이 나올까요? 

public class VariableTest {
    static int a; // 클래스 변수
    int a; // 인스턴스 변수
    public static void main(String[] args) {
    	int k=4; // 지역 변수
        System.out.println(a);
    }
}

결과

결과는 0이 나옵니다. 만약 String 객체로 바꾼다면 null이 나오게 됩니다.

그렇다면 지역 변수로 바꾸면 어떻게 나올까요?

결과

네 초기화가 되어있지 않아서 컴파일에서 에러가 나옵니다.

그렇다면 클래스/인스턴스 변수는 초기화를 하지 않아도 자동으로 할당이 되는데, 지역 변수는 자동으로 초기화를 시켜주지 않는 이유가 무엇일까요?

이는 클래스가 초기화 되는 방식의 차이입니다.

 

클래스 변수와 달리 지역 변수는 '준비'단계가 없습니다. 사실 클래스 변수는 초깃값이 두 번 할당됩니다.

1. 준비 단계에서는 시스템 초깃값이 자동으로 할당된다. ( o, 0.0, null, false ) -> 클래스/인스턴스 변수 초기화

2. 초기화 단계에서는 개발자가 정의한 초깃값이 할당된다. -> 클래스/인스턴수 변수 와 지역 변수 초기화

 

따라서 자바 코드로 초기화를 안시켜도 클래스 변수에는 명확한 초깃값이 할당되어 있기에 특이사항이 없습니다. 하지만 지역 변수는 '준비' 단계가 없기때문에 시스템 초깃값이 자동으로 할당되어있지 않아 컴파일에서 걸러내는 것입니다.

 

마지막으로 정리하자면 클래스 로드는 5 단계로 나뉩니다.

로딩 -> 검증 -> 준비 -> 해석 ->초기화

여기서 준비클래스 변수를 메모리에 할당하고 초깃값을 설정하는 단계입니다.

1. 지역 변수가 아닌 클래스 변수만 할당하며, 지역 변수는 객체가 인스턴스화될때 객체와 함께 자바 힙에 할당된다.

2. 클래스 변수에 할당하는 초깃값은 해당 데이터 타입의 제로값이다.

따라서 데이터 저장 공간이 다르기에 처리하는 방식도 다른 이유에서 발생한 경우였습니다.

 

728x90
Comments