Post

변수

변수

데이터를 저장하기 위해 프로그램에 의해 할당받은 메모리 공간을 의미한다.

변수는 변수가 선언된 위치에 따라 세가지 종류로 나뉜다.

변수의 종류선언 위치생성 시기 (메모리 할당 시기)
클래스 변수클래스 영역클래스가 메모리에 올라갈 때
인스턴스 변수클래스 영역인스턴스가 생성될 때
지역 변수클래스 이외의 영역 (메서드, 생성자, 초기화 블럭)변수 선언문이 수행 되었을 때
1
2
3
4
5
6
7
8
public class Test{
  int iv; // 인스턴스 변수.
  static int cv; // 클래스 변수.
  
  void print(){
    int lv; // 지역 변수. 
  }
}

인스턴스 변수

  • 인스턴스가 생성될 때, 생성된다. 따라서 인스턴스 변수를 사용하기 전에 먼저 객체를 생성해야 한다.
  • 인스턴스 변수는 독립적인 저장공간을 가지므로 인스턴스 별로 다른 값을 가질 수 있다.
  • 따라서 각 인스턴스마다 고유의 값을 가져야 할 때는 인스턴스 변수로 선언한다.
  • 가비지가 되었을 때, gc가 가비지를 수거할 때 사라진다.

클래스 변수

  • static 키워드가 붙은 변수이다.
  • 클래스 변수는 해당 클래스의 모든 인스턴스가 공통된 값을 공유한다.
  • 인스턴스 변수의 접근법과 다르게 인스턴스를 생성하지 않고 클래스이름.클래스변수명 을 통해서 접근할 수 있다.
  • 클래스 파일을 읽어들이고 로더가 올릴 때, 메모리에 올라가며 프로그램이 종료될 때 사라진다.

지역 변수

  • 메서드 내에서 선언되며 메서드 내에서만 사용할 수 있는 변수이다.
  • 메소드가 실행될 때, 메모리를 할당받으며 메소드가 끝나면 소멸되어 사용할 수 없게 된다.

메모리의 공간은 크게 method (static) 영역, stack 영역, heap 영역으로 구분되고 변수는 선언 위치에 따라 jvm 메모리 내 할당 받는 영역이 나뉜다.

변수의 종류메모리 할당 위치
인스턴스 변수heap 영역
클래스(static) 변수method (static) 영역
지역 변수stack 영역

이해하기 쉽운 예제

ex

1
2
3
4
5
6
7
8
9
10
11
12
13
class My_Obj {
    int iv;
    static int cv;
}
public class Main {
    public static void main(String[] args) {
        My_Obj a = new My_Obj();
        a.iv = 2; a.cv = 1;
        
        My_Obj b = new My_Obj();
        b.iv = 5; b.cv = 5;
    }
}

이 경우 iv는 인스턴스 변수이므로 heap 영역에 올라가며 a.iv와 b.iv는 별개의 공간에 있다. cv는 클래스(static) 변수 이므로 method 영역에 올라가며 a와 b가 같은 값을 공유한다.

This post is licensed under CC BY 4.0 by the author.