๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์ด๋ก /Study

๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ ํŠน์ง• OOP Memory

by 6161990 2021. 7. 15.

๐Ÿ“Œ ๊ฐ์ฒด ์ง€ํ–ฅ ์–ธ์–ด์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ์™€ ํŠน์ง• OOP Memory

 

๐Ÿ“ ์ •์  ๋ฉ”๋ชจ๋ฆฌ์™€ ๋™์  ๋ฉ”๋ชจ๋ฆฌ

  • ์ •์  ๋ฉ”๋ชจ๋ฆฌ : ์ด๋ฏธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ์žˆ๋Š” ๊ณ ์ •์  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค.
    • ํ”„๋กœ๊ทธ๋žจ ๊ตฌ๋™ ๋‚ด๋‚ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ํ•˜๋‚˜์˜ ์ •๋ณด๋ฅผ ์—ฌ๋Ÿฌ ๋Œ€์ƒ์ด ๊ณต์œ ํ•  ๋ชฉ์ ์ผ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
    • static์ด ์—ฌ๊ธฐ์— ํ•ด๋‹น๋œ๋‹ค.
  • ๋™์  ๋ฉ”๋ชจ๋ฆฌ : ์œ ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋ณ€ํ™”๋ฅผ ์ค„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ ์‹คํ–‰๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด๋‹ค.
    • HEAP ๋ฉ”๋ชจ๋ฆฌ ์ชฝ์— ๋ณ€์ˆ˜ ๋ฐฉ์„ ๋งŒ๋“ค๋”๋ผ๋„ ๊ทธ ๊ณต๊ฐ„์€ ๋ณ€์ˆ˜๋ช…์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ณต๊ฐ„์ด๋‹ค.
    • ์ฆ‰, ์ด๋ฆ„์œผ๋กœ ์ ‘๊ธ‰ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ทธ ๋ณ€์ˆ˜๋ฐฉ์ด ์žˆ๋Š” ์ฃผ์†Œ๋กœ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋”ฐ๋กœ ์‚ญ์ œ์— ๋Œ€ํ•œ ์ฝ”๋“œ๊ฐ€ ์—†์œผ๋ฉฐ garbage collection์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค.
    • HEAP, STACK ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์— ํ•ด๋‹นํ•œ๋‹ค.


๐Ÿ“ static vs. HEAP vs. STACK

 

1. static : main()์ด start ๋  ๋•Œ static ์˜ˆ์•ฝ์–ด๋กœ ์„ค์ •๋œ ํด๋ž˜์Šค ๋ณ€์ˆ˜, ํด๋ž˜์Šค ๋ฉ”์†Œ๋“œ๊ฐ€ ์ž๋™ ํ• ๋‹น๋˜๋Š” ๊ณต๊ฐ„.ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ ์ž๋™์†Œ๋ฉธ๋˜๋ฉฐ, ๋”ฑ ํ•œ๋ฒˆ์— ํ•œ ๊ฐœ๋งŒ ํ• ๋‹น๋˜๋ฏ€๋กœ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ๋™๋˜๋Š” ๋™์•ˆ ๊ณต์œ ํ•  ๋Œ€์ƒ์— ์ ์šฉ๋˜์–ด ์ด์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ

 

2. HEAP : new ์—ฐ์‚ฐ์ž์— ์˜ํ•ด ๋™์  ํ• ๋‹นํ•˜๊ณ  ์ƒ์„ฑ๋œ ์ฃผ์†Œ(์œ„์น˜์ •๋ณด)๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์ž๋ฐ”์—์„œ๋Š” ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค), ๋ฐฐ์—ด ๊ณต๊ฐ„์€ ๋ชจ๋‘ ์ด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ํ• ๋‹นํ•˜๋„๋ก ์ •ํ•ด์ ธ์žˆ์Œ.

 

3. STACK : non_static ๋ฉ”์†Œ๋“œ ์‹คํ–‰์‹œ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ ์Šคํƒ(method call stack)์— ๋ฉ”์†Œ๋“œ ์˜์—ญ์ด ํ• ๋‹น๋˜๋ฉฐ,ํ•ด๋‹น ๋ฉ”์†Œ๋“œ์˜ ์ง€์—ญ๋ณ€์ˆ˜์™€ ๋งค๊ฐœ๋ณ€์ˆ˜(parameter)๊ฐ€ ์˜์—ญ ์•ˆ์— ํ• ๋‹น๋จ. ๋ฉ”์†Œ๋“œ ๋ฆฌํ„ด(์ข…๋ฃŒ)์‹œ ์ž๋™ ์†Œ๋ฉธ๋จ.

 

 

