Skip to content

Commit 99944a8

Browse files
committed
Today I Learned Memory about Java
1 parent e9bc4ef commit 99944a8

21 files changed

Lines changed: 363 additions & 0 deletions

‎memory/Data.java‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package memory;
2+
3+
public class Data {
4+
private int value;
5+
6+
public Data(int value) {
7+
this.value = value;
8+
}
9+
10+
public int getValue() {
11+
return value;
12+
}
13+
}

‎memory/JavaMemoryMain1.java‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package memory;
2+
3+
public class JavaMemoryMain1 {
4+
public static void main(String[] args) {
5+
System.out.println("main start");
6+
method1(10);
7+
System.out.println("main end");
8+
}
9+
static void method1(int m1){
10+
System.out.println("method1 start");
11+
int cal = m1*2;
12+
method2(cal);
13+
System.out.println("method1 end");
14+
}
15+
static void method2(int m2){
16+
System.out.println("method2 start");
17+
System.out.println("method2 end");
18+
}
19+
}

‎memory/JavaMemoryMain2.java‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package memory;
2+
3+
import static memory.JavaMemoryMain1.method1;
4+
import static memory.JavaMemoryMain1.method2;
5+
6+
public class JavaMemoryMain2 {
7+
public static void main(String[] args) {
8+
System.out.println("main start");
9+
method1();
10+
System.out.println("main end");
11+
}
12+
13+
static void method1() {
14+
System.out.println("method1 start");
15+
Data data1 = new Data(20);
16+
method2(data1);
17+
System.out.println("method1 end");
18+
}
19+
static void method2(Data data2){
20+
System.out.println("method2 start");
21+
System.out.println("data.value = " + data2.getValue());
22+
System.out.println("method2 end");
23+
24+
}
25+
}
26+

‎memory/ex/Car.java‎

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package memory.ex;
2+
3+
public class Car {
4+
private static int totalcars =0;
5+
private String name;
6+
7+
8+
public Car(String name) {
9+
System.out.println("차량 구입, 이름 : " + name);
10+
this.name = name;
11+
totalcars++;
12+
}
13+
14+
public static void showTotalCars() {
15+
System.out.println("구매한 차량 수 : " + totalcars);
16+
}
17+
}
18+

‎memory/ex/CarMain.java‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package memory.ex;
2+
3+
public class CarMain {
4+
public static void main(String[] args) {
5+
Car car1 = new Car("K3");
6+
Car car2 = new Car("G80");
7+
Car car3 = new Car("Model Y");
8+
9+
Car.showTotalCars(); //구매한 차량 수를 출력하는 static 메서드
10+
}
11+
}

‎memory/ex/MathArrayUtils.java‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package memory.ex;
2+
3+
public class MathArrayUtils {
4+
private MathArrayUtils(){
5+
6+
}
7+
public static int sum(int[] values) {
8+
int total = 0;
9+
for (int value : values) {
10+
total += value;
11+
}
12+
return total;
13+
}
14+
15+
public static double average(int[] values) {
16+
return (double)sum(values) / values.length;
17+
}
18+
19+
public static int min(int[] values) {
20+
int minValue = values[0];
21+
for (int value : values) {
22+
if(minValue > value)
23+
minValue = value;
24+
}
25+
return minValue;
26+
}
27+
28+
public static int max(int[] values) {
29+
int maxValue = values[0] ;
30+
for (int value : values) {
31+
if(maxValue < value)
32+
maxValue = value;
33+
}
34+
return maxValue;
35+
}
36+
}

‎memory/ex/MathArrayUtilsMain.java‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package memory.ex;
2+
3+
import static memory.ex.MathArrayUtils.*;
4+
5+
public class MathArrayUtilsMain {
6+
public static void main(String[] args) {
7+
8+
int[] values = {1, 2, 3, 4, 5};
9+
System.out.println("sum = " + sum(values));
10+
System.out.println("average = " + average(values));
11+
System.out.println("min = " + min(values));
12+
System.out.println("max = " + max(values));
13+
}
14+
}

