Wanna be Brilliant Full-Stack Developer
2/15 JAVA 자바 코드 실행 원리! 본문
목표
자바 실행 코드 원리를 한번 파헤쳐보자
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 메모리 공간에 로드한다.
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이다.
살펴보고 만약에 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
}
}
'Some Memos > Java' 카테고리의 다른 글
2/16 JAVA 커스텀 자료형(heap) 개념 잡기! (0) | 2022.02.16 |
---|---|
2/15 JAVA 클래스 자료형(Beans) 개념 잡기! (0) | 2022.02.16 |
2/14 Java 자료형 메모리 구조 개념 익히기! (0) | 2022.02.15 |
Java 개념정리! 자료형은 무엇인가? (0) | 2022.02.12 |
Java Static, Heap , Stack 이란? (0) | 2022.02.10 |