Post

๐Ÿ’š ์ž๋ฃŒ๊ตฌ์กฐ - Java ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ(Stack, Heap)

๐Ÿ’š ์ž๋ฃŒ๊ตฌ์กฐ - Java ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ(Stack, Heap)

์ž๋ฐ” ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

1 ์ถœ์ฒ˜ : ์ด๋ฏธ์ง€

์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ฉด JVM(์ž๋ฐ” ๊ฐ€์ƒ ๋จธ์‹ )์€ OS๋กœ๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น ๋ฐ›๊ณ  ๊ทธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šฉ๋„์— ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ์˜์—ญ์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌํ•œ๋‹ค.

JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„(Runtime Data Area)๋Š” ํฌ๊ฒŒ Method(Static) ์˜์—ญ, Stack ์˜์—ญ, Heap ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„๋˜๊ณ  ๋ฐ์ดํ„ฐ ํƒ€์ž…(์ž๋ฃŒํ˜•)์— ๋”ฐ๋ผ ๊ฐ ์˜์—ญ์— ๋‚˜๋ˆ ์„œ ํ• ๋‹น๋˜๊ฒŒ ๋œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
    public int solution void main(String[] args) { // ๋งค๊ฐœ๋ณ€์ˆ˜
        int answer = 10; // ์ง€์—ญ๋ณ€์ˆ˜
    }
}

public calss Counter {
	private int state = 0; // ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜
    public static int gage = 100; // ํด๋ž˜์Šค ๋ณ€์ˆ˜

	public int get() {
	   return state;
	}
}
๋ณ€์ˆ˜๋ช…์„ ์–ธ ์œ„์น˜์„ค๋ช…
ํด๋ž˜์Šค ๋ณ€์ˆ˜ํด๋ž˜์Šค ์˜์—ญํด๋ž˜์Šค ์˜์—ญ์—์„œ ํƒ€์ž… ์•ž์— static์ด ๋ถ™๋Š” ๋ณ€์ˆ˜, ๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ณ€์ˆ˜๋กœ ์—ฌ๋Ÿฌ ๊ฐ์ฒด์—์„œ ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ •์˜
์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ํด๋ž˜์Šค ์˜์—ญํด๋ž˜์Šค ์˜์—ญ์—์„œ static์ด ์•„๋‹Œ ๋ณ€์ˆ˜, ๊ฐœ๋ณ„์ ์ธ ์ €์žฅ ๊ณต๊ฐ„์œผ๋กœ ๊ฐ์ฒด/์ธ์Šคํ„ด์Šค๋งˆ๋‹ค ๋‹ค๋ฅธ ๊ฐ’ ์ €์žฅ ๊ฐ€๋Šฅ
์ง€์—ญ ๋ณ€์ˆ˜๋ฉ”์„œ๋“œ ์˜์—ญ๋ฉ”์„œ๋“œ ๋‚ด์—์„œ ์„ ์–ธ๋˜๊ณ  ๋ฉ”์„œ๋“œ ์ˆ˜ํ–‰์ด ๋๋‚˜๋ฉด ์†Œ๋ฉธ๋˜๋Š” ๋ณ€์ˆ˜, ์ดˆ๊นƒ๊ฐ’์„ ์ง€์ •ํ•œ ํ›„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
๋งค๊ฐœ ๋ณ€์ˆ˜๋ฉ”์„œ๋“œ ์˜์—ญ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์‹œ โ€˜์ „๋‹ฌํ•˜๋Š” ๊ฐ’โ€™์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ธ์ˆ˜

๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ• ๋‹น๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์—ฌ๋Ÿฌ ์˜์—ญ์œผ๋กœ ๋‚˜๋‰จ

  • stack ๋ฉ”๋ชจ๋ฆฌ : ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ์˜ ์ง€์—ญ ๋ณ€์ˆ˜(local variable)์™€ ๋งค๊ฐœ ๋ณ€์ˆ˜(parameter)๊ฐ€ ์ €์žฅ๋จ. ํ•จ์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋งˆ๋‹ค ์Šคํƒ ํ”„๋ ˆ์ž„(stack frame)์ด ์Œ“์ž„.

  • heap ๋ฉ”๋ชจ๋ฆฌ : ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋จ.

Method(Static) ์˜์—ญ

  • JVM์ด ๋™์ž‘ํ•ด์„œ ํด๋ž˜์Šค๊ฐ€ ๋กœ๋”ฉ๋  ๋•Œ ์ƒ์„ฑ

  • JVM์ด ์ฝ์–ด๋“ค์ธ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€, ๋ฉค๋ฒ„ ๋ณ€์ˆ˜(ํ•„๋“œ), ํด๋ž˜์Šค ๋ณ€์ˆ˜(Static ๋ณ€์ˆ˜), ์ƒ์ˆ˜(final), ์ƒ์„ฑ์ž(constructor), ๋ฉ”์„œ๋“œ(method) ๋“ฑ์„ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„

  • Method(Static) ์˜์—ญ์— ์žˆ๋Š” ๊ฒƒ์€ ์–ด๋А๊ณณ์—์„œ๋‚˜ ์ ‘๊ทผ ๊ฐ€๋Šฅ

  • Method(Static) ์˜์—ญ์˜ ๋ฐ์ดํ„ฐ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์‹œ์ž‘๋ถ€ํ„ฐ ์ข…๋ฃŒ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚จ์•„์žˆ์Œ.

