Wanna be Brilliant Full-Stack Developer

2/15 JAVA 자바 코드 실행 원리! 본문

Some Memos/Java

2/15 JAVA 자바 코드 실행 원리!

Flashpacker 2022. 2. 15. 02:16

목표 

자바 실행 코드 원리를 한번 파헤쳐보자

package ch01;

// 주석 : .class 팡일로 컴파일 되지 않는 
// 패키지 = 자바 파일이 모여 있는 폴더
public class VarEx01 {

	public static void main(String[] args) {
		boolean b1 = true; // 박스에 1이 저장된다!
		boolean b2 = false; // 박스 에 0이 저장된다.
		
		int n1 = 1000;		// 나 메모리에 4Byte 공간이 필요해!!
		double d1 = 1000.1; // 나 메모리에 8Byte 공간이 필요해!!
		char c1 = '가';	// 나 메모리에 2BYte 공간이 필요해!!
		
		System.out.println();

	}

}

 지금 이코드는 main이라는 것 안에 들어가있다. 

 

첫번쨰 기억해야 할것은 1. 자바의 모든 코드는 클래스 내부에 존재해야 한다!

이게첫번쨰 규칙이다!

package ch01;

int n3 = 30;

public class VarEx02 {
	
	int n2 = 20;
	
	public static void main(String[] args) {
		int n1 = 10;
		System.out.println(n1);
	}
}

int n3 = 30;은 VarEx02 내부가아니라 바깥에 있기떄문에 오류가난다! 

문법의 오류로 지우라고 에러 가 나왔다.

내부라 하면 무슨말이냐면 VarEx02 안에 { 중괄호 에 있는 영역이 클래스 영역이다. 

그리고 public static void main(String[] args) {
int n1 = 10;
System.out.println(n1); 여기는 main이라는 친구의 영역이다! 

오류가 난상태이다

지금 오류가 Static영역에 있지 않아서 사용할수 없다는것인데 이게 무슨말이냐면 여기에 대한 비밀이 풀리면 자바가 조금은 쉬워질 것이다.

2번쨰로 기억해야할것은 int n2 = 20; 부분을 자바는 실행하지 않는것이다.

실행했다면 메모리에 올라가있을것이고 

이부분을 한번도읽은적이 없기 떄문에

20이라는것이 메모리에 뜨지 않아서 사용하지못하는것이다.

근데 int n1 = 10; 애는 왜 사용할수 있는것인가?

이 친구는 main이라는 친구 내부에 있기떄문에 

 int n1 = 10; 이친구가 실행될떄 10이라는 숫자가 n1이라는 메모리 공간에 할당된다. 

여기서 궁금하다 이 main은 무엇인가?

2. 자바는 실행전에 static이라는 키워드를 가지고 있는 모든 친구들을 static 메모리 공간에 로드한다.

자바를 실행하면 많은것들 중에 main이라는 친구의 내부 먼저 실행된다.

 

3. 자바를 실행하면 main이라는 친구의 내부{ } 를 실행한다.

main 의 내부 8번, 9번, 10번 라인을 실행한다!

첫번째로 8번라인이 10이라는 숫자가 n1이라는 메모리공간에 할당이 된다.

모니터 화면에 n1이라는 메모리공간을 출력하는것이 9번!

마지막 10번라인에서는 n2를 찾을 수 없다. 왜냐하면 5번라인을 실행한적이 없기 때문이다. 

main이라는 친구를 실행하기 위해서는 main이라는 이름 자체도 메모리에 떠있어야한다.

근데 떠있기 떄문에 실행이 된다. 

4. 내부 {  } 가 끝나면 종료된다. (자바프로그램) 

 

 

main에서 첫번쨰로 int n1 = 10; 이 실행이 될것이다. 이떄 10이라는 숫자가 n1이라는 메모리 공간에 할당된것이다.

이떄 System.out.println(n1); 모니터 화면에 n1이라는 메모리공간에있는 값을 출력해줘 이기떄문에 출력할것이다.

마지막 System.out.printiln(n2); 를 보면 n2를 찾을수 없다고 나온다.

왜냐하면 int n2 = 20;을 한번도 실행하지 않았기 때문에....!

 

main이라는 친구의 내부를 실행하려면 main을 찾아야하는데 메모리에서

애를 찾아야지 내부를 실행할수 있다. 그것을 찾는 근거는 앞에 static키워드가 잡혀있다. 

자바는 static이라고 적혀있는 모든 친구들을 다 static공간에 올려넣는다.

이 main이라는 친구가 static에 올라간다. static이라는 공간에 최초로 올라가는것이 main이다. 

만약에 main앞에 static이 없으면 이렇게 뜬다 
JVM에 파일이 들어오면 가장먼저하는것이 Static이 파일안에 있는것이다!

살펴보고 만약에 static이 있으면 static이라는 공간에 main을 할당(allocate)한다.

할당한뒤  { } 내부의 중괄호를 실행하는데 이곳을 실행할떄 이공간이 실행될떄 

이 내부가 실행될떄 main의 Stack이라는것이 열린다. 그때 stack에 4바이트 공간으로 n1 = 10 이라고 저장된다. 

그다음에 9번라인에서 n1공간을 찾아가서 출력해준다.

내부가 끝나면 다 종료된다.  그러면 main stack은 11번라인에서 종료된다. 

static도 자바프로그램이 종료되는 11번라인에서 종료된다. 

 

아까 int n2 = 20; 클래스바깥에 있는것을 실행시키기위해서는 main이라는 stack공간으로 이동시켜주거나 

아니면 바로 앞에 static int n2 = 20; 이렇게 붙여줘도된다. 아까 JVM에서 static이 있나 확인할때 있는것을 보고 n2 = 20 도 static에 들어간다. 

 

package ch01;

public class VarEx02 {
	
	static int n2 = 20;
	
	public  static void main(String[] args) {
		int n1 = 10;	// 8번 라인이 실행 될떄 10이라는 숫자가 n1이라는 메모리 공간에 할당된다.
		System.out.println(n1); // main이라는 stack공간의 n1 
		 System.out.println(n2); // VarEx02라는 static 공간의 n2 
	}
}

main 안에 없어도 static을 앞에붙이면 출력이 된다.