๐Ÿ“ ๊ฐ์ฒด ํ• ๋‹น ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

  • ํด๋ž˜์Šค์— ์„ ์–ธ๋œ ํ•„๋“œ๋“ค์ด ์„ ์–ธ ์ˆœ์„œ๋Œ€๋กœ ํž™ ์˜์—ญ์— ๋ฐฐ์—ด์ฒ˜๋Ÿผ ์—ฐ์† ํ• ๋‹น๋˜๋ฉฐ, ์ƒ์„ฑ๋œ ์‹œ์ž‘ ์œ„์น˜(์ฃผ์†Œ)๊ฐ€ ์Šคํƒ์˜ ๋ ˆํผ๋Ÿฐ์Šค์— ์ €์žฅ๋œ๋‹ค.

 

๐Ÿ“ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์— ๋”ฐ๋ฅธ ๋ณ€์ˆ˜์˜ ์ข…๋ฅ˜

  • ์ง€์—ญ๋ณ€์ˆ˜ Local Variable (๋กœ์ปฌ๋ณ€์ˆ˜)๋ฉ”์†Œ๋“œ ์‹คํ–‰์‹œ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ํ• ๋‹น๋˜๋ฉฐ, ๋ฉ”์†Œ๋“œ ์˜์—ญ ๋‚ด์—์„œ๋งŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ฉ”์†Œ๋“œ ์ข…๋ฃŒ์‹œ ์ž๋™ ์†Œ๋ฉธ๋˜๋Š” ๋ณ€์ˆ˜
  • ํด๋ž˜์Šค๋ณ€์ˆ˜ class field (static๋ณ€์ˆ˜)ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ ์ •์ (์Šคํƒœํ‹ฑ) ๋ฉ”๋ชจ๋ฆฌ์— ์ž๋™ ํ• ๋‹น๋˜๋ฉฐ, ์ค€๋น„๋œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๊ณ , ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ ์†Œ๋ฉธ๋˜๋Š” ํ•„๋“œstatic ๋ณ€์ˆ˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋Š” ๋™์•ˆ ๊ณ„์† ๊ทธ ์˜์—ญ์„ ์ฐจ์ง€ํ•˜๋ฏ€๋กœ ๋„ˆ๋ฌด ํฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค.
  • ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ instance field (๋ฉค๋ฒ„๋ณ€์ˆ˜)new์— ์˜ํ•ด ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น๋˜๋ฉฐ, ๊ฐ์ฒด ์•ˆ์— ํ• ๋‹น๋˜๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜๋ฅผ ๋งํ•จ. ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ์— ์˜ํ•ด ๊ฐ์ฒด ์†Œ๋ฉธ์‹œ ํ•จ๊ป˜ ์‚ญ์ œ๋˜๋Š” ํ•„๋“œํด๋ž˜์Šค ๋‚ด๋ถ€์˜์—ฌ๋Ÿฌ ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ณ€์ˆ˜๋Š” ๋ฉค๋ฒ„๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.ํ•˜์ง€๋งŒ, ๋ฉค๋ฒ„๋ณ€์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์œผ๋ฉด ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ์‹œ ์“ธ๋ฐ์—†๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋œ๋‹ค.


๐Ÿšฉ ๊ธฐ๋ณธํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ฐธ์กฐํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜

  • ๊ธฐ๋ณธํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ : ๊ฐ’์„ ์ฝ๊ธฐ๋งŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.
public class ParameterTest {

   public static void main(String[] args) { 
   		Data d = new Data(); d.x = 10; 
        System.out.println("main:x=" + d.x); 
        change(d.x); 
        System.out.println("After change(d.x)");
        System.out.println("main:x=" + d.x); 
   } 
   //๊ธฐ๋ณธํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ์ฝ๊ธฐ๋งŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. 
   
   
   public static void change(int x) {
   		x = 1000; 
        System.out.println("change(): x="+x); 
   } 
   
  }

 

 

  • ์ฐธ์กฐํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ : ๊ฐ’์„ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋‹ค.
public class ParameterTest2 { 

	public static void main(String[] args) { 
    	Data d = new Data();
        d.x=10; 
        System.out.println("main():x"+d.x); 
        change(d); 
        System.out.println("After change(d.x)"); 
        System.out.println("main():x="+d.x); 
     } //์ฐธ์กฐํ˜• ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ์ฝ๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. 
     
	public static void change(Data d) { 
    	d.x=1000; 
        System.out.println("change():x="+d.x); 
    } 
 }

 

