Programming/Java

F005 - Stack & Heap Memory

osean 2021. 5. 8. 17:22
โœ๏ธ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•๊ณผ ์ฐธ์กฐ ์ž๋ฃŒํ˜•์„ ๊ณต๋ถ€ํ•˜๊ณ  ๋‚˜๋‹ˆ Stack๊ณผ Heap ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋„ ๊ถ๊ธˆํ•ด์กŒ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ์ฒซ ๋ฉ˜ํ† ๋ง ์‹œ๊ฐ„์— ์ด ๋‘˜์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ œ๋Œ€๋กœ ํ•˜์ง€ ๋ชปํ•ด ๋ณต์Šต์„ ํ•˜๊ธด ํ–ˆ์–ด์•ผ ํ–ˆ๋‹ค.
๋˜, ์‹ค๋ฌด์—์„œ ์ด์— ๋Œ€ํ•œ ๊ฐœ๋…์ด ์ œ๋Œ€๋กœ ์žกํžˆ์ง€ ์•Š์•„ ์—ฌ๋Ÿฌ ๋ฒˆ ์‹ค์ˆ˜๋ฅผ ๊ฒฝํ—˜ํ•œ ์ ์ด ์žˆ๋‹ค. ์•ž์œผ๋กœ ์ด๋Ÿฐ ์‹ค์ˆ˜๋ฅผ ๋‹ค์‹œ ๋˜ํ’€์ดํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋Œ€๋žต์ ์œผ๋กœ๋งŒ ํŒŒ์•…ํ•˜๊ณ  ์žˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์•Œ์•„๋ณด์ž!

Stack Memory

  • ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์œผ๋กœ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ๊ฐ’๊ณผ ํ•จ๊ป˜ ํ• ๋‹น๋œ๋‹ค.
  • ์ฐธ์กฐ ์ž๋ฃŒํ˜•์€ ํ• ๋‹น๋œ Heap Memory์˜ ์ฐธ์กฐ๊ฐ’๊ณผ ํ• ๋‹น๋œ๋‹ค.
  • ๊ฐ ์Šค๋ ˆ๋“œ๋Š” ๊ฐ์ž์˜ Stack Memory ์˜์—ญ์„ ๊ฐ€์ง„๋‹ค.
  • ์ง€์—ญ ๋ณ€์ˆ˜, ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ์ž์‹ ์ด ์†ํ•œ ๊ณณ์˜ ์Šค์ฝ”ํ”„๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์‚ฌ๋ผ์ง„๋‹ค.
public class StackMemoryTest {
    public static int changeStayus(int param) {
        int tmp    = param * 10;
        int result = tmp / 2;
        return result;
    }

    public static void main(String[] args) {
        int value = 10;
        value = changeStayus(value);
        System.out.println(value);
    }
}

์œ„ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž.
main() ๋ฉ”์†Œ๋“œ์— ์„ ์–ธ๋œ value ๋ณ€์ˆ˜๋Š” 10 ์ด๋ผ๋Š” ๊ฐ’์ด Stack Memory์— ํ• ๋‹น๋œ๋‹ค. ๊ทธ ์ดํ›„์— changeStatus() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธํ’€ํ•˜๋ฉด์„œ ์ธ์ž๊ฐ’์œผ๋กœ value๋ฅผ ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋˜๋Š”๋ฐ, ์ฐธ์กฐ ์ž๋ฃŒํ˜•์ฒ˜๋Ÿผ ๊ฐ’์„ ์ฐธ์กฐํ•˜์ง€ ์•Š๊ณ  changeStatus()์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ param์— ํ•ด๋‹น ๊ฐ’์ด ๋ณต์‚ฌ๋˜์–ด Stack Memory์— ํ• ๋‹น๋œ๋‹ค. (๊ทธ๋ฆผ์œผ๋กœ ๊ทธ๋ฆฌ๊ณ  ์‹ถ์€๋ฐ ํŒ”์„ ๋‹ค์ณ์„œ ๊ทธ๋ฆด ์ˆ˜๊ฐ€ ์—†๋‹ค.)
์ด์ œ changeStatus() ๋ฉ”์†Œ๋“œ๋กœ ์ด๋™ํ•˜์—ฌ Stack Memory์— ์–ด๋–ค ๊ฐ’์ด ์ €์žฅ๋˜๋Š”์ง€ ์•Œ์•„๋ณด์ž. changeStatus() ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ์„ ์–ธ๋œ tmp ๋ณ€์ˆ˜๊ฐ€ Stack Memory์— ํ• ๋‹น๋˜๊ณ , result ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋˜๋ฉฐ Sack Memory์— ํ• ๋‹น๋œ๋‹ค. ์ด์ œ result ๋ณ€์ˆ˜๊ฐ€ main() ๋ฉ”์†Œ๋“œ์˜ value ๋ณ€์ˆ˜์— ๋ฆฌํ„ด๋˜๋ฉด์„œ changeStatus() ๋ฉ”์†Œ๋“œ์—์„œ ์„ ์–ธ๋œ ๋งค๊ฐœ ๋ณ€์ˆ˜ param๊ณผ ์ง€์—ญ ๋ณ€์ˆ˜ tmp, result์€ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์Šค์ฝ”ํ”„๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ Stack Memory์—์„œ pop๋˜์–ด ์‚ฌ๋ผ์ง„๋‹ค.
main() ๋ฉ”์†Œ๋“œ์˜ value ๋ณ€์ˆ˜์˜ ๊ฐ’์€ changeStatus() ๋ฉ”์†Œ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด์„œ ๋ฆฌํ„ดํ•œ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๊ณ  ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” System.out.println()์— ์˜ํ•ด ์ฝ˜์†”์ฐฝ์— ์ถœ๋ ฅ๋˜๊ณ  main() ๋ฉ”์†Œ๋“œ์˜ ๋งˆ์ง€๋ง‰ ์Šค์ฝ”ํ”„๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ Stack Memory์— ๋งˆ์ง€๋ง‰์œผ๋กœ ํ• ๋‹น๋œ value ๋ณ€์ˆ˜๋„ pop๋˜์–ด ์‚ฌ๋ผ์ง„๋‹ค.

