λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • μž₯원읡 κΈ°μˆ λΈ”λ‘œκ·Έ
πŸ’Š Java & Kotlin & Spring/- Java & kotlin

[Java 심화] λ³€μˆ˜κ°€ λ©”λͺ¨λ¦¬μ— λ‹΄κΈ°λŠ” κ³Όμ •κ³Ό μŠ€νƒ ν”„λ ˆμž„κ³Ό λ§Œλ‚¨

by Wonit 2019. 12. 21.
이번 μ‹œκ°„μ—λŠ” λ°”λ‘œ 전에 말 ν–ˆλ˜ λ©”λͺ¨λ¦¬μ™€ JRE, JVM의 관계 μ—μ„œ 쑰금 더 깊게 λ“€μ–΄κ°€μ„œ μŠ€νƒ ν”„λ ˆμž„μ΄ μ–΄λ–»κ²Œ 생기고 μŠ€νƒ ν”„λ ˆμž„μ΄ μ–΄λ–€ κ³Όμ •μœΌλ‘œ 사라지며, static μ˜μ—­μ—λŠ” μ–΄λ–€ 데이터가 λ‹΄κΈ°λŠ”μ§€ μ •ν™•νžˆ μ•Œμ•„λ³΄μž.

μŠ€νƒ ν”„λ ˆμž„μ˜ 생쑴 κΈ°κ°„

μŠ€νƒ ν”„λ ˆμž„μ˜ 생쑴 기간에 λŒ€ν•΄ μ •ν™•νžˆ μ•Œμ•„λ³΄μž.

public class Post02 {
    public static void main(String[] args) {
        System.out.println("hello");
    }
}

class Post03 {
    void greeting(){

    }

    void sayHello(){

    }
}

 

μœ„μ™€ 같은 μ½”λ“œμ—μ„œ 데이터 λ©”λͺ¨λ¦¬ ꡬ쑰λ₯Ό μ •ν™•ν•˜κ²Œ 그렀보자면 static μ˜μ—­μ—λŠ” Post02, Post03κ°€ λ‹΄κΈ°λŠ” λ‹€μŒκ³Ό 같은 ꡬ쑰가 될 것이닀.

근데 μœ„μ˜ 그림은 ν”„λ‘œκ·Έλž¨μ΄ ν•΄μ„λ˜λŠ” μ‹œκ°„μ˜ 영ν–₯을 μ „ν˜€ 받지 μ•Šκ³  μž‘μ„±λ˜μ—ˆλ‹€. μ™œλƒ? Post03 ν΄λž˜μŠ€λŠ” main()의 μŠ€νƒ ν”„λ ˆμž„ 이 사라지고 λ‚˜μ„œ μƒμ„±λ˜μ–΄μ•Ό ν•˜λŠ”λ°, 같이 있기 λ•Œλ¬Έμ—.

 

그럼 이λ₯Ό 톡해 μ•Œ 수 μžˆλŠ” 것은 μŠ€νƒ ν”„λ ˆμž„μ΄ μƒμ„±λ˜κ³ , μ’…λ£Œλ˜λŠ” 과정이 μžˆλ‹€λŠ” 것.

 

근데 κ·Έ 과정을 κ°€μž₯ μ‰½κ²Œ μ„€λͺ…ν•˜μžλ©΄ μ€‘κ΄„ν˜Έκ°€ μ‹œμž‘ν•˜λŠ” λΆ€λΆ„μ—μ„œ μŠ€νƒν”„λ ˆμž„μ΄ μƒμ„±λ˜κ³  μ€‘κ΄„ν˜Έκ°€ λλ‚˜λŠ” λΆ€λΆ„μ—μ„œ μŠ€νƒν”„λ ˆμž„μ΄ μ’…λ£Œλœλ‹€.

 

Stack ν”„λ ˆμž„μ— λ³€μˆ˜κ°€ λ‹΄κΈ°λ©΄?

μ •ν™•νžˆ 말 ν•˜λ©΄ μš°λ¦¬λŠ” μ§€κΈˆκΉŒμ§€ 데이터 μ˜μ—­μ„ λ³€ν™”μ‹œν‚€μ§€ μ•Šμ•˜λ‹€. 단지 μŠ€νƒ ν”„λ ˆμž„μ˜ 생성과 파기의 κ³Όμ •λ§Œ λ³΄μ•˜μ„ 뿐 λ³€μˆ˜λ₯Ό ν• λ‹Ήν•˜κ±°λ‚˜ ν•΄μ œν•œ 적이 μ—†κΈ° λ•Œλ¬Έμ— 이제 μ§μ ‘μ μœΌλ‘œ λ³€μˆ˜μ— λŒ€ν•΄μ„œ μ•Œμ•„λ³΄μž.

 

public class Post02 {
    public static void main(String[] args) {
        int intVal;

        intVal = 100;

        double doubeVal = 200.0;
    }
}

 

