Wanna be Brilliant Full-Stack Developer

2/18 Java 지역변수와 전역변수 개념 잡기!! 본문

Some Memos/Java

2/18 Java 지역변수와 전역변수 개념 잡기!!

Flashpacker 2022. 2. 19. 01:00


지역 변수는 stack영역에 저장되는것이다.

전역 변수는 heap이나 static에 저장되는 것들이다. 

 

쉽게 이야기하면 생명주기가 전역변수가 길고 지역변수는 짧다! 

메모리에 잠깐 떠있는 시간이 짧고 길다는 것으로 차이가 있는데! 

코드를 통해 예를 들자면!

package ch02;

public class StackEx02 {

	void a() {
		int n1 = 1; 
	}
	
	public static void main(String[] args) {
		
	}
}

여기서 main이 n1을 접근할 수 있는 방법이 없다.  만약에 메서드 앞에 static을 붙이면 호출이 가능하다. 

12번 라인에서 a 메서드의 n1을 접근 할 수 있는 방법이 없다. 왜냐하면 n1이라는 변수는 a라는 메서드가 호출이 될떄 이 코드 영역이 오픈되면서 이 변수는 stack영역에 저장이 된다. 

n1은 그래서 a 메서드의 스택 영역에 저장이 된다는것인데 이런것을 지역변수라고 부른다! 

a라는 스택 내부에서만 접근이 가능하다. 

 

전역변수는 무엇일까? 

package ch02;

public class StackEx02 {

	int sum = 20; 
	
	static void a() {
		int n1 = 1;  // a 메서드의 스택영역에 저장됨 (지역 변수) 
		System.out.println(n1);
	}
	
	public static void main(String[] args) {
		a();
		//System.out.println(n1);
	}
}

int sum = 20; 에 위치가 클래스 내부에 있다! 애는 메서드가 실행될떄 오픈이 되는것이 아니라

메모리에 뜨기 위해서는 static이 아니니까 메모리에는 안뜨지만 Static 영역에 놓으면 

package ch02;

public class StackEx02 {

	static int sum = 20; //전역변수 (static)
	int value = 50; // 전역변수 ( heap) 
	
	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);
		StackEx02 s = new StackEx02();
		System.out.println(s.value);
	}
}

main함수에서 호출이 가능한데 이런것을 전역변수라고 부른다! 전역족으로 쓸수 있다는것이고

지역변수는 지역적으로(메서드의 stack 내부)에서만 사용할수 있다는 것이다.

StackEx02 s = new StackEx02(); new를 하면 어떤게 메모리에 뜨냐면 

StackEx02라는 클래스가 들고있는 static이 아닌 모든것들이 메모리에 뜨는데 여기서 보면

static이 아닌건 int value = 50; 밖에 없다. 

그러면 호출할떄 연결 연산자를 사용해서 s.value 라고 하면 50이 나온다! 

static int sum = 20 ; 이 전역변수는 자바 프로그램이 실행되기 전부터 메모리에 떴다가 프로그램이 종료되면 같이 사랒고 

2번쨰는 int value=50; 전역변수는 17번 라인에서 heap공간이 열리면서 value가 할당된다! 

 

 

int n1 = 1;은 a 메서드가 실행될떄 stack 공간에 n1이 할당되고 a 메서드가 종료되면 메모리에서 사라진다!

18번 라인에서 메모리에 뜨고, 19번라인에서 value를 참조하고 있을떄는 안사라지고 


20 번라인에서 사라진다. 

 

Static영역을 착각하는 경우도 있는데.

저 내부공간은 언제 오픈이 되는가? 내부공간이 오픈되는것은? 24번라인에서 a를 호출( 메서드를 호출) 할때 

저 공간이 실행이 되는데 static이 붙어 있는 키워드는 메인 메서드가 실행되기도전에 static이 붙어있으면 메모리에 할당해야하는데 지금은 불가능하다. 타이밍을 보면 a메서드가 실행될떄 16, 17, 18 , 19라인이 실행되고나서 20번을 실행할떄 문제가 생긴다. 

21번 라인이 실행되려고 할 때 static 공간에 할당해야 하는데 불가능하다 , static공간 할당은 main 메서드 실행전에만 가능하다 

 

package ch02;

/*
 * 정리: Stack은 지역변수 = 메서드가 실행될 때 메모리에 할당된다 = 메서드가 종료될 떄 메모리에서 사라진다 (가장 생명주기 짧음)
 * 		  : Heap(전역변수 = new 할떄 메모리에 할된다 = 더이상 참조하지 않을떄 메모리에서 사라진다) 
 * 		  : Static(전역변수 = main 메서드가 실행되기전에 메모리에 할당되요 = main 메서드가 종료되면 메모리에서 사라진다
 */


public class StackEx02 {

	static int sum = 20; //전역변수 (static) main 메서드가 시작되기전에 sum이 할당된다. 
	int value = 50; // 전역변수 ( heap) // 더이상 참조하지 않을 떄 자동으로 사라진다. 
	
	static void a() {
		// a 메서드가 실행될 떄 stack 공간에 n1이 할당되고 a 메서드가 종료되면 메모리에서 사라진다. 
		int n1 = 1;  // a 메서드의 스택영역에 저장됨 (지역 변수) (stack) 
		System.out.println(n1);
		
		// 21번 라인이 실행되려고 할 때 static 공간에 할당해야 하는데 불가능하다 , static공간 할당은 main 메서드 실행전에만 가능하다 
		//static int n3= 2;
	}
	
	public static void main(String[] args) {
		a(); // 메서드 호출 
		//System.out.println(n1);
		System.out.println(sum);
		StackEx02 s = new StackEx02(); // 17번 라인에서 heap 공간에 value가 할당된다. 
		System.out.println(s.value);
		System.out.println("test1 - 더이상 s 변수를 참조하지 않기 떄문에 메모리에서 사라진다."); 
		System.out.println("test2");
	}
}