๐ŸŒŸ Java์˜ Stack๊ณผ Heap

์ „์ฃผ์€ยท2022๋…„ 11์›” 18์ผ
1
post-thumbnail

๐Ÿฅจ Java์˜ Stack๊ณผ Heap

๐Ÿคทโ€โ™€๏ธ ๋“ค์–ด๊ฐ€๋ฉด์„œ...

์ €๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ž๋ฐ”์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค!
JVM์— ๋Œ€ํ•ด ์ž์„ธํ•œ ๋‚ด์šฉ์€ ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”!
์ž๋ฐ”๋Š” ์–ด๋–ป๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š”๊ฐ€?
์˜ค๋Š˜์€ stack๊ณผ heap ์˜์—ญ ๊ฐ ์—ญํ• ๊ณผ ์ฝ”๋“œ์˜ˆ์ œ์™€ ํ•จ๊ป˜ stack๊ณผ heap์ด ์–ด๋–ค์‹์œผ๋กœ ๋ฐ”๋€Œ๋Š”์ง€ ๊ทธ๋ฆผ๊ณผ ํ•จ๊ป˜ ์•Œ์•„๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

โœ” stack / heap


๊ทธ๋ฆผ์—์„œ ๋ณด๋ฉด ์™ผ์ชฝ์ด stack memory์˜์—ญ์ž…๋‹ˆ๋‹ค.

Stack

  • Thread ๋ณ„๋กœ ๊ฐ์ž์˜ stack์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๊ทธ ๊ฐ’์„ ๊ฐ™์ด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    • ๊ธฐ๋ณธ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
      1)์ •์ˆ˜: byte(1byte, -128~127), short(2byte,-32768~32767),int(4byte,+_์•ฝ21์–ต), long(8byte)
      2)์‹ค์ˆ˜: float(4byte,์†Œ์ˆ˜์  6์ž๋ฆฌ๊นŒ์ง€), double(8byte)
      3)๋ฌธ์ž: char(2byte,์œ ๋‹ˆ์ฝ”๋“œ)
      4)๋…ผ๋ฆฌ: boolean(1byte -> true,false)
  • Heap ์˜์—ญ์˜ Object ์ฃผ์†Œ๊ฐ’์„ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”์†Œ๋“œ๋ณ„๋กœ ๋‹ค๋ฅธ ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ๋‹ค๋ฅธ scope๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
    • ์ง€์—ญ ๋ณ€์ˆ˜(local variable)๋ž€ ๋ฉ”์†Œ๋“œ ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
    • ๋ฉ”์†Œ๋“œ๊ฐ€ ๋๋‚˜๊ณ  return๋˜๋ฉด stack์—์„œ pop๋˜๊ณ  ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
    • ๋ณ€์ˆ˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋œ ์˜์—ญ์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ scope๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
    • scope๋Š” Method Scope์™€ Block Scope๋กœ ๋‚˜๋‰˜๊ณ  ๋ณ€์ˆ˜๊ฐ€ ์„ ์–ธ๋œ ์ดํ›„๋ถ€ํ„ฐ }๋ธ”๋ก์ด ๋‹ซํžˆ๊ธฐ์ „๊นŒ์ง€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Heap

  • JVM ํ”„๋กœ์„ธ์Šค ๋ณ„๋กœ ๋‹จ ํ•œ๊ฐœ์˜ ํž™ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  Object ํƒ€์ž…(Integer, String, Array, ...)์€ heap ์˜์—ญ์— ์ƒ์„ฑ๋œ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋ผ๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ™์€ ๊ฐ’์ด ์žˆ์„๊ฒฝ์šฐ ๊ทธ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜์ง€๋งŒ, new๋กœ ์ƒ์„ฑ๋œ ๊ฒฝ์šฐ๋Š” ๋ฌด์กฐ๊ฑด ์ƒˆ๋กœ์šด ์ฃผ์†Œ๊ฐ’์— ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•œ๋‹ค.

โœ” Reference Types

1.Strong Reference

2.Weak Reference

