IntellijIDEA์๋ JRE๊ฐ ์์ฑ๋ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๊ทธ๋ฆฌ๊ณ ๊ถ๊ทน์ ์ผ๋ก ์คํํ๋์ง ํ์ธํ ์ ์๋ ๋ฐ์ดํธ์ฝ๋ ํ์๋ผ๋ ํ๋ฅญํ ๊ธฐ๋ฅ์ด ์์ต๋๋ค.(๊ทธ๋ฌ๋ ์ด๋ ์ฝ๊ธฐ ์ฝ๋๋ก ์ปดํ์ผ๋ฌ๊ฐ ๊ธฐ๊ณ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ผ๋ถ ํด์ํ ๊ฒ์ด๊ธฐ๋ ํฉ๋๋ค.) ๋ฐ์ดํธ ์ฝ๋ ํ์ ๊ธฐ๋ฅ์ ์ปดํ์ผ๋ .class ํ์ผ์ ๋ถ์ํฉ๋๋ค. ๋ช
๋ น์ ๋ํ ์ค๋ช
์ Wikipedia ๋งํฌ์์ ์ฐพ์ ์ ์์ต๋๋ค .
๋ฐ๋ผ์ ๋์ผํ ๋ผ์ธ์ ์ด๊ธฐํํ์ฌ ๋ ๊ฐ์ง ๋ฒ์ ์ ๊ธฐ๋ณธ ๋ฉ์๋์ ๋ํ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋์ง ๋ช ํํ ํ๋ ค๋ ์์ด๋์ด๊ฐ ๋ ์ฌ๋์ต๋๋ค. ์ต์ 1: (str1==str2๋ฅผ ๋น๊ตํ๋ฉด false๊ฐ ๋ฉ๋๋ค.) ์ต์ 2 : (str3== str4 ๋ฅผ ๋น๊ตํ๋ฉด
๋ฐ๋ผ์ ๋์ผํ ๋ผ์ธ์ ์ด๊ธฐํํ์ฌ ๋ ๊ฐ์ง ๋ฒ์ ์ ๊ธฐ๋ณธ ๋ฉ์๋์ ๋ํ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ ์ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๋์ง ๋ช ํํ ํ๋ ค๋ ์์ด๋์ด๊ฐ ๋ ์ฌ๋์ต๋๋ค. ์ต์ 1: (str1==str2๋ฅผ ๋น๊ตํ๋ฉด false๊ฐ ๋ฉ๋๋ค.) ์ต์ 2 : (str3== str4 ๋ฅผ ๋น๊ตํ๋ฉด
public static void main(String[] args){ String str1 = new String("test"); String str2 = new String("test"); }
true๊ฐ ๋ฉ๋๋ค.) public static void main(String[] args){ String str3 = "test"; String str4 = "test"; }
์ฒซ ๋ฒ์งธ ์ต์
์ ๋ฐ์ดํธ ์ฝ๋(๋๊ดํธ [] ์์๋ ๋ช
๋ น์ด ์คํ๋ ํ ์คํ ์ํ๊ฐ ํ์๋ฉ๋๋ค(์ค๋ฅธ์ชฝ ์คํ ์๋จ)). ๋ ๋ฒ์งธ ์ต์
์ ๋ฐ์ดํธ์ฝ๋: ์์ธํ ๋ด์ฉ์ ๋ณผ ์ ์๋ ๋งํฌ: src1: http://cs.au.dk/~mis /dOvs/jvmspec/ref--33.html src2: http://mihaimoldovan.com/download/Inside- Java-Virtual-Machine.pdf src3: http://en.wikipedia.org/wiki/Java_class_file#The_constant_pool src4: http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings src5: http://stackoverflow.com/questions /10209952/java-constant-pool src6: http://stackoverflow.com/questions/14150628/string-constant -pool-java ๊ทธ๋ฌ๋ฉด ์ ํ ๊ฒฝ์ฐ์๋ ๋ฌธ์์ด์ด ๊ฐ๊ณ ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ ๋์ผํ์ง ์์ต๋๊น? new String์ ๊ฒฝ์ฐ ๋ฌธ์์ด ์์ ํ์ด ๋ฌด์๋๊ณ ๋ฌธ์์ด์ ์ ๋ณต์ฌ๋ณธ์ด ์์ฑ๋๊ธฐ ๋๋ฌธ์
๋๋ค(์ด์ ๋ํ ๋งํฌ src6). ๋ฐ์ดํธ์ฝ๋๊ฐ ์ด๋ฅผ ๋ช
ํํ ํ๋ ๋ฐ ์ค์ ๋ก ๋์์ด ๋์ง๋ ์์์ง๋ง ๋ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ ๋ ์ ์ ์์
์ ์ํํ๋ฏ๋ก ์ด ์ต์
์ด ๋ ๋ซ๋ค๋ ๊ฒ์ ๋ถ๋ช
ํฉ๋๋ค. public static main([Ljava/lang/String;)V L0 LINENUMBER 5 L0 NEW java/lang/String //ะฝะพะฒะฐั ัััะพะบะฐ - ะบะปะฐะดะตะผ ัััะปะบั ะฝะฐ ะบะปะฐัั "String "ะฝะฐ ะฒะตััะธะฝั ััะตะบะฐ: [value_string] DUP //ะบะพะฟะธััะตะผ ัััะปะบั ะฝะฐ ะฒะตััะธะฝะต ััะตะบะฐ: [value_string, value_string] LDC "test" //ะบะปะฐะดัะผ ะฒ ััะตะบ ัััะปะบั ะฝะฐ "test" ะธะท constant pool(ะฐ ะตัะปะธ ะฒ ะฝัะผ ะตัะต ะฝะตั ัััะปะบะธ ะฝะฐ "test", //ัะพ ะพะฝะฐ ัะฐะบะถะต ะพััะฐะตััั ะฒ constant pool'e): [value_string, value_string, value_test] INVOKESPECIAL java/lang/String.
(Ljava/lang/String;)V //ะฒัะทะพะฒ new ะดะปั String ั ะฐัะณัะผะตะฝัะฐะผะธ ั ะฒะตััะธะฝั ััะตะบะฐ - //ะฟะพัะปะต ะฒัะทะพะฒะฐ ะธะฝะธัะธะฐะปะธะทะธััััะตะณะพ ะผะตัะพะดะฐ ะดะปั ัััะธะฝะณ(ะธ ะตะณะพ ะฒะฝัััะตะฝะฝะธั
ะผะฐะฝะธะฟัะปััะธะน ัะพ ััะตะบะพะผ, //ะบะพัะพััะต ะฐะฝะฐะปะพะณะธัะฝะพ ะผะพะถะฝะพ ะฟะพัะผะพััะตัั ะฒ bytecodeะต java.lang.String ) //- ะฒ ััะตะบะต ะฑัะดะตั link ะฝะฐ ะฟัะพะธะฝะธัะธะฐะปะธะทะธัะพะฒะฐะฝะฝัั ัััะพะบั: [value_result_string] //ะะพัะตะผั ะดะปั ะธะฝะธัะธะฐะปะธะทะฐัะธะธ String(String) ะฝัะถะฝะพ ััะธ ะฐัะณัะผะตะฝัะฐ ะฒ ััะตะบะต: //1)link ะฝะฐ ะฒั
ะพะดะฝะพะน ะฐัะณัะผะตะฝั 2)ะฝะพะฒะฐั ัััะพะบะฐ, 3)ั
ะตัcode ัััะพะบะธ ASTORE 1 //ัะพั
ัะฐะฝัะตะผ ัััะปะบั ั ะฒะตััะธะฝั ััะตะบะฐ ะฒ ะปะพะบะฐะปัะฝัั ะฟะตัะตะผะตะฝะฝัั(1) ั ะฒะตััะธะฝั ััะตะบะฐ: [ ] L1 LINENUMBER 6 L1 NEW java/lang/String //ะฐะฝะฐะปะพะณะธัะฝะพ ะฟะตัะฒะพะน ัััะพะบะต DUP LDC "test" INVOKESPECIAL java/lang/String.
(Ljava/lang/String;)V ASTORE 2 L2 LINENUMBER 7 L2 RETURN //return void - ะบะพะผะฟะธะปััะพั ะดะพะฟะธััะฒะฐะตั ะทะฐ ะฝะฐั ะตัะปะธ ะผะตัะพะด ะฒะพะทะฒัะฐัะฐะตั void L3 LOCALVARIABLE args [Ljava/lang/String; L0 L3 0 // ัะฟะธัะพะบ ะปะพะบะฐะปัะฝัั
ะฟะตัะตะผะตะฝะฝัั
ะผะตัะพะดะฐ LOCALVARIABLE str3 Ljava/lang/String; L1 L3 1 // L1(ะผะตัะบะฐ ะณะดะต ะพะฟะตัะฐัะธะธ ั ะปะพะบะฐะปัะฝะพะน ะฟะตัะตะผะตะฝะฝะพะน) L3(ะผะตัะบะฐ ะณะดะต ะพะฟะธัะฐะฝะธะต ััะพ ััะพ ะทะฐ ะปะพะบะฐะปัะฝะฐั ะฟะตัะตะผะตะฝะฝะฐั) 1(ะฝะพะผะตั ะปะพะบะฐะปัะฝะพะน ะฟะตัะตะผะตะฝะฝะพะน) LOCALVARIABLE str4 Ljava/lang/String; L2 L3 2 // MAXSTACK = 3 //ะผะฐะบัะธะผะฐะปัะฝะฐั ะณะปัะฑะธะฝะฐ ััะตะบะฐ ะผะตัะพะดะฐ MAXLOCALS = 3 //ะบะพะปะธัะตััะฒะพ ะปะพะบะฐะปัะฝัั
ะฟะตัะตะผะตะฝะฝัั
ะผะตัะพะดะฐ // //ะขะพ ะตััั ัะฝะฐัะฐะปะฐ JRE ะฑัะดะตั ะฒัะดะตะปััั ะฟะฐะผััั ะฟัะธ //ะฒัะทะพะฒะต ะผะตัะพะดะฐ ััะธััะฒะฐั ะฒัั ะฒะปะพะถะตะฝะฝะพััั ะฒัะทะพะฒะพะฒ ะผะตัะพะดะพะฒ ะธ new - ะธะฝะธัะธะฐะปะธะทะฐัะธะน //(ะธ ะตัะปะธ ะตั ะฝะต ั
ะฒะฐัะธั - ัะพ ะฒัั ะฒัะปะตัะธั ั Howะธะผ-ะฝะธะฑัะดั OutOfMemory //ัะบัะตะฟัะฝะพะผ), ะฐ ัะพะปัะบะพ ะฟะพัะพะผ ะฑัะดัั ะฟัะพะธะทะฒะพะดะธัััั ะพะฟะตัะฐัะธะธ
public static main([Ljava/lang/String;)V L0 LINENUMBER 5 L0 LDC "test" //ะฑะตัะตะผ ัััะปะบั ะฝะฐ "test" ะธะท constant_pool ะธ ะบะปะฐะดะตะผ ะฝะฐ ะฒะตััะธะฝั ััะตะบะฐ: [value_test] ASTORE 1 //ะทะฐะฑะธัะฐะตะผ ัััะปะบั ั ะฒะตััะธะฝั ััะตะบะฐ ะฒ ะฟะตัะตะผะตะฝะฝัั(1) str1 : [ ] L1 LINENUMBER 6 L1 LDC "test" //ะฑะตัะตะผ ัััะปะบั ะฝะฐ "test" ะธะท constant_pool ะธ ะบะปะฐะดะตะผ ะฝะฐ ะฒะตััะธะฝั ััะตะบะฐ: [value_test] ASTORE 2 //ะทะฐะฑะธัะฐะตะผ ัััะปะบั ั ะฒะตััะธะฝั ััะตะบะฐ ะฒ ะฟะตัะตะผะตะฝะฝัั(2) str2: [ ] L2 LINENUMBER 7 L2 RETURN //return void (ะบะพัะพััะน ะบะพะผะฟะธะปััะพั ะดะพะฟะธััะฒะฐะตั ะทะฐ ะฝะฐั How ััะฟะตัะฝัะน ะบะพะฝะตั ะผะตัะพะดะฐ) L3 LOCALVARIABLE args [Ljava/lang/String; L0 L3 0 //ัะฟะธัะพะบ ะปะพะบะฐะปัะฝัั
ะฟะตัะตะผะตะฝะฝัั
, ะฟะพะด ะบะพัะพััะต ะฒัะดะตะปัะตััั ะฟะฐะผััั LOCALVARIABLE str1 Ljava/lang/String; L1 L3 1 //ะฝะฐะฟัะธะผะตั: L1(ะผะตัะบะฐ ะณะดะต ะทะฐะฟะธัะฐะฝ code) L3(ะผะตัะบะฐ ะณะดะต ะพะฟะธัะฐะฝ ัะธะฟ an object ะธ ะฒัะดะตะปัะตััั ะฟะฐะผััั) 1(ะปะพะบะฐะปัะฝัะน ะฝะพะผะตั an object) LOCALVARIABLE str2 Ljava/lang/String; L2 L3 2 // MAXSTACK = 1 //ะผะฐะบัะธะผะฐะปัะฝะฐั ะณะปัะฑะธะฝะฐ ััะตะบะฐ ะดะปั ะผะตัะพะดะฐ MAXLOCALS = 3 //ะบะพะปะธัะตััะฒะพ ะปะพะบะฐะปัะฝัั
ะฟะตัะตะผะตะฝะฝัั
ะผะตัะพะดะฐ
GO TO FULL VERSION