JAVA 변수의 종류

kmb·2022년 1월 12일
0

자바

목록 보기
5/31
post-thumbnail

1. 데이터 타입(메모리에 저장되는 방식)에 따른 분류

 
1) 기본형(Primitive Type) 변수

실제 값을 저장하며, null로 초기화 할 수 없다.

논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double) 으로 구분된다.

 
2) 참조형(Reference Type) 변수

8가지 기본형(primitive type) 변수를 제외한 나머지 (클래스, 인터페이스, 배열, 열거 타입) 변수.

메모리 스택(stack) 영역에 실제 값이 저장되지 않으며 자료가 저장된 공간의 참조값(주소값)을 저장.

메모리 힙(heap) 영역에 실제 값을 저장.

참조형 변수는 null로 초기화 가능.

 

기본형(Primitive Type) 변수와 참조형(Reference Type) 변수의 차이점

 
1. 컴파일 되었을때 기본형 변수는 크기가 정해져 있고, 참조형 변수는 크기가 정해져 있지 않다.

// 예시
int num;  //  기본형(Primitive Type) 변수. --> 변수 선언 (메모리에 할당되지 않은 상태)

int num = 10;  // 기본형(Primitive Type) 변수. -->  변수 초기화 (메모리에 할당된 상태)

MyData md = new MyData();  // 참조형(Reference Type) 변수

기본형 변수 num은 10이라는 크기가 정해져있지만, 참조형 변수인 md는 크기를 알 수 없다.

참조형 변수중 하나인 클래스에서 사용자가 임의로 만든 커스텀 타입은 처음에 크기를 알 수 없다.
(컴파일 될때 크기를 알 수 없고, 프로그램이 실행(Runtime)되면 그때서야 크기를 알 수 있다.)

 
2. 기본형 변수을 가지고 있고, 참조형 변수주소를 가지고 있다.

왜? 위에서 말했듯이 기본형 변수는 컴파일 되었을때 크기를 알 수 있지만 참조형 변수는 컴파일 되었을때 크기를 알 수 없기 때문이다.

더 이해가 쉽도록 아래 그림을 참고

기본형 변수 num은 stack 영역에 10이라는 을 가지고있고
참조형 변수 md는 stack 영역주소값을 가지고있고 heap 영역에 해당 주소값 및 실제 값을 가진다.

이때 커스텀 타입(사용자가 임의로 만든 클래스)은 프로그램이 실행(Runtime)되면 항상 4Byte의 크기를 갖고있다.


2. 선원 위치에 따른 분류

 
멤버변수
클래스 영역에 선언되는 변수. (heap, static 영역에 저장된 변수)
클래스 변수인스턴스 변수를 통칭하는 단어.

heap 영역에서는 new 연산자를 이용해서 메모리에 할당된다. 더이상 참조하지 않을때 메모리에서 사라진다.

static 영역에서는 main 메서드가 실행되기 전에 메모리에 할당된다. main 메서드가 종료되면 메모리에서 사라진다.

생명주기(메모리에 있는 시간)는 static, heap 영역에 있는 전역변수가 길고 stack 영역에 있는 지역변수가 짧다.

 
1. 인스턴스변수 (instance variable)

클래스 영역에 선언, 사용하기 위해서는 인스턴스를 먼저 생성해야 한다.
인스턴스는 독립적인 저장공간을 가지므로 서로 다른 값을 가질 수 있다.

 
2. 클래스변수 (class variable)

인스턴스 변수 앞에 static을 붙이면 된다. 클래스변수는 인스턴스를 생성하지 않고도 언제든지 사용할 수 있다. 클래스변수는 클래스가 메모리에 '로딩(loading)' 될 때 생성되어 프로그램이 종료될 때까지 유지된다.

 
3. 지역변수(local variable)

stack 영역에 저장된 변수이다.
메서드 내에 선언되며 메서드가 실행될 때 메모리에 할당된다.
메서드가 종료될 때 메모리에서 사라진다. 즉 사용할 수 없다.

 

변수 종류선언 위치생성 시기
클래스 변수 (class variable)클래스 영역클래스가 메모리에 올라갈 때
인스턴스 변수 (instance variable)클래스 영역인스턴스가 생성되었을 때
지역 변수 (local variable)클래스 이외의 영역변수 선언문이 수행되었을 때

 

public class Test {
	
    static int sum = 20;  // 클래스 변수
    int value = 50;       // 인스턴스 변수
    
   
    static void a() {
    	
        int n1 = 1;				 // 지역변수 (a메서드의 stack영역에 저장)
        System.out.println(n1);  // 출력 불가능
    }
    
    public static void main(String[]args) {
    	
        a();   // System.out.println(n1); 출력 불가능
        
        System.out.println(sum);  // 출력 가능
        
        Test t = new Test();		  // Test 클래스내의 static 영역을 제외한 모든것이 heap영역에 저장.
        System.out.println(s.value);  // 출력 가능
    }
}

 

출처 : 이지업 컨텐츠 내의 데어프로그래밍 자바강의

profile
꾸준하게

0개의 댓글