3.Soft Reference

4.Phantom Reference

โœ” ๊ทธ๋ฆผ์œผ๋กœ ์‚ดํŽด๋ณด๋Š” stack heap ์ƒ์„ฑ ๊ณผ์ •!

public class Method3 {//Day5

    public static int method2(){
        int num = (int)(Math.random()*6+1); 
        //๋ณ€์ˆ˜์˜ Scope: ๋ฉ”์†Œ๋“œ์•ˆ์—์„œ ๋งŒ๋“ค๋ฉด ๋ฉ”์†Œ๋“œ๊ฐ€ ๋๋‚ ๋•Œ ์‚ฌ๋ผ์ง: {}์‚ฌ์ด
        return num;                         
    }

    public static int[] method3(){
        int[] jumsu = {90, 80, 100, 40, 70};
        return jumsu;
    }

    public static int method4(int[] values){
        int sum = 0;
        for(int val: values) sum += val;
        return sum;
    }

    public static void main(String[] args) {

        System.out.println(method2());
        int num = method2();
        System.out.println("์ฃผ์‚ฌ์œ„ ์ˆซ์ž: "+ num);

        System.out.println(method3());     //[I@3498ed method3์˜ ์ฃผ์†Œ๊ฐ’
        int[] jumsu = method3();
        for(int i : jumsu){
            System.out.print(i + " ");
        }
        
        System.out.println();
        int[] values = {10, 30, 20, 50};
        int result=method4(values);
        System.out.println(result);

}


์ง€๊ธˆ stack์•ˆ์—๋Š” method2์—์„œ ์„ ์–ธ๋œ num์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ return๋  ๋•Œ pop๋˜์–ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.


๋งจ ์•„๋ž˜ num์€ main์—์„œ ์„ ์–ธํ•ด์„œ ๋‚˜์˜จ 1~6๊นŒ์ง€ ๋žœ๋ค๊ฐ’์ž…๋‹ˆ๋‹ค! jumsu๋Š” 2๊ฐœ๋กœ ์•„๋ž˜๋Š” main์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ด๊ณ , ์œ„๋Š” method3์—์„œ ์„ ์–ธ๋œ jumsu์ž…๋‹ˆ๋‹ค. ์œ„์—์žˆ๋Š” jumsu๋Š” return๋  ๋•Œ pop๋˜์–ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.


return๋ ๋•Œ jumsu๊ฐ€ return๋œ array์˜ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๊ฒŒ ๋˜๊ณ  ํฌ์ธํ„ฐ๋กœ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


๊ทธ์ƒํƒœ๋กœ main์—์„œ values๋ฅผ ์„ ์–ธํ•˜๋ฉด์„œ ๊ฐ’์„ ํ• ๋‹นํ•ด์ค๋‹ˆ๋‹ค. ๋ฐฐ์—ด์€ heap์— ์ €์žฅ๋˜๊ณ , ๊ทธ ์ฃผ์†Œ๊ฐ’์€ values์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. main์—์„œ ์„ ์–ธ๋œ result๋Š” method4๊ฐ€ returnํ•ด์ค€ ๊ฐ’์ด ์ €์žฅ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. method4์—์„œ ์„ ์–ธ๋œ sum์€ for๋ฌธ์—์„œ ์—ฐ์‚ฐ๋˜์–ด return๋ ๋•Œ pop๋˜์–ด ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

method4๊ฐ€ ๋ฆฌํ„ดํ•ด์ค€๊ฐ’์„ result์— ๋Œ€์ž…๋˜์–ด ๋ณ€์ˆ˜์™€ ๊ฐ’์ด ํ•จ๊ป˜ stack์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๋ฉ”์ธ์ด ๋๋‚˜๋ฉด main์˜ stack์˜ ์ •๋ณด๋Š” ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. heap์— ์ €์žฅ๋œ ๊ฐ’๋“ค์€ ๋ฐ”๋กœ ์ง€์›Œ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํฌ์ธํ„ฐ๊ฐ€ ์—†๋Š” ๊ฐ’๋“ค์€ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๊ฐ€๋น„์ง€์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์ง€์›๋‹ˆ๋‹ค.

โœ” Java์˜ String ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ: string pool

์ž๋ฐ”์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋ผ๊ธฐ ์œ„ํ•ด ๊ฐ™์€ ๋ฌธ์žฅ์ด๋ผ๋ฉด ์žฌ์‚ฌ์šฉ ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ String์€ ์กฐ๊ธˆ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. String์€ immutable์ด๋ผ ์„ ์–ธํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ํž™ ์˜์—ญ์— ์ƒ์„ฑ๋  ๊ฒƒ์ฒ˜๋Ÿผ ์ƒ๊ฐ์ด ๋˜์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž๋ฐ”์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— string pool์„ ์ €์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
string pool์€ ํž™ ์˜์—ญ ๋‚ด์— ์กด์žฌํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ž…๋‹ˆ๋‹ค.

public class String1 {//Day4
    public static void main(String[] args) {
        String str1 = new String("apple"); //new : string ๊ฐ์ฒด ์ƒ์„ฑ
        String str2 = new String("apple");
        String str3 = "apple";             //๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋กœ ๊ฐ์ฒด ์ƒ์„ฑ
        String str4 = "apple";             //heap ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๊ฒƒ์€ ๋™์ผ.

        // ๋ฉ”๋ชจ๋ฆฌ ๋น„๊ต
        System.out.println(str1 == str2);   //false: new๋ฅผ ์“ฐ๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ์ฃผ์†Œ
        System.out.println(str3 == str4);   //true

        // ๊ฐ’์„ ๋น„๊ต
        System.out.println(str1.equals(str2));//true
        System.out.println(str3.equals(str4));//true
        System.out.println(str2.equals(str3));//true
    }
}

๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ"๋ผ๋ฆฌ" ๊ฐ™์€ ๊ฐ’์ด ์žˆ๋Š”์ง€ heap์—์„œ ํ™•์ธํ›„ ๊ฐ™์€๊ฒƒ์ด ์žˆ์„๋•Œ ๊ฐ™์€ ์ฃผ์†Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.์ด์œ ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์กฐ๊ธˆ์ด๋ผ๋„ ์•„๋ผ๋ ค๊ณ  ํ•˜๋Š”๊ฒƒ์ธ๋ฐ, String ํด๋ž˜์Šค๋Š” ๋ถˆ๋ณ€๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์ด์ฃ !

๋ถˆ๋ณ€๊ฐ์ฒด: ์ƒ์„ฑ ํ›„ ๊ทธ ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†๋Š” ๊ฐ์ฒด

์˜ˆ๋ฅผ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!
str3= "banana"; ์ด๋ผ๊ณ  ํ•˜๋ฉด str4๋Š” apple ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ณ , str3๋Š” ์ƒˆ๋กœ์šด ์ฃผ์†Œ๋ฅผ ์–ป๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ถ”๊ฐ€๋กœ str3= "orange"; ํ•˜๋ฉด ๋˜ str3๋Š”์ƒˆ๋กœ์šด ์ฃผ์†Œ๋ฅผ ์–ป๊ฒŒ๋˜๊ณ , banana๋Š” ๊ทธ์ž๋ฆฌ์— ๋ฒ„๋ ค์ ธ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๊ฐ€ ๋Œ์•„๋‹ค๋‹ˆ๋ฉด์„œ null(ํฌ์ธํ„ฐ๊ฐ€ ์—†๋Š”๊ฐ’,๋Š์–ด์ง„์•„์ด๋“ค) ์ง€์›Œ์ฃผ์ง€๋งŒ ๊ทธ์‹œ์ ์ด ์–ธ์  ์ง€๋Š” ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ฐ’์ด ๋ฐ”๋€Œ๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ  ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํฌ์ธํ„ฐ๋งŒ ๋ฐ”๊พธ๋Š” ๋ถˆ๋ณ€๊ฐ์ฒด๋ผ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์ž!

์ฐธ๊ณ )StringBuilder ํด๋ž˜์Šค

  • String ํด๋ž˜์Šค์™€ ๋™์ผํ•˜๊ฒŒ ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃจ๋Š” ํด๋ž˜์Šค
  • String ํด๋ž˜์Šค๋Š” ๋ฌธ์ž์—ด์„ ์ธ์Šคํ„ด์Šค๋กœ ์ƒ์„ฑํ•˜๊ณ  ๋‚˜๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ€์ง„ ๋ฌธ์ž์—ด์„ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋Š” ๋ถˆ๋ณ€๊ฐ์ฒด๋ผ๋Š” ๋‹จ์ ์ด ์žˆ์Œ
  • ๊ฐ™์€ ์ธ์Šคํ„ด์Šค ์•ˆ์˜ ๋ฌธ์ž์—ด ํ•„๋“œ๊ฐ’์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ
  • ๋ถˆ๋ณ€๊ฐ์ฒด๊ฐ€ ์•„๋‹ˆ๊ฒŒ ํ•ด์ค€๋‹ค!
    ex)
    StringBuilder ์ฐธ์กฐ๋ณ€์ˆ˜ = new StringBuilder("๋ฌธ์ž์—ด1");
    ์ฐธ์กฐ๋ณ€์ˆ˜.append("๋ฌธ์ž์—ด2").append("๋ฌธ์ž์—ด3") ... <-๋ฌธ์ž์—ด1๋ฌธ์ž์—ด2๋ฌธ์ž์—ด3...

