TIL(2022.02.05)
static , heap , stack
메모리와 cpu
메모리는 컴퓨터의 저장 역역
cpu는 연산하는 영역
java에서 static , heap , stack
- 자바에서 static, heap , stack은 논리적으로 영역을 구분
- static : 프로그램 시작 전부터 프로그램 종료까지 존재 , 가장 오래 살아있음
- heap : 동적할당 , static 다음으로 오래 살아 있음
- stack : 잠깐 존재하다가 사라짐 , 가장 짧게 살아있음
자료형
자바 -> 설계 -> 프로그램 시작
- 설계 == 포장 == 자료형
- 자료형에는 boolean, int ,double , char등이 있다.
(+) 패키지 : 자바 파일이 모여 있는 폴더
자료형의 메모리 구조
- 메모리의 8bit = 1Byte 여러 개로 이루어져있으며 0번지부터 시작한다.
- 8bit 단위로 나누는 이유는 영어 한문자를 표현할 수 있는 최소 단위기 때문이다.
// 3번지의 4Byte 공간에 10을 넣음
int 3번지 = 10;
// 이렇게 쓰면 불편하기 때문에 변수를 생성함
// 변수는 알아서 번지를 설정
int n3 = 10;
package ch01;
public class VarEx01 {
public static void main(String[] args) {
boolean b1 = true; // 박스 = 1;
boolean b2 = false; // 박스 = 0;
int n1 = 1000; // 나 메모리에 4바이트 공간이 필요해
double d1 = 1000.1; // 나 메모리 8바이트 공간이 필요해
char c1 = '가'; // 나 메모리에 2바이트 공간이 필요해
//변수 : 메모리에 저장 할 값 , 변할 수 있는 수
System.out.println(c1);
System.out.println(n1);
n1 = 50; // 해당 번지의 값을 변경
System.out.println(n1);
}
}
자바코드의 실행 원리
- 자바의 모든 코드는 클래스 내부에 존재
- 자바는 실행 전에 static이 쓰여져있는 모든 것을 static 공간에 로드함
- 자바를 실행하면 main이라는 친구의 내부 ({ })를 실행하고 내부가 끝나면 종료한다.
package ch01;
// 1. 자바의 모든 코드는 클래스 내부에 존재해야 한다.
//int n3 = 30;
public class VarEx02 {
// n2를 실행하려면 n2를 main stack안에 넣거나 , n2를 static으로 선언
static int n2 = 20;
//자바는 실행전에 static 이라고 쓰여져 있는 모든 것을 static공간에 할당
public static void main(String[] args) {
int n1 = 10; // 현재라인이 실행될 때 10이라는 숫자가 n1라는 메모리 공간에 할당
System.out.println(n1);
System.out.println(n2);
}
}
클래스 자료형
자료형
- int (정수) - 4Byte
- dobule (실수) - 8Byte
- char (문자) - 2Byte
- boolean (참,거짓) - 1bit
- 8bit 단위로 나누는 이유는 영어 한문자를 표현할 수 있는 최소 단위기 때문이다.
// 3번지의 4Byte 공간에 10을 넣음
int 3번지 = 10;
// 이렇게 쓰면 불편하기 때문에 변수를 생성함
// 변수는 알아서 번지를 설정
int n3 = 10;
package ch01;
public class VarEx01 {
public static void main(String[] args) {
boolean b1 = true; // 박스 = 1;
boolean b2 = false; // 박스 = 0;
int n1 = 1000; // 나 메모리에 4바이트 공간이 필요해
double d1 = 1000.1; // 나 메모리 8바이트 공간이 필요해
char c1 = '가'; // 나 메모리에 2바이트 공간이 필요해
//변수 : 메모리에 저장 할 값 , 변할 수 있는 수
System.out.println(c1);
System.out.println(n1);
n1 = 50; // 해당 번지의 값을 변경
System.out.println(n1);
}
}
- 자바의 모든 코드는 클래스 내부에 존재
- 자바는 실행 전에 static이 쓰여져있는 모든 것을 static 공간에 로드함
- 자바를 실행하면 main이라는 친구의 내부 ({ })를 실행하고 내부가 끝나면 종료한다.
package ch01;
// 1. 자바의 모든 코드는 클래스 내부에 존재해야 한다.
//int n3 = 30;
public class VarEx02 {
// n2를 실행하려면 n2를 main stack안에 넣거나 , n2를 static으로 선언
static int n2 = 20;
//자바는 실행전에 static 이라고 쓰여져 있는 모든 것을 static공간에 할당
public static void main(String[] args) {
int n1 = 10; // 현재라인이 실행될 때 10이라는 숫자가 n1라는 메모리 공간에 할당
System.out.println(n1);
System.out.println(n2);
}
}
클래스 자료형
자료형
- int (정수) - 4Byte
- dobule (실수) - 8Byte
- char (문자) - 2Byte
- boolean (참,거짓) - 1bit
그러나 20 , 'A'라는 것을 모두 저장할 수 있는 Type은 없다
=> 클래스 자료형을 이용
package ch01;
//MyVar은 클래스 자료형 = 개발자가 만드는 커스텀 자료형
// 여러가지 데이터를 가지고 있는 클래스를 Beans라고 부름
class MyVar{
static int n1 = 10;
static char c1 = 'A';
}
class MyVar2{
static int n1 = 20;
static char c1 = 'B';
}
public class VarEx03 {
static int num = 500;
public static void main(String[] args) {
System.out.println(MyVar.n1); // MyVar의 static영역 n1을 찾음
System.out.println(MyVar.c1); // MyVar의 static영역 c1을 찾음
System.out.println(VarEx03.num); // VarEx03의 static영역 num을 찾음
System.out.println(MyVar2.n1);
System.out.println(MyVar2.c1);
}
}
package ch01;
class Note1{
static int num = 1;
static int time = 1015;
static int price = 3000;
}
class Note2{
static int num = 2;
static int time = 1020;
static int price = 1000;
}
// 노트가 100개 필요하면 클래스 자료형을 100개 만들어야 하나???? -> 불편
//단점
//static은 프로그램 시작 전 ~ 프로그램 종료 까지 메모리에 존재
//많은 데이터를 저장하고 싶으면 클래스 자료형을 여러개 만들어야함
//따라서 static은 정적이다
//동적으로 해결할 수 있는 방법을 찾아야함
public class VarEx04 {
public static void main(String[] args) {
System.out.println();
}
}
클래스 자료형 - heap 저장
동적인 방법
package ch01;
// VarEx05의 static영역-> main
// Note의 static 영역 -> x
class Note {
int price = 2000;
}
public class VarEx05 {
public static void main(String[] args) {
//new Note(); // heap 공간에 Note클래스가 가지고 있는 모든 데이터를 할당해! (대신 static은 제외하고 )
Note note1 = new Note(); // main stack에 note1을 할당하고 거기에 heap 공간에 할당한 것을 가리키게해
Note note2 = new Note(); // main stack에 note2을 할당하고 거기에 heap 공간에 할당한 것을 가리키게해
Note note3 = new Note(); // main stack에 note3을 할당하고 거기에 heap 공간에 할당한 것을 가리키게해
int age = 25; // main stack
System.out.println(note1.price);
note3.price = 30000;
System.out.println(note3.price);
}
}
Author And Source
이 문제에 관하여(TIL(2022.02.05)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@jisung/TIL2022.02.05저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)