JVM์ ๋ฉ๋ชจ๋ฆฌ ์ดํด
์ด๋ฏธ ์๊ณ ์๋ฏ์ด JVM์ ์์ฒด์ ์ผ๋ก Java ํ๋ก๊ทธ๋จ์ ์คํํฉ๋๋ค. ๋ค๋ฅธ ๊ฐ์ ๋จธ์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ฒด ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์ฑ ์์คํ ์ด ์์ต๋๋ค.
๋ด๋ถ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ Java ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ํ๋ ๋ฐฉ์์ ๋ํ๋ ๋๋ค. ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ์์ฉ ํ๋ก๊ทธ๋จ ๋ฐ ์๊ณ ๋ฆฌ์ฆ ์๋์ ๋ณ๋ชฉ ํ์์ ์๋ณํ ์ ์์ต๋๋ค. ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ด ์๋ค.
์ค์ํ! ์๋ Java ๋ชจ๋ธ์ด ์ถฉ๋ถํ์ง ์์ Java 1.5์์ ์์ ๋์์ต๋๋ค. ์ด ๋ฒ์ ์ ์ค๋๋ ๊น์ง ์ฌ์ฉ๋ฉ๋๋ค(Java 14+).
์ค๋ ๋ ์คํ
JVM์ด ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ Java ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค๋ ๋ ์คํ๊ณผ ํ์ผ๋ก ๋๋๋๋ค. ๋ ผ๋ฆฌ์ ์ผ๋ก ๋ธ๋ก์ผ๋ก ๋๋์ด์ง Java ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
JVM์์ ์คํ๋๋ ๋ชจ๋ ์ค๋ ๋ ์๋ ์์ฒด ์คํ์ด ์์ต๋๋ค . ์คํ์ ์ฐจ๋ก๋ก ์ค๋ ๋๊ฐ ํธ์ถํ ๋ฉ์๋์ ๋ํ ์ ๋ณด๋ฅผ ๋ณด์ ํฉ๋๋ค. ์ด๊ฒ์ "์ฝ ์คํ"์ด๋ผ๊ณ ๋ถ๋ฅด๊ฒ ์ต๋๋ค. ์ค๋ ๋๊ฐ ์ฝ๋๋ฅผ ์คํํ์๋ง์ ํธ์ถ ์คํ์ด ๋ค์ ์์๋ฉ๋๋ค.
์ค๋ ๋ ์คํ์๋ ์ค๋ ๋ ์คํ์์ ๋ฉ์๋๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๋ก์ปฌ ๋ณ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ค๋ ๋๋ ์์ฒด ์คํ์๋ง ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ง์ญ ๋ณ์๋ ๋ค๋ฅธ ์ค๋ ๋์์๋ ๋ณผ ์ ์์ผ๋ฉฐ ๋ณ์๋ฅผ ์์ฑํ ์ค๋ ๋์์๋ง ๋ณผ ์ ์์ต๋๋ค. ๋ ์ค๋ ๋๊ฐ ๋์ผํ ์ฝ๋๋ฅผ ์คํํ๋ ์ํฉ์์ ๋ ๋ค ์์ฒด ๋ก์ปฌ ๋ณ์๋ฅผ ์์ฑํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฐ ์ค๋ ๋๋ ๊ฐ ๋ก์ปฌ ๋ณ์์ ์์ฒด ๋ฒ์ ์ ๊ฐ์ต๋๋ค.
๊ธฐ๋ณธ ์ ํ์ ๋ชจ๋ ๋ก์ปฌ ๋ณ์( boolean , byte , short , char , int , long , float , double )๋ ์ ์ ์ผ๋ก ์ค๋ ๋ ์คํ์ ์ ์ฅ๋๋ฉฐ ๋ค๋ฅธ ์ค๋ ๋์์๋ ๋ณผ ์ ์์ต๋๋ค. ํ ์ค๋ ๋๋ ๊ธฐ๋ณธ ๋ณ์์ ๋ณต์ฌ๋ณธ์ ๋ค๋ฅธ ์ค๋ ๋์ ์ ๋ฌํ ์ ์์ง๋ง ๊ธฐ๋ณธ ์ง์ญ ๋ณ์๋ฅผ ๊ณต์ ํ ์๋ ์์ต๋๋ค.
๋๋ฏธ
ํ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ ์ค๋ ๋์ ๊ด๊ณ์์ด ์์ฉ ํ๋ก๊ทธ๋จ์์ ๋ง๋ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ํฌํจ๋ฉ๋๋ค. ์ฌ๊ธฐ์๋ ๊ธฐ๋ณธ ์ ํ์ ๋ํผ(์: Byte , Integer , Long ๋ฑ)๊ฐ ํฌํจ๋ฉ๋๋ค. ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด ์ง์ญ ๋ณ์์ ํ ๋น๋์๋์ง ๋๋ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ฉค๋ฒ ๋ณ์๋ก ์์ฑ๋์๋์ง๋ ์ค์ํ์ง ์์ผ๋ฉฐ ํ์ ์ ์ฅ๋ฉ๋๋ค.
์๋๋ ๊ฐ์ฒด(ํ์ ์ ์ฅ๋จ)๋ฟ๋ง ์๋๋ผ ํธ์ถ ์คํ ๋ฐ ๋ก์ปฌ ๋ณ์(์คํ์ ์ ์ฅ๋จ)๋ฅผ ๋ณด์ฌ์ฃผ๋ ๋ค์ด์ด๊ทธ๋จ์ ๋๋ค.
๋ก์ปฌ ๋ณ์๊ฐ ๊ธฐ๋ณธ ์ ํ์ธ ๊ฒฝ์ฐ ์ค๋ ๋์ ์คํ์ ์ ์ฅ๋ฉ๋๋ค.
์ง์ญ ๋ณ์๋ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ๋ ์๋ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ ์ฐธ์กฐ(๋ก์ปฌ ๋ณ์)๋ ์ค๋ ๋ ์คํ์ ์ ์ฅ๋์ง๋ง ๊ฐ์ฒด ์์ฒด๋ ํ์ ์ ์ฅ๋ฉ๋๋ค.
๊ฐ์ฒด์๋ ๋ฉ์๋๊ฐ ํฌํจ๋๋ฉฐ ์ด๋ฌํ ๋ฉ์๋์๋ ์ง์ญ ๋ณ์๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ฉ์๋๋ฅผ ์์ ํ ๊ฐ์ฒด๊ฐ ํ์ ์ ์ฅ๋์ด ์๋๋ผ๋ ์ด๋ฌํ ์ง์ญ ๋ณ์๋ ์ค๋ ๋ ์คํ์๋ ์ ์ฅ๋ฉ๋๋ค.
๊ฐ์ฒด์ ๋ฉค๋ฒ ๋ณ์๋ ๊ฐ์ฒด ์์ฒด์ ํจ๊ป ํ์ ์ ์ฅ๋ฉ๋๋ค. ์ด๋ ๋ฉค๋ฒ ๋ณ์๊ฐ ๊ธฐ๋ณธ ์ ํ์ผ ๋์ ๊ฐ์ฒด ์ฐธ์กฐ์ผ ๋ ๋ชจ๋ ํด๋น๋ฉ๋๋ค.
์ ์ ํด๋์ค ๋ณ์๋ ํด๋์ค ์ ์์ ํจ๊ป ํ์ ์ ์ฅ๋ฉ๋๋ค.
๊ฐ์ฒด์์ ์ํธ ์์ฉ
ํ์ ๊ฐ์ฒด๋ ํด๋น ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ์๋ ๋ชจ๋ ์ค๋ ๋์์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ค๋ ๋๊ฐ ๊ฐ์ฒด์ ์ก์ธ์คํ ์ ์์ผ๋ฉด ๊ฐ์ฒด์ ๋ณ์์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๋ ์ค๋ ๋๊ฐ ๋์์ ๊ฐ์ ๊ฐ์ฒด์์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๋ ๋ค ๊ฐ์ฒด์ ๋ฉค๋ฒ ๋ณ์์ ์ก์ธ์คํ ์ ์์ง๋ง ๊ฐ ์ค๋ ๋๋ ๊ณ ์ ํ ๋ก์ปฌ ๋ณ์ ๋ณต์ฌ๋ณธ์ ๊ฐ๊ฒ ๋ฉ๋๋ค.
๋ ์ค๋ ๋์๋ ์ง์ญ ๋ณ์ ์ธํธ๊ฐ ์์ต๋๋ค.์ง์ญ ๋ณ์ 2ํ์ ๊ณต์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค(๊ฐ์ฒด 3). ๊ฐ ์ค๋ ๋์๋ ์์ฒด ์ฐธ์กฐ๊ฐ ์๋ ๋ก์ปฌ ๋ณ์์ ์์ฒด ๋ณต์ฌ๋ณธ์ด ์์ต๋๋ค. ํด๋น ์ฐธ์กฐ๋ ์ง์ญ ๋ณ์์ด๋ฏ๋ก ์ค๋ ๋ ์คํ์ ์ ์ฅ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ๊ฐ ํ์ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํต๋๋ค.
์ผ๋ฐ์ฌํญ์ด๋ ์ฐธ๊ณ ํ์ธ์๊ฐ์ฒด 3์ ๋ํ ๋งํฌ๊ฐ ์์ต๋๋ค๊ฐ์ฒด 2๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด 4๋ฉค๋ฒ ๋ณ์๋ก(ํ์ดํ๋ก ํ์). ์ด ๋งํฌ๋ฅผ ํตํด ๋ ๊ฐ์ ์ค๋ ๋๊ฐ ์ก์ธ์คํ ์ ์์ต๋๋ค.๊ฐ์ฒด 2๊ทธ๋ฆฌ๊ณ ๋ฌผ์ฒด4.
๋ค์ด์ด๊ทธ๋จ์ ๋ํ ๋ก์ปฌ ๋ณ์(์ง์ญ ๋ณ์ 1methodTwo ์์ ). ๊ฐ ์ฌ๋ณธ์๋ ์๋ก ๋ค๋ฅธ ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ก ๋ค๋ฅธ ์ฐธ์กฐ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค(๊ฐ์ฒด 1๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด 5) ๊ฐ์ ๊ฒ์ด ์๋๋๋ค. ์ด๋ก ์ ์ผ๋ก ๋ ์ค๋ ๋๋ ๋ ๋ค ์ก์ธ์คํ ์ ์์ต๋๋ค.๊ฐ์ฒด 1, ๊ทธ๋์๊ฐ์ฒด 5์ด ๋ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ์๋ ๊ฒฝ์ฐ. ๊ทธ๋ฌ๋ ์์ ๋ค์ด์ด๊ทธ๋จ์์ ๊ฐ ์ค๋ ๋๋ ๋ ๊ฐ์ฒด ์ค ํ๋์ ๋ํ ์ฐธ์กฐ๋ง ๊ฐ์ง๊ณ ์์ต๋๋ค.
๊ฐ์ฒด์์ ์ํธ ์์ฉ์ ์
์ฝ๋์์ ์์ ์ ์์ฐํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
public class MySomeRunnable implements Runnable() {
public void run() {
one();
}
public void one() {
int localOne = 1;
Shared localTwo = Shared.instance;
//... do something with local variables
two();
}
public void two() {
Integer localOne = 2;
//... do something with local variables
}
}
public class Shared {
// store an instance of our object in a variable
public static final Shared instance = new Shared();
// member variables pointing to two objects on the heap
public Integer object2 = new Integer(22);
public Integer object4 = new Integer(44);
}
run() ๋ฉ์๋๋ one() ๋ฉ์๋๋ฅผ ํธ์ถ ํ๊ณ one() ๋ฉ์๋๋ two() ๋ฉ์๋ ๋ฅผ ํธ์ถํฉ๋๋ค .
one() ๋ฉ์๋๋ ๊ธฐ๋ณธ ์ง์ญ ๋ณ์(localOne) ์ ํ์ int ๋ฐ ์ง์ญ ๋ณ์(localTwo), ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ์ ๋๋ค.
one() ๋ฉ์๋๋ฅผ ์คํํ๋ ๊ฐ ์ค๋ ๋๋ ์์ฒด ๋ณต์ฌ๋ณธ์ ์์ฑํฉ๋๋ค.localOne๊ทธ๋ฆฌ๊ณ localTwo๋น์ ์ ์คํ์. ๋ณ์localOne์๋ก ์์ ํ ๋ถ๋ฆฌ๋์ด ๊ฐ ์ค๋ ๋์ ์คํ์ ์์ต๋๋ค. ํ ์ฐ๋ ๋๋ ๋ค๋ฅธ ์ฐ๋ ๋๊ฐ ์์ ์ ๋ณต์ฌ๋ณธ์ ์ด๋ค ๋ณํ๋ฅผ ์ฃผ๋์ง ๋ณผ ์ ์์ต๋๋ค.localOne.
one() ๋ฉ์๋๋ฅผ ์คํํ๋ ๊ฐ ์ค๋ ๋๋ ์์ฒด ๋ณต์ฌ๋ณธ๋ ์์ฑํฉ๋๋ค.localTwo. ๊ทธ๋ฌ๋ ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ์ฌ๋ณธlocalTwo๊ฒฐ๊ตญ ํ์ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค. ์ฌ์ค์localTwo์ ์ ๋ณ์๊ฐ ์ฐธ์กฐํ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด์ฌ๋ก. ์ ์ ๋ณ์์ ๋ณต์ฌ๋ณธ์ ํ๋๋ง ์์ผ๋ฉฐ ํด๋น ๋ณต์ฌ๋ณธ์ ํ์ ์ ์ฅ๋ฉ๋๋ค.
๊ทธ๋์ ๋ ์ฌ๋ณธ ๋ชจ๋localTwo๊ฒฐ๊ตญ ๋์ผํ Shared ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํต๋๋ค . Shared ์ธ์คํด์ค ๋ ํ์ ์ ์ฅ๋ฉ๋๋ค. ์ผ์นํฉ๋๋ค๊ฐ์ฒด 3์ ๋ค์ด์ด๊ทธ๋จ์์.
Shared ํด๋์ค ์๋ ๋ ๊ฐ์ ๋ฉค๋ฒ ๋ณ์๋ ํฌํจ๋์ด ์์ต๋๋ค. ๋ฉค๋ฒ ๋ณ์ ์์ฒด๋ ๊ฐ์ฒด์ ํจ๊ป ํ์ ์ ์ฅ๋ฉ๋๋ค. ๋ ๊ฐ์ ๋ฉค๋ฒ ๋ณ์๊ฐ ๋ค๋ฅธ ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํด์ ์. ์ด๋ฌํ ์ ์ ๊ฐ์ฒด๋ ๋ค์์ ํด๋นํฉ๋๋ค.๊ฐ์ฒด 2๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด 4๋ค์ด์ด๊ทธ๋จ์.
๋ํ two() ๋ฉ์๋๋ ์ด๋ฆ์ด ์ง์ ๋ ์ง์ญ ๋ณ์๋ฅผ ์์ฑํฉ๋๋ค.localOne. ์ด ์ง์ญ ๋ณ์๋ Integer ์ ํ์ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ์ ๋๋ค . ๋ฉ์๋๋ ๋งํฌ๋ฅผ ์ค์ ํฉ๋๋ค.localOne์๋ก์ด Integer ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํต๋๋ค . ๋งํฌ๋ ๋ณต์ฌ๋ณธ์ ์ ์ฅ๋ฉ๋๋ค.localOne๊ฐ ์ค๋ ๋์ ๋ํด. ๋ ๊ฐ์ Integer ์ธ์คํด์ค๊ฐ ํ์ ์ ์ฅ๋๋ฉฐ ๋ฉ์๋๊ฐ ์คํ๋ ๋๋ง๋ค ์๋ก์ด Integer ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ด ๋ฉ์๋๋ฅผ ์คํํ๋ ๋ ์ค๋ ๋๋ ๋ณ๋์ Integer ์ธ์คํด์ค๋ฅผ ์์ฑํฉ๋๋ค . ๊ทธ๋ค์ ์ผ์น๊ฐ์ฒด 1๊ทธ๋ฆฌ๊ณ ๊ฐ์ฒด 5์ ๋ค์ด์ด๊ทธ๋จ์์.
๊ธฐ๋ณธ ์ ํ์ธ Integer ์ ํ์ Shared ํด๋์ค ์ ์๋ ๋ ๊ฐ์ ๋ฉค๋ฒ ๋ณ์๋ ์ฃผ๋ชฉํ์ญ์์ค . ์ด๋ฌํ ๋ณ์๋ ๋ฉค๋ฒ ๋ณ์์ด๋ฏ๋ก ๊ฐ์ฒด์ ํจ๊ป ํ์ ๊ณ์ ์ ์ฅ๋ฉ๋๋ค. ์ค๋ ๋ ์คํ์๋ ๋ก์ปฌ ๋ณ์๋ง ์ ์ฅ๋ฉ๋๋ค.
GO TO FULL VERSION