โœ” ์ž๋ฃŒ๊ตฌ์กฐ์—์„œ์˜ heap, stack

List ์ธํ„ฐํŽ˜์ด์Šค: ์ˆœ์„œ๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ค‘๋ณต์„ ํ—ˆ์šฉ
Set ์ธํ„ฐํŽ˜์ด์Šค: ์ˆœ์„œ๊ฐ€ ์—†๋Š” ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ค‘๋ณต์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ
Map ์ธํ„ฐํŽ˜์ด์Šค: ํ‚ค์™€ ๊ฐ’์„ ํ•œ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ๋ฐ์ดํ„ฐ์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ˆœ์„œ๊ฐ€ ์—†๊ณ , ํ‚ค๋Š” ์ค‘๋ณต์œผ๋กœ ํ—ˆ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ ๊ฐ’์€ ์ค‘๋ณต์„ ํ—ˆ์šฉ

import java.util.ArrayList;
import java.util.Iterator;

public class ArratList1 {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();

        arrayList.add(80);
        arrayList.add(95);
        arrayList.add(65);
        arrayList.add(100);
        arrayList.add(90);
        arrayList.add(55);

        System.out.println(arrayList);  //[80, 95, 65, 100, 90, 55]
        System.out.println(arrayList.size());   //6

        for(int i=0; i<arrayList.size(); i++){
            System.out.print(arrayList.get(i) + " ");   //80 95 65 100 90 55
        }
        System.out.println();

