JVM 구조
문서(test.java)-[컴파일]-test.class-[실행]-JVM-OS-하드웨어
bin/out : 컴파일 결과물인 .class 파일 (실행 가능한 파일들) 모아둔곳
컴파일(IDE에서 그냥 저장하면 끝),실행(run)
메모리 구조 -> 커피 마시기 게임
Static -> 커피머신 : 프로그램이 시작되기 전부터, 종료될때까지 계속 존재
Heap -> 게임 참가자 : 프로그램 중간에 나타나서 동작하고 프로그램이 끝나기 전에 사라지는곳(동적 메모리 영역)
Stack -> 커피를 마시는 순간 시간과 커피를 마시고 난 뒤의 시간 : cpu가 연산하고 나면 삭제된다.
차례로 구분되어 있다. 아래로 내려갈수록 가볍고 생명주기가 짧다.
메모리 : 저장하는 공간, cpu : 연산 하는 공간, 모니터 : 출력
자료형과 메모리구조
20칸 창고에 과일 넣기
1. 적절한 갯수의 과일이 박스에 담길수있게 포장하기
1칸에 3.5개가 들어간다 => 2칸에 7개를 넣자
2. 창고 전체에 들어올 과일의 양 생각해야한다
====
boolean = 1bit
{
int = 32bit =>4Byte, 4개층 필요 :
할당한 공간의 가장 아래층 = 값; - 원래의 초기화 하는 법 (개발자가 메모리 어느 공간이 비었는지 알기 힘들다)
->
변수 이름 = 값; - 컴퓨터가 알아서 메모리의 빈공간을 찾아서 할당한다
사용자가 값에 접근할때 : 사용자(변수) -> 변수 정보 테이블 -> 메모리 이런순서로 접근이 이루어 진다.
double = 64bit
char = 16bit
}
=> -,+ 반씩 표현 가능
RAM(메모리)=아파트같은 구조(층마다 주소가 다르다)
각 층은 8bit 구조의 주소를 가진다 2^256 = 영어 한개의 문자를 저장 가능하다
8bit = 1Byte
자바 코드 실행 원리
1.자바의 모든 코드는 클래스 내부에 존재해야 한다
2. 자바는 실행전에 static이라는 키워드를 가지고 있는 모든 친구들을 static 메모리 공간에 로드한다
->static에 main만 올라간다, main내부는 올라가지 않는다
3.자바를 실행하면 main이라는 친구의 내부{}를 실행한다
4.내부{}가 끝나면 자바는 종료된다.
========
.java 파일을 저장하면 컴파일이 된다->.class
.class 파일을 JVM에 로드한다
JVM에서 .class 파일을 실행하는데 가장 먼저 파일 내부에 static이 있는지 확인하다
만약 있으면 static공간에 할당한다(allocate)
static 공간에 할당하는 행동이 끝이 나면 stack이 열린다
만약 static공간에 main이 있다면 열리는 stack의 이름은 main stack이 된다.
main이 종료 되면 main stack이 사라지고, static에 있는 main도 사라진다.
=========
public class VarEx02 {
static int n2 =20;
public static void main(String[] args) {
int n1 =10; //여기가 실행될때 10이라는 숫자가 n1에 저장된다
System.out.println(n1); //main이라는 stack에 있는 n1
System.out.println(n2); //VarEx02라는 static에 있는 n2
}
}
클래스 자료형
class가 붙어 있다 -> static 메서드 영역
static 함수 -> static 메서드 영역
static 변수 -> static 변수 영역
stack? => 실행 가능한 것들만 올린다(함수o, 클래스/변수 x)
//MyVar은 클래스 자료형 = 개발자가 만드는 커스텀 자료형
//여러가지 데이터를 가지고 있는 클래스를 Beans 라고 한다.
//즉 MyVar은 Beans이다.
class MyVar{
static int n1 =10;
static char c1='A';
}
public class VarEx03 {
static int num = 500;
public static void main(String[] args) {
System.out.println(MyVar.n1); // . : 주소를 찾아가는 연결 연산자
System.out.println(num);
System.out.println(VarEx03.num);
}
}
/*
* static->{MyVar(n1=10,c1='A'),VarEx03(main,num)}
* stack->{main}
* num이랑 VarEx03.num이랑 사실상 같다, VarEx03 생략 가능
* */
클래스 자료형 -heap 저장
일단 클래스들은 전부 static에 올라간다 (Note, VarEx05 -> static method)
main은 static이 붙어있으니까 static에 올라간다
그리고 price는 note가 new될때 생성되는거니까 heap에서 전역변수로 사용된다
//VarEx05 -> main
//Note -> X
class Note{
int price = 2000;
}
public class VarEx05 {
public static void main(String[] args) {
new Note(); //heap 공간에 Note클래스가 가지고 있는 모든 데이터를 할당해!, 대신 static은 제외하고
Note note1 = new Note();
int age =25; //main stack에 생성
System.out.println(note1.price);
note1.price=1;
System.out.println(note1.price);
}
}
/*
* static->[VarEx05(main),Note]
* stack->[main(age=25)]
*
* new Note()실행되면 아래처럼 heap에 Note공간 생성된다
*
* heap
* [
* Note(price=2000)
* Note(price=2000) = note1
* ]
*
* */
------->static공간에 있으면 같은 공간에서 중복되게 생성해야 하는데, heap에 있으면 다른영역에서 사용할 뿐만 아니라 요청이 들어올때 마다 생성하는 동적 생성 가능
'JAVA > 메타코딩' 카테고리의 다른 글
4-객체지향 (0) | 2025.04.08 |
---|---|
3-자바기본 (0) | 2025.04.07 |
2-자바구조,메서드(매우중요) (0) | 2025.04.07 |