Heap Memory

  • ์ƒ๋ช…์ฃผ๊ธฐ๊ฐ€ ๊ธด ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ๋‹ค.
  • ๋ชจ๋“  ์ฐธ์กฐ ์ž๋ฃŒํ˜•์€ ํ•ด๋‹น ์˜์—ญ์— ํ• ๋‹น๋˜๋ฉฐ, ์ด์— ํ•ด๋‹นํ•˜๋Š” ์ฃผ์†Œ๊ฐ’์ด ๋ ˆํผ๋Ÿฐ์Šค ๋ณ€์ˆ˜์™€ ํ•จ๊ป˜ Stack Memory์— ์ €์žฅ๋œ๋‹ค.
  • ์Šค๋ ˆ๋“œ์˜ ๊ฐœ์ˆ˜์™€๋Š” ๊ด€๊ณ„์—†์ด ํ•˜๋‚˜์˜ Heap Memory๋งŒ ์กด์žฌํ•œ๋‹ค.
public class HeapMemoryTest {
    public static void main(String[] args) {
				int value = 10;
        String hello = "hello";
        HeapMemoryTest heapMemoryTest = new HeapMemoryTest();
    }
}

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, value ๋ณ€์ˆ˜๋Š” Stack Memory์— ๊ฐ’๊ณผ ๋ณ€์ˆ˜๊ฐ€ ํ• ๋‹น๋˜์—ˆ๊ณ , hello ๋ณ€์ˆ˜์™€ heapMemoryTest ๋ณ€์ˆ˜๋Š” Heap Memory(hello ๋ณ€์ˆ˜๋Š” Constant Pool) ํ• ๋‹น๋˜์–ด ํ•ด๋‹น ์ฃผ์†Œ๊ฐ’๊ณผ ๋ณ€์ˆ˜๊ฐ€ Staack Memory์— ํ• ๋‹น๋œ ๊ฒƒ์„ ์ง€๋‚œ ์‹œ๊ฐ„ ๊ณต๋ถ€ํ•œ ๊ฒƒ์„ ํ†ตํ•ด์„œ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
์ด ๋•Œ, ์ฐธ์กฐ ์ž๋ฃŒํ˜•๋“ค์€ Pass By Reference ๋ผ๋Š” ํŠน์„ฑ์ด ์žˆ๋Š”๋ฐ, ์ด๋Š” ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•๊ณผ ๋‹ค๋ฅด๋‹ค. ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์€ ํŠน์ • ๋ณ€์ˆ˜๊ฐ€ ์–ด๋–ค ๋ฉ”์†Œ๋“œ์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋  ๋•Œ ๊ฐ’์ด ๋ณต์‚ฌ๋˜์–ด ํ˜ธ์ถœ๋œ ๋ฉ”์†Œ๋“œ์—์„œ ์ธ์ž๋กœ ๋ฐ›์€ ๋งค๊ฐœ ๋ณ€์ˆ˜์— ์–ด๋–ค ์ง“์„ ํ•ด๋„ ์›๋ž˜ ์žˆ๋˜ ๋ณ€์ˆ˜๋Š” ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.
ํ•˜์ง€๋งŒ ์ฐธ์กฐ ์ž๋ฃŒํ˜•์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ์–ด๋–ค ๋ฉ”์†Œ๋“œ์— ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด, ์›๋ž˜ ์žˆ๋˜ ์ฐธ์กฐ ๋ณ€์ˆ˜์˜ ๊ฐ’๋„ ๋ณ€ํ™”ํ•œ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์ฒ˜๋Ÿผ ๊ฐ’์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, Heap Memory์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ’์„ ํ•จ๊ป˜ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜๊ฐ€ ์–ด๋– ํ•œ ๋ฉ”์†Œ๋“œ์— ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๊ณ , ๊ทธ ๋ฉ”์†Œ๋“œ์—์„œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๊ธฐ์กด์˜ ์ฐธ์กฐ ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ์•„๋ฌด๋„ ์ฐธ์กฐํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ Heap Memory์— ๋‚จ๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿฌํ•œ ์“ฐ๋ ˆ๊ธฐ ๊ฐ’์„ Garbage Collector๊ฐ€ ์•Œ์•„์„œ ์ •๋ฆฌ๋ฅผ ํ•ด์ค€๋‹ค.