        arrayList.remove(2);
        System.out.println(arrayList);  //[80, 95, 100, 90, 55]
//        arrayList.remove(2);
//        System.out.println(arrayList);  //[80, 95, 90, 55]
        arrayList.set(4,85);
        System.out.println(arrayList);  //[80, 95, 100, 90, 85]

        Iterator<Integer> iterator = arrayList.iterator();
        while(iterator.hasNext()){  //.hasnext: ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด true ์—†์œผ๋ฉด false
            System.out.print(iterator.next() + " ");    //.next: ํ˜„์žฌ๊ฐ’์„์ฐ๊ณ  ๋‹ค์Œ์œผ๋กœ ๋„˜๊ธด๋‹ค.
        }   //80 95 100 90 85
    }
}

โœ” ๋ฐ•์‹ฑ/์–ธ๋ฐ•์‹ฑ์—์„œ์˜ heap, stack

  1. ๋ž˜ํผ ํด๋ž˜์Šค(Wrapper Class)
    • ๊ธฐ๋ณธํƒ€์ž…์˜ ์ •์˜: ๊ฐ’์ด ์ง์ ‘ stack์— ์ €์žฅ๋˜๋Š” ๊ฒƒ ( ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹˜ )
    • ๊ธฐ๋ณธํƒ€์ž…์€ JVM์— ์„ค๊ณ„๊ฐ€ ๋˜์žˆ๋Š” ํ˜•ํƒœ ==> ํ•˜๋“œ์›จ์–ด์ ์œผ๋กœ ์›€์ง์ด๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅด๋‹ค! //ํŒŒ์ด์ฌ์—๋Š” ์—†๋‹ค!
  • ๊ธฐ๋ณธํ˜•(primitive type) ๋ณ€์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ์ทจ๊ธ‰ํ•ด์•ผ ํ•  ๊ฒฝ์šฐ ๊ฐ์ฒด๋กœ ํฌ์žฅํ•ด์ฃผ๋Š” ํด๋ž˜์Šค
  • ์ž๋ฐ”๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์ด์ง€๋งŒ ๊ธฐ๋ณธํ˜•์ด๋ผ๋Š” ์˜ˆ์™ธ๋ฅผ ๋‘” ์ด์œ ๋Š” ์„ฑ๋Šฅ๋•Œ๋ฌธ