‎memory/memory.md‎

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# 자바 메모리 구조와 static
2+
3+
## 자바 메모리 구조
4+
자바의 메모리 구조는 크게 메서드 영역, 스택 영역, 힙 영역 3개로 나눌 수 있다.
5+
#### 메모리 구조 - 비유
6+
7+
* **메서드 영역** : 클래스 정보를 보관한다. 이 클래스 정보가 붕어빵 틀이다.
8+
* **스택 영역** : 실제 프로그램이 실행되는 영역이다. 메서드를 실핼할 떄 마다 하나씩 쌓인다.
9+
* **힙 영역** : 객체(인스턴스)가 생성되는 영역이다. new 명령어를 사용하면 이 영역을 사용한다.
10+
쉽게 이야기해서 붕어빵 틀로부터 생성된 부어빵이 존재하는 공간이다.
11+
참고로 배열도 이 영역에 생성된다.
12+
13+
#### 메모리 구조 - 실제
14+
* **메서드 영역(Method Area)** : 메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은 프로그램의 모든 영역에서 공유한다.
15+
* 클래스 정보 : 클래스의 실행 코드(바이트 코드), 필드, 메서드와 생성자 코드등 모든 실행 코드가 존재한다.
16+
* static 영역 : static 변수들을 보관한다.
17+
* 런타임 상수 풀 : 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다. 예를 들어서 프로그램에 "hello"라는 리터럴 문자가 있으면
18+
이런 문자를 공통으로 묶어서 관리한다. 이 외에도 프로그램을 효율적으로 관리하기 위한 상수들을 관리한다.
19+
* **스택 영역(Stack Area)** : 자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다.
20+
* 스택 프레임 : 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임이다. 메서드를 호출할 떄마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 해당 스택 프레임이 제거된다.
21+
* **힙 영역(Heap Area)** : 객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)이 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거된다.
22+
23+
>> **참고** : 스택 영역은 더 정확히는 각 쓰레드별로 하나의 실행 스택이 생성된다. 따라서 쓰레드 수 만 큼 스택 영역이 생성된다. 지금은 쓰레드를 1개만 사용하므로 스택영역도 하나이다. 스레드에 대한 부분은 멀티 쓰레드를 학습해야 이해할 수 있다.
24+
25+
#### 메서드 코드는 메서드 영역에
26+
자바에서 특정 클래스로 100개의 인스턴스를 생성하면, 힙 메모리에 100개의 인스턴스가 생긴다. 각각의 인스턴스는 내부에 변수와 메서드를 가진다. 같은 클래스로 부터 생성된 객체라도, 인스턴스 내부의 변수 값은 서로 다를 수 있지만, 메서드는 공통된 코드를 공유한다.
27+
따라서 객체가 생성될 때, 인스턴스 변수에는 메모리가 할당되지만, 메서드에 대한 새로운 메모리 할당은 없다. 메서드는 메서드 영역에서 공통으로 관리되고 실행된다.
28+
29+
정리하면 인스턴스의 메서드를 호출하면 실제로는 메서드 영역에 있는 코드를 불러서 수행한다.
30+
31+
## 스택과 큐 자료 구조
32+
* **스택 - 후입선출(LIFO, Last In First Out)**
33+
34+
가장 마자믹에 넣은 값이 가장 먼저 나온다. 이렇게 나중에 넣은 것이 가장 먼저 나오는 것을 후입 선출이라고 하고, 이런 자료 구조를 스택이라 한다.
35+
36+
37+
* **큐 - 선입선출(FIFO, First In First Out)**
38+
39+
후입 선출과 반대로 가장 먼저 넣은 것이 가장 먼저 나오는 것을 선입 선출이라 한다. 이런 자료 구조를 큐(Queue)라 한다.
40+
41+
42+
이런 자료 구조는 각자 필요한 영역이 있다. 예를 들어서 선착순 이벤트를 하는데 고객이 대기해야 한다면 큐 자료구조를 사용해야 한다.
43+
**프로그램 실행과 메서드 호출에는 스택 구조가 적합하다.**

‎memory/static1/Counter.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package memory.static1;
2+
3+
public class Counter {
4+
public int count;
5+
}

‎memory/static1/Data1.java‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package memory.static1;
2+
3+
public class Data1 {
4+
public String name;
5+
public int count;
6+
7+
public Data1(String name){
8+
this.name = name;
9+
count++;
10+
}
11+
}

0 commit comments

Comments
 (0)