์ฐ๋ฆฌ๋ Java ๊น์ด ์ดํด๋ณด๊ธฐ 01: Class์์ SimpleClass๋ฅผ ์ปดํ์ผํ๊ณ ๋ฐ์ดํธ์ฝ๋์ ์ผ๋ถ๋ฅผ ๋ณด์์ต๋๋ค. ์ค๋์ ์ด์ด์ ๋จ์ ๋ฐ์ดํธ์ฝ๋์ ๋ด์ฉ์ ์ดํด๋ณด๊ณ ์ ํฉ๋๋ค.
์ค๋ ๊ธ์ ์ฃผ์ ๋ชฉ์ ์ ์๋ฐ์ ํด๋์ค๊ฐ ์ด๋ป๊ฒ ๋ฐ์ดํธ ์ฝ๋๋ก ํํ๋๋์ง ์ดํดํ๋ ๊ฒ์
๋๋ค. ์์ ์ฝ๋๋ ์ง๋ ์๊ฐ๊ณผ ๋์ผํ๊ฒ ๋ค์์ SimpleClass.java์
๋๋ค.
public class SimpleClass {
public static void main(String[] args) {
System.out.println("Deep dive into Java");
int myData = 0x12345678;
System.out.println("My Data: " + myData);
}
}
SimpleClass.java๋ฅผ ์ปดํ์ผํ ๊ฒฐ๊ณผ๋ฌผ์ธ SimpleClass.class์ ๋ฐ์ดํธ์ฝ๋๋ฅผ (๊ฐ์ธ์ ์ผ๋ก ์ฒ์์ด์ ๋ง์ง๋ง์ผ๋ก ์ง๋ฃจํ์ง๋ง) ํ๋์ฉ ํ๋์ฉ ๊ผผ๊ผผํ ์ดํด๋ด
์๋ค.
๋จผ์ ๋ค์ ํ ๋ฒ ์ง๋ ๊ธ์์ ์ดํด๋ณธ ํด๋์ค ํฌ๋งท์ ๋ณด๊ฒ ์ต๋๋ค. JVM ๋ช ์ธ๋ ๋ค์๊ณผ ๊ฐ์ด ClassFile ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ณ ์์ต๋๋ค.
ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
u2 access_flags;
u2 this_class;
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
u2 fields_count;
field_info fields[fields_count];
u2 methods_count;
method_info methods[methods_count];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
์ ๊ตฌ์กฐ์์ u4, u2์ ์๋ฏธ๋ unsigned ๋ฐ์ดํธ ์๋ฅผ ๋งํฉ๋๋ค. SimpleClass.class ์ ๋ฐ์ดํธ์ฝ๋ ์ ๋ถ๋ถ์ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
0000000 ca fe ba be 00 00 00 34 00 2e 0a 00 0d 00 16 09
0000010 00 17 00 18 08 00 19 0a 00 1a 00 1b 03 12 34 56
0000020 78 07 00 1c 0a 00 06 00 16 08 00 1d 0a 00 06 00
0000030 1e 0a 00 06 00 1f 0a 00 06 00 20 07 00 21 07 00
...
์ด ๋ฐ์ดํธ์ฝ๋์์ ์ฐ๋ฆฌ๋ ์ต์ด 8๋ฐ์ดํธ ๋ด์ฉ๊น์ง ๋ค๋ค์ต๋๋ค. ํ๋ฒ ๋ ๋ณต์ตํ๋ฉด ๋ฐ์ดํธ์ฝ๋์ ์ต์ด 8๋ฐ์ดํธ๋ ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ์
๋๋ค.
๋ฉ์ด์ ๋ฒ์ ๋ค์ ๋ ๋ฐ์ดํธ 00 2E๋ฅผ ๋ช
์ธ๋ Constant Pool์ ์๋ก ์ ์ํ๊ณ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด Constant Pool์ ๋ญ๊น์?
Constant Pool์ Class์์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ฌ๋ณผ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ํ์ ๋๋ค. Constant Pool์๋ ์ฌ๋ฌ๋ถ์ด ์์ฑํ Java ์ฝ๋์ ๋ณ์, ๋ฌธ์์ด ๋ฆฌํฐ๋ด ๋ฑ์ ํฌํจํ์ฌ ์ปดํ์ผ๋ฌ๊ฐ ๋ณํํ ์ฝ๋์ ๋ํ ๋ชจ๋ ๋ด์ฉ์ ๋ด๊ณ ์์ต๋๋ค. ์ดํดํ๊ธฐ ์ฝ๊ฒ ํด๋์ค์์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ ๋ณด๋ฅผ ํ๋์ ๋ฐฐ์ด์ ๋ด์ ๋ฃ์๋ค๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
์ง๋ ์๊ฐ์ ์ ๊น ์ฌ์ฉํ๋ javap์ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด Constant Pool์ด ๋ฌด์์ธ์ง ํ๋์ ํ์
ํ ์ ์์ต๋๋ค. javap ์ ๊ฒฐ๊ณผ ์ค Constant Pool ๋ถ๋ถ๋ง ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Constant pool:
#1 = Methodref #13.#22 // java/lang/Object."":()V
#2 = Fieldref #23.#24 // java/lang/System.out:Ljava/io/PrintStream;
#3 = String #25 // Deep dive into Java
#4 = Methodref #26.#27 // java/io/PrintStream.println:(Ljava/lang/String;)V
#5 = Integer 305419896
#6 = Class #28 // java/lang/StringBuilder
#7 = Methodref #6.#22 // java/lang/StringBuilder."":()V
#8 = String #29 // My Data:
...
์ถ๋ ฅ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด #1 ๋ถํฐ ์์ํ์ฌ Constant Pool์ Constant ์ ๋ณด๊ฐ ๋์ด๋์ด ์์์ ์ ์ ์์ต๋๋ค. ์ ์ฒด Constant์ ์๋ ๋ฐ์ดํธ์ฝ๋์ ๋ช
์๋ Constant Pool์ ์์์ 1์ ๋บ ๊ฐ์
๋๋ค. ๊ทธ ์ด์ ๋ Constant Pool์ ์ธ๋ฑ์ค๊ฐ 1๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ๋ช
์ธ์์ ์ค๋ช
ํ๊ณ ์์ต๋๋ค. ๋ฌผ๋ก ์์ ClassFile์ ๊ตฌ์กฐ์์๋ constant_pool๋ฐฐ์ด์ ์ธ๋ฑ์ค์ -1์ด ๋ถ์ ๊ฒ์ ํตํด์๋ ์ ์ ์์ต๋๋ค.
์ด์ ๋ฐ์ดํธ์ฝ๋์ ๊ฐ์ ๋ณด๋ฉด 9-10๋ฒ์งธ ๋ฐ์ดํธ 00 2E๋ถ๋ถ์ด ๋ฐ๋ก SimpleClass.class์ Constant Pool ์๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด ๊ฐ์ 10์ง์๋ก ๋ฐ๊ฟ์ SimpleClass.class ์ Constant Pool ์์๊ฐ 45๊ฐ๋ผ๋ ๊ฒ์ ์๋ ค์ค๋๋ค.
๋ค์์ผ๋ก ์ค์ Pool์ ์๋งํผ Constant ์ ๋ณด๊ฐ ์กด์ฌํฉ๋๋ค. ClassFile ๊ตฌ์กฐ์์๋ ์ด ์ ๋ณด๋ฅผ cp_info ํ์
์ผ๋ก ํํํฉ๋๋ค. cp_info๋ ํ์
์ ๋ฐ๋ผ ๊ตฌ์กฐ๊ฐ ๋ค๋ฅด์ง๋ง ๊ณตํต์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ต๋๋ค.
cp_info {
u1 tag;
u1 info[];
}
์ฒซ ๋ฒ์งธ ๋ฐ์ดํธ์ธ tag ๊ฐ์ ๋ฐ๋ผ info ์ ๊ตฌ์กฐ๊ฐ ๋ค๋ฅด๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค. cp_info์ ํ์
์ ๋ช
์ธ์ ์์ธํ๊ฒ ์ ์๋์ด ์์ต๋๋ค. ๊ฐ๋ตํ๊ฒ ๋ช๊ฐ์ง ํ์
๊ณผ ํ์
์ ํด๋นํ๋ ํ๊ทธ ๊ฐ์ ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Constant Pool์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ฝ๋ ๊ฒ์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
cp_info ๊ตฌ์กฐ์ ์ ๋ณด๋ฅผ ์ฝ์ต๋๋ค.
cp_info๋ ์ฒซ๋ฒ์งธ ๋ฐ์ดํธ์์ ํ์
์ ๋ณด๋ฅผ ์ฝ์ต๋๋ค.cp_info์ ๊ตฌ์ฒด์ ์ธ ํ์
์ ๋ณด์ ๋ฐ๋ผ ์ด์ด์ง๋ ๋ฐ์ดํธ ์ ๋ณด๋ฅผ ์ฝ์ต๋๋ค.๋ญ๊ฐ ๊ณผ์ ์ด ๋ณต์กํ์ง๋ง ํ ๋ ํ ๋ ๋ช
์ธ์ ์๋ ๋ด์ฉ์ ๋ฐ์ดํธ์ฝ๋์ ์ง์ ๋์กฐํด ๋ณด๋ฉด ๊ฒฐ๊ตญ ์์์ javap๋ก ์ถ๋ ฅํ Constant ์ ๋ณด๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ฐ๋จํ ๋ช๊ฐ์ง Constant๋ง ์ง์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์๋ฅผ ๋ค๋ฉด ์ฒซ ๋ฒ์งธ Constant๋ฅผ ๋ํ๋ด๋ ๋ฐ์ดํธ ์ฝ๋๋ 11-15๋ฐ์ดํธ์ธ 0A 00 0D 00 16 ๋ถ๋ถ ์
๋๋ค. ์ ์ผ ์ฒซ ๋ฐ์ดํธ 0A๋ cp_info์ ํ๊ทธ๋ก CONSTANT_Methodref๋ฅผ ์๋ฏธํฉ๋๋ค. CONSTANT_Methodref๋ ๊ฐ๊ฐ 2๋ฐ์ดํธ์ฉ ํด๋์ค์ ๋ฉ์๋๋ช
์ ์ฐธ์กฐํ๋ Constant Pool์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๋๋ค๊ณ ๋ช
์ธ์์ ์ ์ํฉ๋๋ค. ์ด์ ๋ฐ๋ผ 00 0D๋ ํด๋์ค์ ์ธ๋ฑ์ค๋ก 13์ด๊ณ , 00 16์ ๋ฉ์๋์ ์ธ๋ฑ์ค๋ก 22์
๋๋ค.
์ ๋ฆฌํ๋ฉด ์ฒซ ๋ฒ์งธ Constant๋ ๋ฉ์๋๋ฅผ ์ฐธ์กฐํ๋ ์ ๋ณด๋ก #13 ์ธ๋ฑ์ค์ ํด๋์ค์ #22 ๋ฒ์งธ ๋ฉ์๋๋ฅผ ์๋ฏธํฉ๋๋ค. ์ด๋ javap๊ฐ ํด์ํ ์๋ ๊ฒฐ๊ณผ์ ๋์ผํ ๋ด์ฉ์ด๊ธฐ๋ ํฉ๋๋ค.
#1 = Methodref #13.#22 // java/lang/Object."":()V
๊ทธ๋ผ ์ด๋ฒ์๋ #1์์ ์ฐธ์กฐํ #13๋ฒ ์งธ ์ธ๋ฑ์ค๋ก ํ๋ฒ ๊ฑด๋๋ฐ์ด ๋ณด๊ฒ ์ต๋๋ค. #2๋ถํฐ #12๊น์ง ๋ช
์ธ์ ๋์กฐํด์ ๋ฐ์ดํธ๋ค์ ์ง๋์น๊ณ ๋๋ฉด #13 ๋ฒ์งธ ์ธ๋ฑ์ค์ ํด๋นํ๋ SimpleClass์ ๋ฐ์ดํธ ์ฝ๋ 07 00 22 ๊ฐ ๋์ต๋๋ค. ์ฒซ๋ฒ์งธ ๋ฐ์ดํธ 07 ์ ์ด Constant๊ฐ Constant_Class์์ ์๋ ค์ค๋๋ค.
Constant_Classs๋ ์ด์ด์ง๋ 2๋ฐ์ดํธ๋ฅผ Class์ ์ด๋ฆ์ ์ฐธ์กฐํ๋ ์ธ๋ฑ์ค๋ก ์ ์ํฉ๋๋ค. ๋ฐ๋ผ์ 00 22๋ ์ค์ #34๋ฅผ ์๋ฏธํ๊ณ ์ด ํด๋์ค์ ์ด๋ฆ์ด Constant Pool์ #34์งธ ์ธ๋ฑ์ค์ ์๋ค๋ ์๋ฏธ์
๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก javap๊ฐ ํด์ํ ๋ค์์ ๊ฒฐ๊ณผ๋ ๋์ผํ ์๋ฏธ์
๋๋ค.
13 = Class #34 // java/lang/Object
๊ทธ๋ผ ์ด์ ๋ ์ค๊ฐ์ ๋ฐ์ดํธ๋ค์ ํ์ฉ ๋ฐ์ด ๋์ด์ #34์ ํด๋นํ๋ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์ฐพ์๋ณด๊ฒ ์ต๋๋ค. #34์ ํด๋นํ๋ ๋ฐ์ดํธ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
01 00 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74
์ฒซ ๋ฒ์งธ ๋ฐ์ดํธ 01์ Constant_UTF8 ์
๋๋ค. ์ด ํ๊ทธ๋ UTF-8๋ก ์ด๋ค์ง ๋ฌธ์๋ฅผ ์ ์ํฉ๋๋ค. ๋ช
์ธ์ ๋ฐ๋ฅด๋ฉด ์ด์ด์ง๋ 2๋ฐ์ดํธ์์ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ์ ์ธํ๊ณ , ์ด์ด์ ๊ทธ ๊ธธ์ด๋งํผ์ ๋ฌธ์์ด ์ ๋ณด๋ฅผ ํํํฉ๋๋ค. 00 10์ด 16์ด๋ฏ๋ก ์ด์ด์ง๋ 16๋ฐ์ดํธ 10 6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74๊ฐ ๋ฐ๋ก ๋ฌธ์์ด์
๋๋ค. ๊ฒฐ๋ก ์ ์ผ๋ก ์ด ๊ฐ์ด // java/lang/Object ํด๋์ค๋ฅผ ์๋ฏธํฉ๋๋ค.
SimpleClass์์ ์ฌ์ฉํ๋ Constant ์ ๋ณด ์ด 45๊ฐ ์์ต๋๋ค. ์ ์ฒด ๋ฐ์ดํธ์ฝ๋๊ฐ (ํน์๋ผ๋) ๊ถ๊ธํ ๋ถ๋ค์ ์ด ๊ธ ๋งจ ์๋์ ์ ๊ฐ Constant ๋ณ๋ก ๊ตฌ๋ถํด ๋์ ์ ๋ณด๋ฅผ ์ฐธ์กฐํ์๋ฉด ๋ฉ๋๋ค. (ํ๋ฒ์ฏค์ ์ผ์ผ์ด ๋์กฐํด์ ํ์ธํด ๋ณผ๋งํฉ๋๋ค.)
Constant Pool ๋ค์์ผ๋ก 2๋ฐ์ดํธ๊ฐ Access Flags ๋ฅผ ํํํ๋๋ฐ ํ ๋น๋์ด ์์ต๋๋ค. Access Flags๋ public, final ๋ฑ ํด๋์ค๋ ๋ฉ์๋ ์์ ๋ถ๋ ํค์๋๋ฅผ bitwise ์กฐํฉ์ผ๋ก ํํํ ๊ฐ์
๋๋ค. ์๋ฅผ ๋ค๋ฉด public์ 0000000000000001์ด๊ณ final ์ 0000000000000010์ผ๋ก ๋ช
์ธ์ ์ ์ธ๋์ด ์์ต๋๋ค. ์ด๋ฌํ ๋นํธ ์ด flag๋ฅผ ์กฐํฉํ์ฌ ํด๋์ค์ ๋ฉ์๋์ ์ถ๊ฐ์ ์ธ ์ ๋ณด๋ฅผ ์ ์ธํ ์ ์์ต๋๋ค.
์ค์ ์ด ํด๋์ค๋ 00 21 ๋ก ์ ์ธ๋์ด ์๋๋ฐ ์ด๋ ACC_PUBLIC๊ณผ ACC_SUPER ์ ์กฐํฉ์
๋๋ค. ์ด ์ ๋ณด๋ javap๋ก ํด์ํ ๊ฒฐ๊ณผ์์ public class SimpleClass ์ ๋ณด ๋ฐ์์๋ ๋์ผํ๊ฒ ํ์ธํ ์ ์์ต๋๋ค.
...
public class SimpleClass
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
...
๋ค์ ์ ๋ณด๋ ํ์ฌ ๋ฐ์ดํธ์ฝ๋์ ํด๋์ค๋ช
๊ณผ ๋ถ๋ชจ ํด๋์ค๋ช
์
๋๋ค. ๊ฐ๊ฐ 2๋ฐ์ดํธ๋ก Constant Pool์ ์ธ๋ฑ์ค๋ฅผ ํตํด์ ํด๋์ค๋ช
์ ์ฐธ์กฐํฉ๋๋ค. SimpleClass์ ํ์ฌ ํด๋์ค์ ๋ถ๋ชจ ํด๋์ค ๋ฐ์ดํธ ์ฝ๋๋ 00 0C 00 0D๋ก Constant Pool์ #12, #13๋ฒ์ ํด๋์ค๋ช
์ด ์์ต๋๋ค.
์ง๊ธ๊น์ง๋ ๋ฐ์ดํธ์ฝ๋๊ฐ ํด๋์ค์ ๊ธฐ๋ณธ์ ๋ณด ๋ฐ ๋ฉํ๋ฐ์ดํฐ๋ง์ ํํํ์ต๋๋ค. ๋จ์ ๋ฐ์ดํธ์ฝ๋๋ ์ค์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋์ ๋ํ ์์ธํ ๋ด์ฉ์ด ์ด์ด์ง๋๋ค.
์ฒซ๋ฒ์งธ๋ก Interface์ ๋ํ ์ ๋ณด์ ๋๋ค. Class์ ๋ณด ๋ค์์ ๋ ๋ฐ์ดํธ๋ ํด๋์ค์์ ๊ตฌํํ ์ธํดํ์ด์ค์ ์๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ง์ฝ ํ ๊ฐ ์ด์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ ์ด์ด์ 2๋ฐ์ดํธ๋ก ์ด๋ค์ง Constant Pool์ ์ธ๋ฑ์ค๊ฐ ์์ต๋๋ค. ์ด ์ธ๋ฑ์ค๋ค์ด ์ค์ ํด๋์ค์์ ์ ์ํ ์ธํฐํ์ด์ค์ ๋ช ์นญ์ ์ฐธ์กฐํ๋ ๊ฒ์ ๋๋ค.
SimpleClass์ ์์ ์์๋ ๊ตฌํํ ์ธํฐํ์ด์ค๊ฐ ์๊ธฐ ๋๋ฌธ์ Class ์ ๋ณด ๋ค์์ 00 00์ผ๋ก ๋ฐ์ดํธ์ฝ๋๊ฐ ๋ฐ๋ผ ๋ถ์ต๋๋ค. ๋ง์ฝ 1๊ฐ์ ์ธํฐํ์ด์ค๊ฐ ์๊ณ ์ธ๋ฑ์ค #4์ Serializable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ค๋ฉด ์ด๋ ๋ฐ์ดํธ์ฝ๋๋ก 00 01 00 04์ ๊ฐ์ด ํํ๋ฉ๋๋ค.
Interface์ ๋ํ ์ ๋ณด์ ์ด์ด์ Class์ field์ ๋ณด๊ฐ ์์ต๋๋ค. ๋ง์ฝ Class์ field๊ฐ ์ ์ธ๋์ด ์๋ค๋ฉด Interface์ ์ ์ฌํ๊ฒ 2๋ฐ์ดํธ๋ก ์ ์ธ๋ field์ ์๋งํผ ๋ฐ์ดํธ์ฝ๋๊ฐ ์กด์ฌํ๊ฒ ๋ฉ๋๋ค. SimpleClass์ ๊ฒฝ์ฐ ์ ์ธํ field๊ฐ ์์ผ๋ฏ๋ก Interface์ ๋ง์ฐฌ๊ฐ์ง๋ก 00 00 2๋ฐ์ดํธ๋ง ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
๋ง์ฝ 1๊ฐ ์ด์์ field๋ฅผ ์ ์ธํ๋ค๋ฉด field์ ์๋ฅผ ํํํ๋ 2๋ฐ์ดํธ ๋ค์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ์ field_info ์ ๋ณด๊ฐ ๋ฐ์ดํธ์ฝ๋๋ก ์กด์ฌํ๊ฒ ๋ฉ๋๋ค.
field_info {
u2 access_flags;
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
attribute_info attributes[attributes_count];
}
์ด์ ๋ฐ์ดํธ์ฝ๋์์ ์ ์ผ ์ค์ํ ๋ถ๋ถ์ด ๋๋์ด ๋์์ต๋๋ค. field ์ ๋ณด ๋ค์๋ ๋ฉ์๋์ ์ ๋ณด๊ฐ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ปดํ์ผํ ์๋ฐ ํด๋์ค๋ฅผ ๋ฐ์ดํธ์ฝ๋๋ผ๊ณ ๋ถ๋ฅด๋ ๊ฒ๊ณผ ์ฐ๊ด์ด ์๋ ๋ถ๋ถ์ด ๋ฐ๋ก ์ง๊ธ๋ถํฐ ์ค๋ช ํ๋ ๋ถ๋ถ์ ๋๋ค. ๋ฉ์๋ ์ ๋ณด์๋ ๋จผ์ ์์ interface, field์ ๋์ผํ๊ฒ 2๋ฐ์ดํธ๋ก ๋ฉ์๋์ ์๋ฅผ ํํํฉ๋๋ค. ํ ๊ฐ ์ด์์ ๋ฉ์๋๊ฐ ์ ์ธ๋ ๊ฒฝ์ฐ ๋ฐ์ดํธ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋ฉ์๋ ์ ๋ณด๋ฅผ ๋ํ๋ ๋๋ค.
method_info {
u2 access_flags;
u2 name_index;
u2 descriptor_index;
u2 attributes_count;
attribute_info attributes[attributes_count];
}
์ ์ผ ๋จผ์ 2๋ฐ์ดํธ์ ํ ๋น๋ access_flags๋ public, final ์ฒ๋ผ ์์ ํด๋์ค์์ ์ฌ์ฉํ access_flag์ ๊ฐ์ ๋ด์ฉ์
๋๋ค. ๋ค๋ง ๊ทธ ๋์์ด ์ฌ๊ธฐ์๋ ๋ฉ์๋์ผ ๋ฟ์
๋๋ค. ์ด์ด์ง๋ 2๋ฐ์ดํธ๋ ๋ฉ์๋์ ์ด๋ฆ ์ ๋ณด๋ฅผ ์ฐธ์กฐํ๋ Constant Pool์ ์ธ๋ฑ์ค๋ก ๋ํ๋
๋๋ค.
์ด์ด์ 2๋ฐ์ดํธ๋ ๋ฉ์๋์ Descriptor๋ฅผ ์ฐธ์กฐํ๋ Constant Pool์ ์ธ๋ฑ์ค ์
๋๋ค. Descriptor๋ ์๋ฐ์ ๋ฐ์ดํธ์ฝ๋์์ ์ฌ์ฉํ๋ ๋ฉ์๋ ํน์ ํ์
์ ๊ณ ์ ํ ํํ๋ฐฉ์์
๋๋ค.
์๋ฅผ ๋ค๋ฉด Integer๋ Descriptor๋ก I๋ก ํํํ๊ณ ๋ฐฐ์ด์ [๋ก ํํํฉ๋๋ค. ๋ฐ๋ผ์ ๋ง์ฝ int[][]์ ๊ฐ์ ์ ๋ณด๋ฅผ Descriptor๋ก ํํํ๋ค๋ฉด [[I ๋ก ํ๊ธฐํ๋ ๊ฒ์ด ๋ช
์ธ์์ ์ ์ํ๋ ๋ด์ฉ์
๋๋ค.
๋ฉ์๋๋ก ํ๊ฐ์ง ์๋ฅผ ๋ ๋ค์ด๋ณด๋ฉด ๋ฐํ๊ฐ์ด void์ธ getResult(Long id, String keyword) ์ ๊ฐ์ ๋ฉ์๋์ ์๊ทธ๋์ณ๊ฐ ์๋ค๋ฉด ์ด ๋ฉ์๋๋ Descriptor๋ก ๋ค์๊ณผ ๊ฐ์ด ํํํฉ๋๋ค.
(Ljava/lang/String;)V;
ํ๋ฒ javap ์ ์ถ๋ ฅ๊ฒฐ๊ณผ์์ Constant Pool์ ์ ์ธ๋ ๋ช๋ช Constant๋ฅผ ๋ค์ ๋ด
์๋ค. ์์ ๊ฐ์ด Descriptor๋ก ์ ์ธ๋ Constant๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
2๋ฐ์ดํธ๋ก ์ด๋ฃจ์ด์ง Descriptor์ ์ ๋ณด ๋ค์์ attribute_info๊ฐ ๋์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋จผ์ 2๋ฐ์ดํธ๋ฅผ ํ ์ ํ์ฌ attribute_info์ ์๋ฅผ ๋ํ๋ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก attribute_info์ ์๋งํผ์ ์ ๋ณด๊ฐ ์์ต๋๋ค.
attribute_info {
u2 attribute_name_index;
u4 attribute_length;
u1 info[attribute_length];
}
attribute_info๋ ํด๋์ค์ ์ฌ๋ฌ ์ ๋ณด๋ฅผ ํํํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ๋ช
์ธ๋ฅผ ๋ณด๋ฉด ์ ๋ง ๋ค์ํ ์ ๋ณด๋ค์ attribute_info ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํธ์ฝ๋๋ก ํํํจ์ ์ ์ ์์ต๋๋ค. ์ด ์ค์์ ๊ฐ์ฅ ํต์ฌ์ด ๋๋ ๊ฒ์ Code attribute ์
๋๋ค. ์ด๋ ์ค์ ๋ฉ์๋์ ๋ก์ง์ ๋ด๊ณ ์๋ ์์ฑ์
๋๋ค. ๋จผ์ ๋ช
์ธ๊ฐ ์ ์ํ๊ณ ์๋ Code attribute์ ๊ตฌ์กฐ๋ฅผ ๋ณด๊ฒ ์ต๋๋ค.
Code_attribute {
u2 attribute_name_index;
u4 attribute_length;
u2 max_stack;
u2 max_locals;
u4 code_length;
u1 code[code_length];
u2 exception_table_length;
{ u2 start_pc;
u2 end_pc;
u2 handler_pc;
u2 catch_type;
} exception_table[exception_table_length];
u2 attributes_count;
attribute_info attributes[attributes_count];
}
์ ๋ฒ ๋ง์ ๋ด์ฉ๋ค์ด ์์ต๋๋ค. Code attribute์ ๊ตฌ์กฐ๋ JVM์ ๋์ ์๋ฆฌ์ ์ฐ๊ด์ด ๊น์ ๋ด์ฉ๋ค์ด๊ธฐ๋ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ด ๋ถ๋ถ์ ๋ํ ์์ธํ ์ค๋ช
์ ๋ค์ ๊ธ์์ ๋ค๋ฃจ๊ธฐ๋ก ํฉ๋๋ค.
์ค์ SimpleClass์๋ 2๊ฐ์ ๋ฉ์๋๊ฐ ์์ต๋๋ค. ํ๋๋ ์ ๊ฐ ๋ช
์์ ์ผ๋ก ์์ฑํ main ๋ฉ์๋์ด๊ณ ๋๋ฒ์งธ๋ JVM์์ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ ๋ ์ฌ์ฉํ๋ <init> ๋ฉ์๋ ์
๋๋ค. <init> ๋ฉ์๋๋ ํน์ ๋ฉ์๋๋ก JVM์์ ์ ์ธํ์ฌ ์์ฑํ๋ ๋ฉ์๋๋ก ์ฌ๋ฌ๋ถ์ด ์ง์ ์์ฑํ ์ ์๋ ๋ฉ์๋ ์
๋๋ค. ์์ธํ ๋ด์ฉ์ Instance Initialization Method์ ๊ธฐ์ ๋์ด ์์ต๋๋ค.
2๊ฐ์ ๋ฉ์๋๋ ๊ฐ๊ฐ ๋ฐ์ดํธ ์ฝ๋๋ก Code attribute๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค. ์ค์ SimpleClass ์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์ดํด๋ณด๋ ๊ฒ์ ๋ด์ฉ์ด ์ ์ง ์์ต๋๋ค. ์ ์ฒด ๋ฐ์ดํธ์ฝ๋์ ๋ด์ฉ์ ๊ธ ์๋์ ์ฐธ๊ณ ๋ก ๋๊ณ <init> ๋ฉ์๋์ ๋ฐ์ดํธ์ฝ๋๋ฅผ javap๊ฐ ํด์ํ ๊ฒฐ๊ณผ๋ง ๋ด
์๋ค.
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: return
LineNumberTable:
line 1: 0
์์์ ๋ณด์๋ ๋ฐ์ ๊ฐ์ด Code: ๋ก ์์ํ๋ ๋ถ๋ถ์ ๋ฉ์๋์ ๋ฉํ์ ๋ณด๋ก stack, locals, args_size๋ผ๋ ๊ฒ์ด ์ ์ธ๋์ด ์๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ์ด์ด์ง๋ ์ฝ๋๊ฐ ๋ฐ๋ก Java์์ ์ ์ํ opcode์
๋๋ค. opcode๋ ํ ๋ฐ์ดํธ ๋จ์ ๋ช
๋ น์ด ์งํฉ์ด๋ฏ๋ก 256 ๊ฐ์ง์ ๋ช
๋ น์ด๋ฅผ ๊ฐ์ง์ ์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ปดํ์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ถ๋ฅด๋ ์ด์ ๋ ์ฌ๊ธฐ์์ ์ ๋ํ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค. ๋ค์ ๊ธ์์ JVM์ ๋์ ์๋ฆฌ๋ฅผ ๋ค๋ฃฐ๋ opcode ๋ถ๋ถ๋ ํจ๊ป ์ดํด๋ณด๊ธฐ๋ก ํฉ๋๋ค.
์ ์ด์ ํด๋์ค๊ตฌ์กฐ์ ๋ง์ง๋ง์ ๋๋ค. ํด๋์ค ์์ฒด์ ์์ฑ์ ๋ํ๋ด๊ธฐ ์ํด์ attribute_info๋ฅผ ํ๋ฒ ๋ ์ฌ์ฉํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก 2๋ฐ์ดํธ๋ก attribute_info์ ์๋ฅผ ํํํ๊ณ ์ด์ด์ attribute_info ๊ตฌ์กฐ์ ๋ง๊ฒ ๋ฐ์ดํธ์ฝ๋๋ฅผ ํด์ํ๋ฉด ๋ฉ๋๋ค.
SimpleClass ์ ๋ง์ง๋ง 10๋ฐ์ดํธ ๋ถ๋ถ์ด ์ด ํด๋์ค์ attribute_info ์ ๋ณด์
๋๋ค. ์ฒ์ ๋ ๋ฐ์ดํธ๊ฐ 00 01๋ก ์์ํ๊ธฐ ๋๋ฌธ์ attribute๊ฐ ํ๋ ์์ ์ ์ ์์ต๋๋ค. ์ด์ด์ง๋ 2๋ฐ์ดํธ๊ฐ 00 14๋ฅผ ๋ํ๋ด๋๋ฐ ์ด๋ ๋ช
์ธ์ ์ ์์ attribute์ ์ด๋ฆ์ ๋ํ๋ด๋ Constant Pool ์ ์ธ๋ฑ์ค ์
๋๋ค. #20๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ๋ฐ๋ผ๊ฐ๋ฉด Source File ์ด๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. Source File attribute๋ 4๋ฐ์ดํธ๋ก ๊ณ ์ ๊ฐ 00 00 00 02๋ฅผ ๋ํ๋ด๊ณ ๋จ์ 2๋ฐ์ดํธ๋ ๋ฐ์ดํธ์ฝ๋์ ์ ์์คํ์ผ์ ์ด๋ฆ์ ๊ฐ๋ฆฌํค๋ Constant Pool์ ์ธ๋ฑ์ค๋ฅผ ์๋ฏธํฉ๋๋ค. ๋ง์ง๋ง 2๋ฐ์ดํธ๊ฐ 00 15์ด๊ณ ์ด์ ๋ฐ๋ผ #21์ธ๋ฑ์ค๋ก Constant Pool์ ์ฐพ์๋ณด๋ฉด SimpleClass.java๋ผ๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๊ฐ์ธ์ ์ผ๋ก ์ฒ์์ด์ ๋ง์ง๋ง์ผ๋ก ์๋ฐ์ ์ปดํ์ผ ๊ฒฐ๊ณผ๋ฌผ์ ํ ๋ ํ ๋ ๋น๊ตํด ๋ณด๋ ์์
์ ํ์ต๋๋ค. ๊ธ์ ํ ๋ฒ ์ญ์ฑ ํ์ด๋ณด์๋ฉด์ ๊ฐ๋จํ ์๋ฐ ํด๋์ค ํ๋๋ฅผ ์ปดํ์ผํ์ฌ ๋ฐ์ดํธ์ฝ๋๋ฅผ javap ๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์ดํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฌผ๋ก ์๊ฐ์ด ๋์ค๋ ํ ๋ฒ ์ ๋๋ ํ ๋ ํ ๋ฐ ๋ฐ์ดํธ์ฝ๋๋ฅผ ๋ช
์ธ์ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ์ฐพ์๊ฐ๋ฉด์ ์ดํดํ๋ ๊ฒ๋ JVM์ ์ดํดํ๋๋ฐ ํฐ ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํ ๋ฒ ๋ฐ์ดํธ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ ๋๋, ๋จธ๋ฆฟ ์์ ์ง์ ์ปดํ์ผํ์ง ์๊ณ ๋คํธ์ํฌ๋ ์ฝ๋ ๋ ๋ฒจ์์ ๋์ ์ผ๋ก ๋ฐ์ดํธ์ฝ๋๋ฅผ ์์ฑํ์ฌ ํด๋์ค๋ฅผ ๋ง๋ค์ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค. ์๋ง๋ ์ด๋ฌํ ๋ฐฉ์์ด Bytecode Instrumentation ๊ณผ ์ฐ๊ด๋ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค. ์ด ์ฃผ์ ๋ํ ์ด ์ฐ์ฌ์์ ๋ค๋ฃฐ ์ ์๋ค๋ฉด ๊ณต๋ถํ๊ณ ํจ๊ป ๋ค๋ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์์ ์์์ ์ค๋ช
ํ ๋ฐ์ดํธ์ฝ๋๋ฅผ SimpleClass๋ฅผ ์ง์ ๋ถ์ํ์ฌ ์๋ฏธ ๋จ์๋ก ์ชผ๊ฐ๋์ ๋ด์ฉ์
๋๋ค.
access_flags
00 01
name index
00 0E
descriptor index ?
00 0F
attr count
00 01
attr_name_idex 00 10
attr_len 00 00 00 1D (29 ๋ฐ์ดํธ)
00 01 <= max stack
00 01 <= max lock
00 00 00 05 <= code length
<=codes (https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-6.html#jvms-6.5)
2A aload_0
B7 invokespecial
โ 00 01 (index)
B1 return
00 00 <= exception table length
00 01 <= attr count
00 11 <= ๋ค์ attribute 17๋ฒ ref Line Number Table
00 00 00 06 <= attr_len
00 01 <= line_number_table-Len
โ 00 00 start_pc
00 01 line_number
access_flag
00 09 (00 08 + 00 01)
name index
00 12
descriptor
00 13
attr count
00 01
Attr name index
00 10
Attr length
00 00 00 49 (73๊ฐ ๋ฐ์ดํธ)
00 03 <= max start
00 02 <= max local
00 00 00 25 <= code length 37๊ฐ
B2 00 02 12 03 B6
00 04 12 05 3C B2 00 02 BB 00 06 59 B7 00 07 12
08 B6 00 09 1B B6 00 0A B6 00 0B B6 00 04 B1 (37 bytes)
00 00 <= exception code length
00 01 <= attr count
โ 00 11 <= ๋ค์ attribute 17๋ฒ ref Line Number Table
โ 00 00 00 12 <= attr length 18 bytes
โ 00 04 <= line number length
โ 00 00 <= start_pc
โ 00 03 <= line num
โ 00 08 <= start_pc
โ 00 05 <= line num
โ 00 0B <= start_pc
โ 00 06 <= line num
โ 00 24 <= start_pc
โ 00 07 <= line num