Variable

A Variable, 즉 변수는 프로그램이 실행되는 동안 값을 보유하는 컨테이너이다. 변수 명은 해당 메모리에 대한 위치 이름이다.


Variable 은 세가지의 종류가 있다.

  1. Local Variable

  2. Instance Variable

  3. Static Variable

1) Local Variable
  • Local Variable 은(는) 우리말로 지역변수라고 한다. 
  • 지역변수는 클래스 내부의 생성자 혹은 메소드 그리고 어느 코드블럭 내부에서 선언된다. 
  • 지역변수는 자바 스택 메모리의 내부에 구현되고 이후 해당 코드블럭이 끝나면 삭제된다.
  • 지역변수는 기본 값이 없으므로 사용하기 위해서는 초기화를 하여야한다.
2) Instance Variable 

  • Instance Variable 은(는) 클래스 내부에 선언되어 있으며 그 외의 코드블럭(메소드, 생성자)내부에는 존재하지 않는 것을 의미한다. 이 변수는 static 변수 (정적변수)로 선언되어 있지 않다.
  • 힙에 해당 오브젝트에 대한 공간이 할당되면 (해당 클래스) 각각의 인스턴스 변수 값에 대한 슬롯이 생성된다.
  • 인스턴스 변수는 new 라는 키워드를 사용하여 객체를 생성하며 객체가 삭제될 때까지 계속 값이 유지된다.
  • 인스턴스 변수는 접근지정자 지정이 가능하다. (private, protected, public)
  • 인스턴스 변수에 접근지정자를 이용하여 서브 클래스에 대한 참조 여부를 결정할 수 있다.
  • 인스턴스 변수는 기본 값이 있으며, 숫자의 경우 0, 부울 값 false, 객체의 참조 값은 null 이다.
3) Static Variable
  • Static Variable 은(는) static 으로 선언된 변수를 의미한다. Local Variable 에 static 변수를 붙일 수 없다. 붙이면 컴파일 에러가 발생한다.
  • 클래스에서 생성된 객체의 수에 관계없이 클래스 당 각 클래스 변수의 복사본 하나만 존재한다.
  • 정적변수는 static memory에 저장된다.
  • 정적변수는 프로그램이 시작되고 이후 이후 끝날 때 사라진다.
  • 기본값은 Instance Variable == Static Variable 동일하다.
  • 정적변수는 ClassName.VariableName 을 호출하여 액세스 할 수 있다.

예시

- LocalVariable & InstanceVariable & Static Variable 초기화 값 확인하기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class VariableType {
    static int staticVariable;
    int instanceVariable;
    
    public static void main(String[]args){
        VariableType vt = new VariableType();
        vt.printVariable();
    }
    
    public void printVariable(){
        int localVariable;
        
        System.out.println(staticVariable);
        System.out.println(instanceVariable);
//        - 초기화하지 않더라도 초기화가 되어있는 상태
//        >> 0
//        >> 0
        
        /**
         * [ 컴파일 에러  ]
         * - LocalVariable cannot be resolved to a variable
         * **/
        System.out.println(LocalVariable);
    }
}
cs


예시 2

- Static Variable 출력 내용 확인 (모든 객체가 정적변수를 공유)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class VariableType {
    static int staticVariable;
    
    public static void main(String[]args){
        VariableType vt = new VariableType();
        VariableType vt2 = new VariableType();
        VariableType vt3 = new VariableType();
        VariableType vt4 = new VariableType();
        VariableType vt5 = new VariableType();
        
        System.out.println(vt.staticVariable++);
        System.out.println(vt2.staticVariable++);
        System.out.println(vt3.staticVariable++);
        System.out.println(vt4.staticVariable++);
        System.out.println(vt5.staticVariable++);
        
//        -- 객체의 수에 관계없이 딱 하나만 존재.
//        >> 0
//        >> 1
//        >> 2
//        >> 3
//        >> 4
    }
}
cs


예시 3

리플렉션을 이용한 해당 클래스와 정적변수, 인스턴스변수에 대한 타입과 이름을 확인할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package JavaBasic;
 
import java.lang.reflect.Field;
 
public class VariableType {
    static int staticIntegerVariable;
    int instanceIntegerVariable;
    static String staticStringVariable;
    
    public static void main(String[]args){
        
        Field[] f = new VariableType().getClass().getDeclaredFields();
        
        System.out.println("==================   타입과 값 확인      ==================\n");
        
        (1) System.out.println(f[0].getType() + " : " + f[0].getName());
        (2) System.out.println(f[1].getType() + " : " + f[1].getName());
        (3) System.out.println(f[2].getType() + " : " + f[2].getName());
        
        System.out.println("\n====================================================\n");
        
        (4) System.out.println(f[0].getDeclaringClass());
    }
}
 
// ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
// [                         출력값                      ]           
// ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
 
==================   타입과 값 확인      ==================
 
(1) int : staticIntegerVariable
(2) int : instanceIntegerVariable
(3) class java.lang.String : staticStringVariable
 
==========================================================
 
(4)class JavaBasic.VariableType
cs



reference

https://java-latte.blogspot.com/2014/01/global-variable-vs-class-variable-vs.html

Posted by doubler
,