๐Ÿ“ static ์˜ˆ์•ฝ์–ด

  • ํ•„๋“œ์™€ ๋ฉ”์†Œ๋“œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ™์€ ํƒ€์ž…์˜ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๊ฐ€ ๊ณต์œ ํ•  ๋ชฉ์ ์ธ ๋Œ€์ƒ์— ์ ์šฉํ•˜๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ start์‹œ์— ์ •์  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ž๋™ ํ• ๋‹น๋œ๋‹ค.
  • { } : ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ดˆ๊ธฐํ™” ์‹œํ‚ค๋Š” ๋ธ”๋ก.
    • static ํ•„๋“œ ์ดˆ๊ธฐํ™”, ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘์‹œ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค
    • ์ธ์Šคํ„ด์Šค ๋ธ”๋ก : ์ธ์Šคํ„ด์Šค๋ณ€์ˆ˜ ์ดˆ๊ธฐํ™”, ๊ฐ์ฒด ์ƒ์„ฑ์‹œ๋งˆ๋‹ค ์ดˆ๊ธฐํ™”
์ ‘๊ทผ ์ œํ•œ์ž class ํด๋ž˜์Šค๋ช… { 
  ์ ‘๊ทผ์ œํ•œ์ž static ์ž๋ฃŒํ˜• ํ•„๋“œ๋ช…; //static
  ์ ‘๊ทผ์ œํ•œ์ž ์ž๋ฃŒํ˜• ํ•„๋“œ๋ช…; //์ธ์Šคํ„ด์Šค 
  static {ํ•„๋“œ : ์ดˆ๊ธฐ๊ฐ’}; //static
  {ํ•„๋“œ : ์ดˆ๊ธฐ๊ฐ’}  //์ธ์Šคํ„ด์Šค
}
  • static๊ณผ HEAP์˜ ๊ธฐ๋ณธ๊ฐ’JVM์— ์˜ํ•ด static๋ฉ”๋ชจ๋ฆฌ์™€ heap ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ํ• ๋‹น๋˜๋Š” ํ•„๋“œ์— ์ดˆ๊ธฐ๊ฐ’ ์„ ์–ธ์ด ์—†์„ ์‹œ์—๋Š” ์ค€๋น„๋œ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ž๋™ ์ดˆ๊ธฐํ™”๋จ.
    • boolean : false
    • char : '\u0000'
    • byte, short, int, long : 0
    • float, double : 0.0
    • reference : null

 

๐Ÿ“Œ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜• ๋ฐฐ์—ด[ ], 2์ฐจ์› ๋ฐฐ์—ด ๋ฉ”๋ชจ๋ฆฌ๊ตฌ์กฐ

  • ๋ฐฐ์—ด[][] ์˜ ์ฐจ์› ๊ฐฏ์ˆ˜๋Š” ์ฃผ์†Œ๋ฅผ ๋ช‡๋ฒˆ ์ฐธ์กฐํ•˜๋Š๋ƒ!! ๋‹ค.
  • 2์ฐจ์› ๋ฐฐ์—ด์€ ์‹œ์ž‘๋˜๋Š” ์ฃผ์†Œ๊ฐ’์„ 0x678(0x698) ๋ ˆํผ๋Ÿฐ์Šค์— ๊ธฐ๋กํ•˜๋˜, ๊ฐ 1์ฐจ์› ๋ฐฐ์—ด์˜ ์ฃผ์†Œ๋“ค์„ ๋‹ค์‹œ ๋ฐฐ์—ด(0x123)๋กœ ๋ฌถ์–ด์ฃผ๋Š” ํ˜•ํƒœ๋‹ค.=> 2์ฐจ์› ๋ฐฐ์—ด์€ ๋ ˆํผ๋Ÿฐ์Šค(์ฃผ์†Œ) ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋ฐฐ์—ด์ด๋‹ค.
  • ๋ณ€์ˆ˜ arr์€ ๋ ˆํผ๋Ÿฐ์Šค ๋ฐฐ์—ด์˜ ์‹œ์ž‘ ์œ„์น˜๊ฐ’์„ ๊ฐ€์งˆ ์œ„์น˜ ์ฐธ์กฐ ๋ณ€์ˆ˜๋‹ค.
    • ์ฐธ์กฐ ๋ณ€์ˆ˜ : ์ฃผ์†Œ(์œ„์น˜ ์ •๋ณด)๋ฅผ ๊ฐ€์ง€๊ณ  ํž™ ์˜์—ญ์— ๋Œ€์ƒ ์•ˆ์˜ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•œ๋‹ค.