Language/Java

[Java] 멤버 변수와 지역 변수

개발사전 2022. 1. 20. 00:10

앞서, 타입에 따라 기본 자료형과 참조 자료형으로 변수를 나눌 수 있었습니다. 이 뿐만이 아니라 선언 위치에 따라 변수를 나눌 수 있는데, 이를 멤버 변수와 지역 변수라고 부릅니다.

 

1. 선언 위치에 따른 변수 분류

인스턴스 멤버 변수

클래스 영역에 선언되며 객체가 만들어질 때 객체 별로 생성됩니다. 생성만 하면 자동으로 변수의 타입별로 기본값으로 초기화됩니다. 해당 변수에 접근하기 위해서는 객체를 통해서만 접근을 할 수 있습니다. 가비지 컬렉터가 이 변수를 수집하기 전까지 프로그래머가 사용하지 않아도 상주하고 있습니다.

 

클래스 멤버 변수

클래스 영역에 선언되며 모든 객체가 공유하기 때문에 공유 변수라고 부르기도 합니다. 생성만하면 자동으로 변수의 타입별로 기본값으로 초기화됩니다. 인스턴스 멤버 변수와는 다르게 'static'이라는 키워드를 앞에 붙여 선언할 수 있습니다. 클래스 멤버 변수는 JVM의 Class Area에 클래스가 로딩되면 메모리에 올라가기 때문에 개별 객체의 생성과는 무관하게(객체가 생성되어있지 않더라도) 접근이 가능합니다. 인스턴스 멤버 변수는 객체를 통해 접근할 수 있었던 것처럼, 클래스 멤버 변수는 클래스로 접근할 수 있습니다. 물론, 객체를 통해 접근은 가능하나, 적절한 표현은 아니기에 지양해야 합니다. 클래스 멤버 변수는 가비지 컬렉터의 대상이 되지 않고, 프로그램이 종료되면 메모리에서 소멸됩니다.

 

지역 변수 & 멤버 변수

메서드 안에 선언되는 변수들로 선언된 라인이 실행될 때 스레드 별로 생성된 stack 영역에 생성됩니다. 인스턴스 변수나 클래스 변수와는 다르게 사용하기 전 명시적인 초기화가 필요하며, 외부에서 접근이 불가하므로 인스턴스나 클래스 명을 통해 변수에 접근(ex-people.name) 하지 않고, 바로 변수에 접근(ex-name)할 수 있습니다. 해당 메서드를 벗어나면 메모리에서 소멸됩니다.

종류 변수 종류 선언 위치
멤버 변수 클래스 멤버 변수 클래스 영역(static keyword)
인스턴스 멤버 변수 클래스 영역
지역 변수 지역 변수 함수 내부
파라미터 변수 함수 선언부
public class Test {
	int instanceVariable;	// 인스턴스 멤버 변수
	static int classVariable;	// 클래스 멤버 변수
	
	public static void main(String[] args) {	// 파라미터 변수
		int localVariable = 10;		// 지역 변수
	}
}