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);
	}
}

자바코드의 실행 원리

  1. 자바의 모든 코드는 클래스 내부에 존재
  2. 자바는 실행 전에 static이 쓰여져있는 모든 것을 static 공간에 로드함
  3. 자바를 실행하면 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);
	}
}

좋은 웹페이지 즐겨찾기