๋ž˜ํผ ํด๋ž˜์Šค๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

  • ๊ธฐ๋ณธํ˜• ๋ณ€์ˆ˜๋Š” ๊ฐ’์„ ์ €์žฅํ•˜๊ณ , ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋Š” ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ
  • ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ(์ž๋ฃŒ๊ตฌ์กฐ)๋Š” ์ฐธ์กฐํ˜• ๋ณ€์ˆ˜๋งŒ์„ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ
    • ๋ฐฐ์—ด์˜ ๋‹จ์  1. ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ด๋†”์•ผํ•œ๋‹ค 2. ๋‹ค๋ฅธ ํƒ€์ž…์„ ๊ฐ™์ด ์“ธ ์ˆ˜ ์—†๋‹ค
      3. ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„๋•Œ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋‘ ์Šค์บ” ํ•ด์•ผ ํ•œ๋‹ค.
    • Arraylist๋ผ๋Š” Class: ํฌ๊ธฐ๋ฅผ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋จ. ์—ฌ๊ธฐ๋Š” ์ผ๋ฐ˜๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค.
  • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋”ฉ์—์„œ ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜๋ ค๋ฉด ์ฐธ์กฐํ˜•๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ
    • ์“ฐ๋ ˆ๋“œ ? ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋”ฉ: ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ๋™์‹œ์— ํ•˜๋Š” ๊ฒƒ ex)๊ฒŒ์ž„+๋ฐฐ๊ฒฝ์Œ์•…
    • ๋™๊ธฐ(๋™์‹œ์—์ผ์–ด๋‚˜๋Š”): ์š”์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ํ•œ ์ž๋ฆฌ์—์„œ ๋™์‹œ์— ์ผ์–ด๋‚จ ex)ํ”„๋กœํ•„์‚ฌ์ง„
    • ๋น„๋™๊ธฐ(๋™์‹œ์— ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”) ex)ํ‹ฐ์ผ“ํŒ… ๋™์‹œ์— ๋“ค์–ด์™€์งˆ๋•Œ! -> ๋™๊ธฐํ™” ํ•„์š”

byte -> ๊ฐ์ฒด์ƒ์„ฑ -> Byte
short -> ๊ฐ์ฒด์ƒ์„ฑ -> Short
int -> ๊ฐ์ฒด์ƒ์„ฑ -> Integer
long -> ๊ฐ์ฒด์ƒ์„ฑ -> Long
char -> ๊ฐ์ฒด์ƒ์„ฑ -> Character
float -> ๊ฐ์ฒด์ƒ์„ฑ -> Float
double -> ๊ฐ์ฒด์ƒ์„ฑ -> Double
boolean -> ๊ฐ์ฒด์ƒ์„ฑ -> Boolean

