1. 변수가 선언된 위치는 그 변수가 어떤 변수인지 결정할 수 있는 중요한 요소이다.


2. 멤버변수(Member variable) : 클래스 영역에 선언된 변수를 의미한다.

- 멤버변수는 프로그램의 어디에서나 접근할 수 있어서, 어느 위치에서든 호출이 가능하다.

- 선언할 때는 초기화를 하지 않는다.

- 해당 클래스에 public키워드가 붙으면 패키지 밖에서도 호출할 수 있게 되는데,
 이때 멤버변수를 전역변수(Global variable)라고도 할 수 있다.
 
- 이렇게 클래스에 선언된 멤버변수를 인스턴스변수(Instance variable)이라고도 부른다.
 인스턴스 변수는 객체가 생성될 때마다 새로운 주소를 가진 변수가 생성된다.
 이러한 인스턴스 변수는 객체가 생성되서 Heap 영역에 할당될때마다 Stack에 생성된다.
 그렇기 때문에 뒤에 설명할 클래스변수와 비교하여 공유되지 않는다.
 
- 이번에는 멤버변수에 static 키워드가 붙은 경우 클래스변수(Class variable)라고 한다.
 프로그램이 실행되면 메모리에 할당되는데 프로그램이 종료되어야지만 메모리에서 사라진다.
 클래스변수는 모든 인스턴스가 하나의 저장공간을 공유하게 된다.
 이때 저장되는 공간은 Static 영역이라고 한다.
 클래스의 객체가 여러번 생성되어도 static 키워드가 붙은 클래스변수는 처음에 딱 한 번만 생성된다.
 그렇기 때문에 동일한 클래스의 모든 객체들이 공유한다.
 한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야하는 속성의 경우 선언하기 때문에 
 객체지향적인 자바에서 주로 쓰이진 않는 것 같다.
 

3. 지역변수(Local variable): 함수(method) 블럭{} 안에 있는 변수

- 변수가 선언된 블록 내에서만 유효하고, 블록이 종료되면 메모리에서 사라져 사용할 수 없게 된다.

- 지역변수들은 해당 블록을 벗어나면 소멸하게 되기 때문에, 특정 구역 내에서만 사용이 가능하다.

- 메소드에 선언된 변수가 있다면 그 지역변수는 메소드가 호출될 때마다 매번 새롭게 할당된다.

- 지역변수는 멤버변수와 다르게 선언과 동시에 초기화를 해야한다.

- 그 메모리 제거를 가비지컬렉션(Garbage Collection)에서 관여한다.

4. 다음은 멤버변수 vs 지역변수, 클래스변수 vs 인스턴스변수 그리고 전역변수를 시각화하였다.

public class Test {		//public키워드가 붙어있는 클래스다.
    int var1; 			//멤버변수,전역변수
 	static int var2; 	//멤버변수(클래스 안에 있음),전역변수
    					//클래스변수(static키워드가 붙어 있음)
  
    public void fun() {	
        int var3; 		//지역변수(함수 안에 있음)
    }
}

*변수가 선언되고 메모리를 할당받는 순서와 그 위치를 보다 정확히 알면 변수에 대해서 더 많이 이해할 수 있겠다고 생각한다.
profile
안녕하세요! 개발을 배우기 시작한 학생의 학습공간입니다.

0개의 댓글