JVM에는 + 가비지 컬렉션 등.. 메모리 구조를 가지고있습니다.
자바 메모리 구조 = JVM 라고 생각하면 편할것입니다.
Static
- JVM이 실행될때 생성되기 때문에, Class의 메소드 (힙 영역) 직접 호출이 불가능합니다. (인스턴스 생성 후 가능)
- !! ✔ 무분별한
Static사용은 지양합니다.
✔ 불가능한 케이스
public class PrintHello() {
void print() {
System.out.println("Hello");
}
public static void main(String[] args) {
print(); // 호출이 불가능
}
}
✔ 가능한 케이스
public class PrintHello() {
void print() {
System.out.println("Hello");
}
public static void main(String[] args) {
PrintHello hello = new PrintHello(); // 인스턴스 생성
hello.print(); // 호출 가능
}
}
Heap
- 생성된 객체(인스턴스)가 저장되는 공간입니다.
(new 연산자를 사용할때 생성된다)- 참조형 타입 (Reference type)이 저장되는 공간입니다.
Stack
- 메서드가 호출될 시 할당되는 영역입니다.
- Heap공간에 객체 값을 올리고, 해당 객체의 참조값이 할당된다는 뜻입니다.
- 기본형 타입 (Primitive type)이 저장되는 공간입니다.
- 자바에서는 총 8가지의 기본형 타입을 제공하지만, 많이 사용하는 기본형 타입을 소개하겠습니다.
(필요에따라 찾아본다)
int,char,boolean,long,double등이 있습니다.- 실제 값을 저장하는 공간임으로,
Stack(스택)메모리에 저장됩니다.- 기본값이 있기때문에,
Null이 존재하지 않습니다.Null을 넣고 싶다면 래퍼 클래스를 사용합니다.
- 래퍼 클래스 예시
int->Integer
char->Character
등.....int▶ 4byte = 32bit
(메X플스토리 메소가 21억이였던 이유)
- 기본형 타입을 제외한 타입들이 모두 참조형 타입 입니다.
- 기본형 타입과 다르게
Null이 존재합니다.- 주소값을 저장하는 공간으로
Heap(힙)메모리에 저장됩니다.
✔ 4가지의 참조형 타입을 소개하겠습니다.
Enum: Enum (열거) 타입Interface: 인터페이스
Array: Array (배열) 타입
int [] arr = new int [10];String [] arr = new String [10];
4.Class: Class (클래스) 타입
-String inputString = "Shin"
-Student jaewon = new Student()
✔ Student 클래스를new연산자를 통해 인스턴스화 한것이다.
✔ Heap(힙) 영역에 저장된 클래스를 꺼내서 사용하는 것이다.
번외 : 몬스터볼에 있는 꼬북이(힙) ▶new(몬스터볼에서 꺼내기) ▶
메서드 사용 (꼬북이 물대포 발사)
System.out.printf()를 사용하여 특정 형식의 문자열로 출력할수있습니다.
System.out.printf("%d-%02d-%02d", 2023, 4, 5);
System.out.printf("%s", "신재원");
System.out.printf("%.2f", 1.8151231) // 소수점 2번째 자리에서 반올림
System.out.printf("%s", 1+1); // 예외가 발생하지않음
System.out.printf("%d", "신재원"); // 예외가 발생
▶ 출력 : 2023-04-05
▶ 출력 : 신재원
▶ 출력 : 2
▶ 출력 : 1.82
포맷(format) 형식은 필요에따라 찾아보면 될것같습니다.
대표적으로
%s(String 형식으로 출력),%d(정수 형식으로 출력),%n(줄바꿈),
%f(float 형식으로 출력) 가 있습니다.
- 변수란 값을 저장할수있는 메모리 공간을 말합니다.
(쉽게말해 욕조 라고 생각하면 될것같습니다.)- 변수란 선언과 초기화를 꼭 해줘야됩니다.
✔ 변수를 선언만 할경우 오류가 발생합니다
✔ 변수 선언시 네이밍 규칙에 따라 의미있게 작성해야합니다.
(2일차 명명법 참고)
public class Main {
public static void main(String[] args) {
int number; // 변수를 선언
number = 30; // 변수를 초기화(저장)
int userAge = 20; // 선언과 동시에 초기화
}
}