String num = "100";
System.out.println(num + 100); //100100
System.out.println(Integer.parseInt(num) + 100); //200 ์—ฌ๊ธฐ์„œ Integer๊ฐ€ ๋ž˜ํผํด๋ž˜์Šค

๋ฐ•์‹ฑ(Boxing)
๊ธฐ๋ณธํƒ€์ž…์„ ๋ž˜ํผํด๋ž˜์Šค๋กœ ๋ณ€ํ™˜
int num = 10; //num์ด ์‚ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ ![10]stack []heap
Integer i = new Integer(num); //์ƒˆ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ ! [ref]stack -> [10]heap

์–ธ๋ฐ•์‹ฑ(UnBoxing)
๋ž˜ํผํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ณธํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜
int num = i.intValue();

public class Wrapper1 {
        public static void main(String[] args) {
            int num1 = 100;
    //        Integer num2 = new Integer(num1);   //์ทจ์†Œ์„ : ์—†์–ด์กŒ๊ฑฐ๋‚˜ ์—†์–ด์งˆ ์˜ˆ์ •์ธ ๋ฌธ๋ฒ•
            Integer num2 = num1;        //์ตœ๊ทผ์— ์“ฐ์ด๋Š” ๋ฐ•์‹ฑ ๋ฌธ๋ฒ•: ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•
            System.out.println(num1);   //100
            System.out.println(num2);   //100

            int num3 = num2.intValue(); //์–ธ๋ฐ•์‹ฑ ๋ฐฉ๋ฒ•1
            int num4 = num2;            //์–ธ๋ฐ•์‹ฑ ๋ฐฉ๋ฒ•2: ๋ฆฌํ„ฐ๋Ÿด ํ‘œ๊ธฐ๋ฒ•
            System.out.println(num3);   //100
            System.out.println(num4);   //100

    //        Integer num5 = new Integer(10);
            Integer num5 = 100;          //new๋ฅผ ํ•˜์ง€ ์•Š์•„๋„ ๊ฐ์ฒดํƒ€์ž…์œผ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.
            System.out.println(num1 + num5);  //200: ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐํƒ€์ž… + ๋ž˜ํผํด๋ž˜์Šค ๊ณผ๊ฑฐ์—” ์•ˆ๋ฌ์ง€๋งŒ ์ง€๊ธˆ์€ ๋œ๋‹ค!
            Integer num6 = 100;
            System.out.println(num5 + num6);  //200: ๋ž˜ํผ ๋ผ๋ฆฌ๋„ ์—ฐ์‚ฐ ๊ฐ€๋Šฅ!

            System.out.println(num1 == num5);   //true: ์ˆซ์ž๋Š” ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐํƒ€์ž…, ๋ž˜ํผํด๋ž˜์Šค์˜ ๊ฐ’ ๋น„๊ต *์ฃผ์†Œ๋น„๊ตXX
            System.out.println(num5 == num6);   //true: ์ˆซ์ž๋Š” ๋ ˆํผํด๋ž˜์Šค, ๋ž˜ํผํด๋ž˜์Šค์˜ ๊ฐ’ ๋น„๊ต *์ฃผ์†Œ๋น„๊ตXX
            // ์ŠคํŠธ๋ง์€ == ์ฃผ์†Œ๋น„๊ต .equals ๊ฐ’๋น„๊ต!

        }
    }

dzone-articles-java memory management
DigitalOcean-tutorial-java heap-vs-stack
https://yaboong.github.io/java/2018/05/26/java-memory-management/
https://leedo.me/35

profile
๋” ๋ฉ€๋ฆฌ ๋ณด๋„๋ก ํ•ด์š”. ์ง„์ฃผ๋Š” ํ•˜๋ฃจ์•„์นจ์— ์ƒ๊ฒจ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2022๋…„ 11์›” 21์ผ

Stack์ด๋ž‘ Heap์€ ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ์งœ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ผญ ์•Œ์•„์•ผ ๋˜๋Š” ๊ฐœ๋… ๊ฐ™์•„์š” :)

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