๐Ÿ•‹

JVM - ๋ฉ”๋ชจ๋ฆฌ, Call by value (1)

 
 

JVM์€ ์–ด๋–ป๊ฒŒ ์‹คํ–‰ ๋˜๋Š”๊ฐ€?

Java Code โ†’ .class โ†’ JVM ์œ„์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

JVM์ด .class๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ ˆ์ฐจ

  1. ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ์ฐพ๋Š”๋‹ค.
  1. ์ฐพ์œผ๋ฉด ํด๋ž˜์Šค ๋‚ด๋ถ€์˜ static ํ‚ค์›Œ๋“œ๊ฐ€ ์žˆ๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ method area โ†’ static zone์— ๋กœ๋”ฉ ๋ฉ๋‹ˆ๋‹ค.
  1. main() ๋ฉ”์†Œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹คํ–‰๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Stack์— main์ด ๋“ค์–ด๊ฐ€๊ณ , ์–˜๊ฐ€ ๋น„์›Œ์ง€๋ฉด ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ!

๐Ÿ“Œ Method Area

  • method์˜ byte code๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ
  • static vs none-static ์œผ๋กœ ๋‚˜๋ˆ ์ง‘๋‹ˆ๋‹ค.

JRE Java Runtime Evironment

  • JVM
  • Java Class Libraries
  • Class Loader

JVM Memory ํ• ๋‹น ๋ฐฉ์‹

๐Ÿ—ƒ Stack

  • Primitive ํƒ€์ž… ๋ณ€์ˆ˜๋“ค์ด ์ €์žฅ ๋ฉ๋‹ˆ๋‹ค.
  • ์ข์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„
  • ๊ฐ Thread๋Š” ์ž์‹ ๋งŒ์˜ Stack์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๊ฐ ์Šค๋ ˆ๋“œ์—์„œ๋Š” ๋‹ค๋ฅธ Stack ์˜์—ญ์—๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • ์ง€์—ญ ๋ณ€์ˆ˜๋“ค์€ scope์— ๋”ฐ๋ฅธ visibility๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

๐Ÿ“ฆ Heap

  • ๋ณต์žกํ•œ ํƒ€์ž…์˜ ํด๋ž˜์Šค ํƒ€์ž…, Interface, ArrayType ๋ณ€์ˆ˜๋“ค์ด ์ €์žฅ
  • new ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ์˜์—ญ
  • ๋„“์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ๊ฐ’์„ ํ• ๋‹น, ํ•ด์ œํ•˜๋Š”๋ฐ ๋งŽ์€ ๋น„์šฉ์ด ๋“ญ๋‹ˆ๋‹ค. (์ž์ฃผ ํ•˜๋ฉด Stack ๋ณด๋‹ค ์ˆ˜์‹ญ๋ฐฐ์˜ ๋น„์šฉ...?)
  • ๋ช‡๊ฐœ์˜ Thread๊ฐ€ ์กด์žฌํ•˜๋“  ์ƒ๊ด€์—†์ด ๋‹จ ํ•˜๋‚˜์˜ heap์˜์—ญ๋งŒ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • Heap ์˜์—ญ์— ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ ˆํผ๋Ÿฐ์Šค ๋ณ€์ˆ˜๊ฐ€ stack์— ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ

Wrapper Class - Integer, Double, String...
์ด๋“ค์€ ๋ชจ๋‘ Immutable ํ•ฉ๋‹ˆ๋‹ค. Heap์— ์žˆ๋Š” ๊ฐ™์€ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ ˆํผ๋Ÿฐ์Šค ํ•˜๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋„, ์ƒˆ๋กœ์šด ์—ฐ์‚ฐ์ด ์ ์šฉ๋œ ์ˆœ๊ฐ„! ์ƒˆ๋กœ์šด ์˜ค๋ธŒ์ ํŠธ๊ฐ€ Heap์— ํ• ๋‹น ๋ฉ๋‹ˆ๋‹ค.
// โ“ ๋ฌธ์ œ1. after a์˜ ๊ฒฐ๊ณผ ์ถœ๋ ฅ๊ฐ’์€? @Test void printReferenceInteger() { Integer a = 10; System.out.println("before: " + a); changeInteger(a); System.out.println("after: " + a); } private void changeInteger(Integer num) { num += 10; } // โ“ ๋ฌธ์ œ2. after s์˜ ๊ฒฐ๊ณผ ์ถœ๋ ฅ๊ฐ’์€? @Test void printReferenceString() { String s = "hello"; changeString(s); System.out.println(s); } private static void changeString(String str) { str += " world"; }
์œ„์˜ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋ฌธ์ œ 1 : after: 10 ๋ฌธ์ œ 2 : hello
์™“๋”...!? ๋ณ€ํ•˜์ง€ ์•Š์•˜๋‹ค. ๋จธ์„ 129 ๐Ÿค”
์•„๋ž˜์˜ ๊ทธ๋ฆผ์„ ์‚ดํŽด๋ด…์‹œ๋‹ค.
notion image
  1. ์ฒ˜์Œ์— a ๋ณ€์ˆ˜์— 10์ด ํ• ๋‹น๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ด๊ฒƒ์€ ์ฒ˜์Œ์— 10์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)
  1. changeInteger()์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜์–ด๊ฐ„ ์ˆœ๊ฐ„ ๋งค๊ฐœ๋ณ€์ˆ˜ num์ด a๋ฅผ ๋ณต์ œํ•˜์—ฌ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. (num์€ ์ฒ˜์Œ์—๋Š” a์™€ ๊ฐ™์ด 10์„ ์ฐธ์กฐ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.)
  1. ํ•˜์ง€๋งŒ += 10 ์ด๋ผ๋Š” ์—ฐ์‚ฐ์„ ํ•˜๋Š” ์ˆœ๊ฐ„, Heap์— ์—ฐ์‚ฐ๋œ 20์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐ’์ด ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (num์€ ์ด์ œ 20์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜์ฃ .)
๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฒ—์–ด๋‚˜๊ฒŒ ๋˜๋ฉด, num์ด๋ผ๋Š” ๊ฐ’์€ stack์—์„œ ์‚ฌ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. method๋ผ๋Š” ์ง€์—ญ์—์„œ ๋ฒ—์–ด๋‚ฌ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .
๋ณด์‹œ๋‹ค์‹œํ”ผ a๋ผ๋Š” ๋…€์„์€ ์—ฌ์ „ํžˆ 10์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์€ ์ฑ„๋กœ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์˜ต๋‹ˆ๋‹ค.

Java๋Š” ๋ฌด์กฐ๊ฑด Call by value์ด๋‹ค?

Java์—๋Š” Call by reference๊ฐ€ ์—†๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„์„œ ๊ฐ’์ด ๋ณ€ํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”?
class Sample { public int value; Sample(int num) { value = num; } } class Main { public static void main(String[] args) { Sample sam = new Sample(10); run(sam); System.out.println(sam.value); // ๐Ÿ”Ž ์–ด๋–ค ๊ฐ’์ด ์ถœ๋ ฅ ๋ ๊นŒ์š”? } static void run(Sample sample) { sample.value = 20; } }
๊ฒฐ๊ณผ๊ฐ’์€ 20์ธ ๊ฐ’์ด ์ถœ๋ ฅ ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ Call by reference์ธ๊ฒƒ ์•„๋‹Œ๊ฐ€?! โ†’ ์•„๋‹™๋‹ˆ๋‹ค.
  1. ์ผ๋‹จ Stack์— sam์ด๋ผ๋Š” ๊ฐ’์ด ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. (Heap์—๋Š” 10์ด๋ผ๋Š” ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๊ฒ ์ฃ ?)
  1. ๊ทธ๋ฆฌ๊ณ  run() ๋ฉ”์„œ๋“œ๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด sample์ด๋ผ๋Š” ๋ณ€์ˆ˜๊ฐ€ stack์— ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ sample์€ sam์ด ๊ฐ€์ง€๋Š” ์ฃผ์†Œ๊ฐ’์„ ๋ณต์ œํ•˜์—ฌ ์ƒ์„ฑ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ sample์˜ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด, sam์ด ๊ฐ€๋ฆฌํ‚ค๋Š” 10์ด๋ผ๋Š” primitive๊ฐ’์— ์ ‘๊ทผํ•˜์—ฌ 20์œผ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ์ฃผ์†Œ๋ผ๋Š” ๊ฐ’์„ ๋ณต์ œํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—, ๋ณ€๊ฒฝ์ด ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰ ์ด๊ฑด Call by value๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์€? 'Java์— Call by reference๋Š” ์—†๋‹ค.' ์ž…๋‹ˆ๋‹ค.

๐Ÿ”– ์ฐธ๊ณ