[JAVA] 변수 2 - 변수의 스코프

김민기·2021년 5월 15일
0

Java

목록 보기
3/20
post-thumbnail

변수의 스코프

변수의 스코프

자바의 변수는 선언된 위치(블록) 및 키워드에 따라 참조할 수 있는 범위 및 생명주기가 결정됩니다. 이는 크게 로컬 변수, 인스턴스 변수, 클래스 변수로 나뉩니다.

로컬 변수

로컬 변수(지역 변수)는 클래스 및 객체 내부의 메서드 블럭 및 초기화 블럭 등의 블럭 내부에서만 사용되는 변수입니다.

생명 주기

로컬 변수들은 해당 블럭을 벗어나게 되면 생명주기가 끝나며, 더이상 호출할 수 없습니다. 이는 메서드 블럭을 포함한 반복문과 같은 모든 블럭에서 해당합니다.

for(int i = 0 ; i < N ; i++)
{
	int cnt = i;
}
//컴파일 에러, 두 변수 모두 for 블럭 이후 소멸됨
System.out.println(i + cnt);

기본형 변수

로컬 기본형 변수는 기본값을 초기화하지 않습니다. (쓰레기 값으로 사용할 수 없음) 따라서 반드시 명시적으로 초기화해야하고, 그렇지 않으면 컴파일 에러가 발생합니다.

이 때 선언된 기본형 변수는 해당 쓰레드의 스택 메모리에 저장되어 생명주기가 다하면 메모리에서 제거됩니다.

인스턴스 변수

인스턴스 변수는 클래스의 동적 속성으로 선언되는 변수들을 말하며, static 키워드가 없는 클래스의 변수 속성을 말합니다.

생명 주기

인스턴스 변수들은 객체가 new 키워드를 통해 생성되었을 때 힙에 메모리가 할당됩니다. 객체와 생명주기를 같이하여 객체의 사용이 만료되어 GC에 의해 수거될 때 메모리에서 제거됩니다.

기본형 변수

인스턴스 변수로 선언된 기본형 변수들은 초기 값을 false 혹은 0 에 준하는 값을 갖게됩니다.

클래스 변수

클래스 변수(정적 변수)는 클래스 내에서 선언되며, static 키워드를 작성하여 정적으로 선언된 변수를 말합니다.

생명 주기

클래스 변수는 작성된 클래스의 로딩 과정에서 메모리 올라가게 됩니다. 그래서 해당 클래스를 더이상 참조하지 않게되어 GC 가 수거하게 되면 그 때 소멸되게 됩니다.

정적 속성은 객체가 아닌 클래스에 종속되어있으므로, 모든 같은 클래스로 생성된 객체에서 값을 공유합니다. 또한 객체 종속적이 아니므로 객체의 생성 없이도 호출할 수 있습니다.

class A{
	static int a;
}
//...
A var1 = new A();
A var2 = new A();
var1.a++;
var2.a++;
//2
System.out.println(var1.a);
//2
System.out.println(var2.a);
//2
System.out.println(A.a);
profile
민기1

0개의 댓글