String, Wrapper Class

๋‹ค๋งŒ ๋ชจ๋“  ์ฐธ์กฐ ์ž๋ฃŒํ˜•์ด ์ธ์ž๋กœ ์ „๋‹ฌ๋  ๋•Œ ๋ชจ๋‘ ๊ฐ™์€ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. String๊ณผ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์˜ Wrapper ํด๋ž˜์Šค๋“ค์€ ๋ถˆ๋ณ€ํ•˜๋Š” ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ทœ์น™ ๋•Œ๋ฌธ์— immutable ํ•œ ํŠน์ง•์„ ๊ฐ€์ง„๋‹ค. ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ณ€์ˆ˜๋“ค์„ ์–ด๋– ํ•œ ๋ฉ”์†Œ๋“œ์— ์ธ์ž๋กœ ์ „๋‹ฌ๋˜์–ด ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ์›๋ž˜ ์žˆ๋˜ ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

public class HeapMemoryTest {
    public static void main(String[] args) {
        String str = "hello";
        Integer integer = 2021;
        System.out.println("str = " + str);
        System.out.println("integer = " + integer);

        changeStatus(str, integer);

        System.out.println("str = " + str);
        System.out.println("integer = " + integer);
    }

    public static void changeStatus(String strParam, Integer intParam) {
        String tmpStr = strParam + " world!";
        Integer tmpInt = intParam + intParam;
        System.out.println("tmpStr = " + tmpStr);
        System.out.println("tmpInt = " + tmpInt);
    }
}
/*
	str = hello
	integer = 2021
	
	tmpStr = hello world!
	tmpInt = 4084441
	
	str = hello
	integer = 2021
*/

์œ„ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋“ฏ, String๊ณผ Integer ํด๋ž˜์Šค๋Š” ์ฐธ์กฐ ์ž๋ฃŒํ˜•์ด์ง€๋งŒ ๋งˆ์น˜ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์ฒ˜๋Ÿผ ์ž‘๋™ํ•œ๋‹ค. ์ด๋Š” ๋ชจ๋“  Wrapper ํด๋ž˜์Šค์— final ์ ‘๊ทผ ์ œ์–ด์ž๊ฐ€ ์„ ์–ธ๋˜์—ˆ๊ธฐ ๋•Œ ๋ฌธ์ธ๋ฐ, JDK 5 ๋ฒ„์ „๋ถ€ํ„ฐ AutoBoxing/UnBoxing์„ ์ง€์›ํ•˜๋ฉด์„œ Wrapper ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ถˆ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์›์น™์— ์–ด๊ธ‹๋‚˜๋Š” ๊ฒƒ๊ณผ ๋ฉ”๋ชจ๋ฆฌ์™€ CPU ๋‚ญ๋น„ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.


์ฐธ๊ณ  ์‚ฌ์ดํŠธ

 

Why wrapper classes in Java are final?

Just simply as it sounds. I need to extend their functionality and I cannot. Why are they defined as final? Example: class MyInteger extends Integer { }

stackoverflow.com

 

์ž๋ฐ” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ - ์Šคํƒ & ํž™

๊ฐœ์š” Java ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•จ. Stack ๊ณผ Heap ์˜์—ญ ๊ฐ ์—ญํ• ์— ๋Œ€ํ•ด ์•Œ์•„๋ณธ๋‹ค. ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์‹ค์ œ ์ฝ”๋“œ์—์„œ ์–ด๋–ป๊ฒŒ Stack ๊ณผ Heap ์˜์—ญ์ด ์‚ฌ์šฉ๋˜๋Š”์ง€ ์‚ดํŽด

yaboong.github.io

 

'Programming > Java' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

F007 - JVM : Memory Architecture  (0) 2021.05.14
F006 - Throwable, Exception, Error  (0) 2021.05.11
F004 - Reference Type  (0) 2021.05.08
F003 - Access Modifier  (0) 2021.05.06
F002 - Primitive Type  (0) 2021.05.06