Stack ์˜์—ญ

  • ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•, ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ

  • ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€์˜ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์— ํ•ด๋‹นํ•˜๋Š” ๋ณ€์ˆ˜ ์ ์žฌ

  • Heap ์˜์—ญ์— ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ์˜ ์ฐธ์กฐ ๊ฐ’์ด ํ• ๋‹น๋จ

  • ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น, ๋ฉ”์„œ๋“œ ์ข…๋ฃŒ์‹œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‚ญ์ œ๋จ.

  • ์ž๋ฃŒ๊ตฌ์กฐ Stack ๊ตฌ์กฐ, LIFO(Last In First Out)

  • ๊ฐ Thread ๋งˆ๋‹ค ์ž์‹ ๋งŒ์˜ Stack์„ ๊ฐ€์ง

  • Thread๋Š” ๋‹ค๋ฅธ Thread์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†์œผ๋‚˜ static, Heap ์˜์—ญ์„ ๊ณต์œ ํ•˜์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

Heap ์˜์—ญ

  • JVM์ด ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋Ÿฐํƒ€์ž„ ์‹œ ๋™์ ์œผ๋กœ ํ• ๋‹นํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์˜์—ญ ์ฐธ์กฐํ˜•(Reference Type) ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๊ฐ–๋Š” ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค), ๋ฐฐ์—ด ๋“ฑ์ด ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„

  • ๋‹จ Heap ์˜์—ญ์— ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ ˆํผ๋Ÿฐ์Šค ๋ณ€์ˆ˜๋Š” stack์— ์ ์žฌ

  • Heap ์˜์—ญ์€ Stack ์˜์—ญ๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ณด๊ด€๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ˜ธ์ถœ์ด ๋๋‚˜๋”๋ผ๋„ ์‚ญ์ œ๋˜์ง€ ์•Š๊ณ  ์œ ์ง€๋จ. ๊ทธ๋Ÿฌ๋‹ค ์–ด๋–ค ์ฐธ์กฐ ๋ณ€์ˆ˜๋„ Heap ์˜์—ญ์— ์žˆ๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค๋ฉด, GC(๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ)์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฒญ์†Œ๋จ.

  • Stack์€ ์Šค๋ ˆ๋“œ ๊ฐฏ์ˆ˜๋งˆ๋‹ค ๊ฐ๊ฐ ์ƒ์„ฑ๋˜์ง€๋งŒ heap์€ ๋ช‡๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์กด์žฌํ•˜๋“  ์ƒ๊ด€์—†์ด ๋‹จ ํ•˜๋‚˜์˜ heap ์˜์—ญ๋งŒ ์กด์žฌ

๊ทธ๋ฆผ ์„ค๋ช…

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MemoryExample {
    public static void main(String[] args) {
        int x = 10;          // ๊ธฐ๋ณธ ํƒ€์ž… (์Šคํƒ)
        String name = "John"; // ์ฐธ์กฐ ํƒ€์ž… (ํž™)
        
        Person person1 = new Person("Alice", 25);  // ๊ฐ์ฒด ์ƒ์„ฑ (ํž™)
        Person person2 = person1;  // ์ฐธ์กฐ ๋ณต์‚ฌ
    }
}

class Person {
    String name;     // ์ฐธ์กฐ ํƒ€์ž… ํ•„๋“œ
    int age;         // ๊ธฐ๋ณธ ํƒ€์ž… ํ•„๋“œ
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

1

์Šคํƒ(Stack) ๋ฉ”๋ชจ๋ฆฌ ํŠน์„ฑ

  • args: ๋ฉ”์ธ ๋ฉ”์„œ๋“œ์˜ ์ธ์ž
  • x: ์ˆซ์ž 10
  • name: ๋ฌธ์ž์—ด์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฃผ์†Œ
  • person1, person2: ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ฐธ์กฐ๊ฐ’
  • ํŠน์ง• : ํ›„์ž…์„ ์ถœ(LIFO) ๊ตฌ์กฐ, ์ •์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

ํž™(Heap) ๋ฉ”๋ชจ๋ฆฌ ํŠน์„ฑ

  • โ€œJohnโ€์ด๋ผ๋Š” ๋ฌธ์ž์—ด ๊ฐ์ฒด
  • Person ๊ฐ์ฒด (name๊ณผ age ๊ฐ€์ง€๊ณ  ์žˆ์Œ)
  • ํŠน์ง• : ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น, ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ ๊ด€๋ฆฌ

์ฐธ๊ณ  ๐Ÿ™‡๐Ÿปโ€โ™€๏ธ

์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ1

์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ 2

This post is licensed under CC BY 4.0 by the author.