μœ„μ™€ 같은 과정을 μˆœμ„œλŒ€λ‘œ λ‚΄λ €κ°€λ‹€ 보면

  1. static μ˜μ—­μ— Post02κ°€ ν• λ‹Ήλ˜λ©° κ·Έ λ‚΄λΆ€μ—λŠ” main()λ©”μ„œλ“œκ°€ μ‘΄μž¬ν•œλ‹€.
  2. 2번째 쀄이 λ˜μ—ˆμ„ λ•Œ, main() μŠ€νƒ ν”„λ ˆμž„μ΄ μ‹œμž‘λœλ‹€.
  3. 3번째 쀄이 λ˜μ—ˆμ„ λ•Œ, main() μŠ€νƒ ν”„λ ˆμž„μ— intVal μ΄λΌλŠ” 곡간이 ν• λ‹Ήλœλ‹€.
  4. 5번째 쀄이 λ˜μ—ˆμ„ λ•Œ, main() μŠ€νƒ ν”„λ ˆμž„μ— μžˆλŠ” intValμ΄λΌλŠ” 곡간에 100이 λ‹΄κΈ΄λ‹€.
  5. 6번째 쀄이 λ˜μ—ˆμ„ λ•Œ, main() μŠ€νƒ ν”„λ ˆμž„μ— `doubleValμ΄λΌλŠ” 곡간이 할당됨과 λ™μ‹œκ²Œ 200.0이 λ‹΄κΈ°κ²Œ λœλ‹€.

 

 

블둝 μŠ€νƒ ν”„λ ˆμž„μ€ 뭘까?

μ•„κΉŒ μœ„μ—μ„œ ν•œ 말 μ€‘μ—μ„œ μ€‘κ΄„ν˜Έκ°€ μ‹œμž‘ν•˜λŠ” λΆ€λΆ„μ—μ„œ μŠ€νƒν”„λ ˆμž„μ΄ μƒμ„±λ˜κ³  μ€‘κ΄„ν˜Έκ°€ λλ‚˜λŠ” λΆ€λΆ„μ—μ„œ μŠ€νƒν”„λ ˆμž„μ΄ μ’…λ£Œλœλ‹€. κΈ°μ–΅ ν•˜λŠ”κ°€?

 

λ©”μ„œλ“œκ°€ μ‹œμž‘λ  λ•Œ μ€‘κ΄„ν˜Έκ°€ μ‹œμž‘λ˜κΈ°λ„ ν•˜μ§€λ§Œ 또 μ€‘κ΄„ν˜Έκ°€ μƒκΈ°λŠ” 뢀뢄이 μžˆλ‹€.

 

κ·Έλ ‡λ‹€ λ°”λ‘œ νŠΉμ • 쑰건에 μ˜ν•΄ μˆ˜ν–‰λ˜λŠ” 쑰건문도 μ€‘κ΄„ν˜Έμ— 묢이게 λ˜λŠ”λ°, 이 것듀을 μ²˜λ¦¬ν•˜λŠ” 것이 λ°”λ‘œ 블둝 μŠ€νƒ ν”„λ ˆμž„ 이닀.

 

예제λ₯Ό λ°”λ‘œ ν™•μΈν•˜μž.

public class Post02_BlockStackFrame {
    public static void main(String[] args) {
        int val01 = 10;
        int val02 = 20;

        if(val01 == val02) {
            int sum = val01 + val02;
        }else{
            int minus = val01 - val02;
        }
    }
}

μœ„μ™€ 같은 μ½”λ“œλ₯Ό μ•„κΉŒμ™€ 같이 μ½”λ“œλ₯Ό μ½λŠ” μˆœμ„œμ— 따라 λΆ„λ₯˜ν•΄λ³΄μž.

 

  1. static μ˜μ—­μ— Post02_BlockStackFrame 이 ν• λ‹Ήλ˜λ©°, 내뢀에 main()λ©”μ„œλ“œκ°€ μƒμ„±λœλ‹€.
  2. 2번째 쀄이 λ˜μ—ˆμ„ λ•Œ, μŠ€νƒ ν”„λ ˆμž„μ— val01μ˜μ—­μ΄ 생기며 10이 ν• λ‹Ήλœλ‹€.
  3. 3번째 쀄이 λ˜μ—ˆμ„ λ•Œ, μŠ€νƒ ν”„λ ˆμž„μ— val02μ˜μ—­μ΄ 생기며 20이 ν• λ‹Ήλœλ‹€.
  4. 5번째 μ€„μ—μ„œ μ€‘κ΄„ν˜Έλ₯Ό λ§Œλ‚˜μ„œ μƒˆλ‘œμš΄ μŠ€νƒ ν”„λ ˆμž„ λΈ”λŸ­ if(true) λΈ”λŸ­μ„ μƒμ„±λœλ‹€.
  5. 6번째 μ€„μ—μ„œ μƒˆλ‘œμš΄ μŠ€νƒ ν”„λ ˆμž„ λΈ”λŸ­μ— sumμ΄λΌλŠ” λ³€μˆ˜κ°€ ν• λ‹Ήλ˜λ©° 계산 κ²°κ³Ό 값이 ν• λ‹Ήλœλ‹€.
  6. 7~9 쀄 κΉŒμ§€ 같은 과정이 λ°˜λ³΅λ˜λ‹€κ°€ μ€‘κ΄„ν˜Έκ°€ λλ‚˜κ²Œ 되면 μŠ€νƒ ν”„λ ˆμž„ λΈ”λŸ­μ΄ 사라진닀.

 

5번째 κΉŒμ§€ 결과와 6번째 κ²°κ³Όλ₯Ό 그림으둜 도식화 ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

μ™Όμͺ½μ€ μ–΄λ–€ 결과이고 였λ₯Έμͺ½μ€ μ–΄λ–€ 결과인지 λŒ“κΈ€λ‘œ 써주길 λ°”λž€λ‹€. γ…Žγ…Ž μƒν’ˆμ΄ μžˆμ„ μˆ˜λ„...

 

결과적으둜 μŠ€νƒ ν”„λ ˆμž„μ„ μ†Œλ©Έμ‹œν‚€λ©΄ μ‹œμŠ€ν…œμ˜ μžμ›μ„ μš΄μ˜μ²΄μ œμ—κ²Œ λ°˜λ‚©ν•œλ‹€.

 

λŒ“κΈ€