๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’Š Java & Kotlin & Spring/- Java & kotlin

[์กฐ๊ธˆ ๋” ๊นŠ์€ Java] Java Bytecode ๋ฅผ ์•Œ์•„๋ณด์ž (์ž๋ฐ”๋ฅผ ์ปดํŒŒ์ผํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ๊นŒ?)

by Wonit 2021. 11. 25.

 

์šฐ๋ฆฌ๋Š” ๋งŽ์€ ์‹œ๊ฐ„ Java๋ฅผ ์ด์šฉํ•ด์„œ ๋‹ค์–‘ํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋“ค์—ˆ๋˜ ์†Œ๋ฆฌ๊ฐ€ ์žˆ๋‹ค.

 

Java๋Š” JVM ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”Œ๋žซํผ์— ์ข…์†์ ์ด์ง€ ์•Š๊ณ  ์ด์‹์„ฑ์ด ๋›ฐ์–ด๋‚˜๋‹ค.

 

๊ทธ ์ด์œ ์— ๋Œ€ํ•ด์„œ ์ƒ๊ฐํ•ด๋ณธ ๊ฒฝํ—˜์ด ์žˆ๋Š”๊ฐ€?

 

์˜ค๋Š˜์€ ์œ„์˜ JVM๊ณผ ์ด์‹์„ฑ์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๊ผญ ์•Œ์•„์•ผ ํ•˜๋Š” Java Bytecode ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ ค ํ•œ๋‹ค.

 

Java Bytecode, ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ

 

์šฐ๋ฆฌ๋Š” Java ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด์„œ JDK๋ฅผ ์„ค์น˜ํ•˜๊ณ  Java ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ JRE ๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

 

๋˜ํ•œ ๊ฐœ๋ฐœ์„ ํ•˜๋ฉด ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ Compile ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ์ปดํŒŒ์ผ์€ ๋ฐ”๋กœ JDK๋‚˜ JRE ์— ํ•จ๊ป˜ ํฌํ•จ๋˜๋Š” javac.exe ์‹คํ–‰ํŒŒ์ผ์ด ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ .java ํŒŒ์ผ์„ JVM์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” Bytecode ๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  .class ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š”๋ฐ, .class ํŒŒ์ผ์— ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋กœ ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ, Java Bytecode ์ธ ๊ฒƒ์ด๋‹ค.

 

์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์ด ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ ๋ผ๊ณ  ํ•ด์„œ C๋‚˜ C++์ด ์ปดํŒŒ์ผํ•˜๋ฉด ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๊ณ„์–ด์™€ ๋™์ผํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ๊ธฐ๊ณ„์–ด๋Š” JVM์ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ํ†ตํ•ด์„œ ์ƒ์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ C๋‚˜ C++์— ๋น„ํ•ด ์กฐ๊ธˆ ๋Š๋ฆฐ ์„ฑ๋Šฅ์„ ๋‚ด๋Š” ๊ฒƒ์ด๋‹ค.

 

Java Bytecode ๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœํ•œ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ(์ฝ”๋“œ)๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ๋‹จ์œ„๋ผ๊ณ  ํ•œ๋‹ค.

 

Java Bytecode ํ™•์ธํ•˜๊ธฐ

 

๋” ๊นŠ์€ ์ดํ•ด๋ฅผ ์œ„ํ•ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ Java Bytecode ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ™•์ธํ•ด๋ณด์ž

 

๋‹ค์Œ๊ณผ ๊ฐ™์€ java ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ๋‹ค.

 

public class Wonit {
  public static void main(String[] args) {
    String name = "์›Œ๋‹‰";
    int age = 25;

    Person blogger = new Person(name, age);

    blogger.print();
  }
}

class Person {
  String name;
  int age;

  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  void print() {
    System.out.println("๋ธ”๋กœ๊ทธ ์ฃผ์ธ์˜ ์ด๋ฆ„์€ " + name + " ์ด๋ฉฐ ๋‚˜์ด๋Š” " + age + " ์ด๋‹ค");
  }
}

 

์ด์ œ ์ด ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•ด๋ณด์ž.

 

IDE๋ฅผ ํ†ตํ•ด์„œ ์ปดํŒŒ์ผ์„ ํ•ด๋„ ๋™์ผํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ฒ ์ง€๋งŒ ์ง€๊ธˆ ๋งŒํผ์€ javac.exe๋ฅผ ์ด์šฉํ•ด์„œ ์ง์ ‘ ์ปดํŒŒ์ผํ•ด๋ณด์ž!

 

$ javac Wonit.java

$ ls
Wonit.java    Wonit.class    Person.class

 

ํ•˜๋‚˜์˜ ํŒŒ์ผ์—์„œ ์ž‘์„ฑํ–ˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” 2๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ ์ปดํŒŒ์ผ๋˜๋Š” ์ฝ”๋“œ๋Š” 2๊ฐœ์˜ ํด๋ž˜์Šค ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์—ˆ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ์ด ๋ฐ์ดํ„ฐ๋ฅผ HexD๋‚˜ Hex Viewer ๋กœ ํ™•์ธํ•œ๋‹ค๋ฉด Byte ํ˜•ํƒœ๋กœ ์ง์ ‘ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์†์ด ์šธ๋ ๊ฑฐ๋ฆฌ๋ฏ€๋กœ javap ๋กœ ๋””์ปดํŒŒ์ผ๋ง์„ ํ•˜๊ณ  ๋ณด๊ธฐ ํŽธํ•˜๊ฒŒ ๋ฐ”๊ฟ”๋ณด์ž.

 

$ javap -v -p -s Wonit.class

 

verbose ๋ฅผ ์ด์šฉํ•ด์„œ ๋””์ปดํŒŒ์ผ๋งํ•˜๋Š” ๊ณผ์ •์€ javap ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

 

๊ทธ๋ ด ๊ฒฐ๊ณผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ„์„ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.

 

  minor version: 0
  major version: 58
  flags: (0x0021) ACC_PUBLIC, ACC_SUPER
  this_class: #17                         // Wonit
  super_class: #2                         // java/lang/Object
  interfaces: 0, fields: 0, methods: 2, attributes: 1
public class Wonit
  minor version: 0
  major version: 58
  interfaces: 0, fields: 0, methods: 2, attributes: 1
Constant pool:
   #1 = Methodref          #2.#3          // java/lang/Object."<init>":()V
   ... ์ƒ๋žต
  #24 = Utf8               Wonit.java
{
  public Wonit();
    descriptor: ()V
    flags: (0x0001) ACC_PUBLIC
    Code:
      stack=1, locals=1, args_size=1
         0: aload_0
         1: invokespecial #1                  // Method java/lang/Object."<init>":()V
         4: return
      LineNumberTable:
        line 1: 0

  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    Code:
      stack=4, locals=4, args_size=1
         0: ldc           #7                  // String ์›Œ๋‹‰
         5: istore_2
        ... ์ƒ๋žต
        20: return
      LineNumberTable:
        line 3: 0
        line 4: 3
        line 6: 6
        line 8: 16
        line 9: 20
}
SourceFile: "Wonit.java"

 

์‚ฌ์‹ค์ƒ ์ด ์ฝ”๋“œ๋“ค์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์€ ๋‚ด ์ˆ˜์ค€์œผ๋กœ ๋„์ €ํžˆ ๋ถˆ๊ฐ€๋Šฅํ•˜๋”๋ผ.. ๊ทธ๋ž˜๋„ ์ตœ๋Œ€ํ•œ ์ดํ•ดํ•˜๋ ค๊ณ  ํ•ด๋ณด์•˜๋Š”๋ฐ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ด์ œ ํ•จ๊ป˜ ๊ณต์œ ํ•˜๋ ค ํ•œ๋‹ค.

 

Java Bytecode ์˜ ๊ตฌ์„ฑ์š”์†Œ

 

์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ์˜ ๊ตฌ์„ฑ์š”์†Œ๋Š” ๋งŽ์ด ์žˆ์ง€๋งŒ ํฌ๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค๊ณ  ๋ณด์ž

 

  1. Class Format
  2. Type์˜ ํ‘œํ˜„
  3. Constant Pool
  4. Instruction Set

 

Class Format

 

์œ„์˜ ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” ๋‚˜๋ฆ„์˜ ํฌ๋งท์ด ์ •ํ•ด์ ธ์žˆ๊ณ , ํ•ด๋‹น ํฌ๋งท์œผ๋กœ ํ‘œํ˜„์ด ๋œ๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ ์ปดํŒŒ์ผํ•œ ์ฝ”๋“œ๋Š”

 

minor version: 0
major version: 58
flags: (0x0021) ACC_PUBLIC, ACC_SUPER
this_class: #17                         // Wonit
super_class: #2                         // java/lang/Object
interfaces: 0, fields: 0, methods: 2, attributes: 1

 

์— ํ•ด๋‹นํ•˜๋Š”๋ฐ, ์ด ํฌ๋งท์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

 

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];  
}

 

  • magic
    • ํด๋ž˜์Šค ํŒŒ์ผ์˜ ์ฒซ 4๋ฐ”์ดํŠธ๋กœ ์ž๋ฐ” ํด๋ž˜์ŠคํŒŒ์ผ์ด ๋งž๋Š”์ง€ ๊ตฌ๋ถ„ํ•˜๋Š” ์šฉ๋„๋กœ ์“ฐ์ธ๋‹ค. PE Header ๋‚˜ Image Signatur ๊ณผ ๊ฐ™์€ ์šฉ๋„๋ผ๊ณ  ๋ณด๊ณ  CAFEBABE ๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ–๊ณ  ์žˆ๋‹ค.
  • minor_version, major_version
    • ํด๋ž˜์Šค์˜ Version ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฆ‰, JDK 1.6์ด๋ƒ 1.8์ด๋ƒ ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š”๋ฐ, ๊ฐ๊ฐ JDK ๋ฒ„์ „์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์ˆ˜๊ฐ€ ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค
  • constant_pool_count
    • ํด๋ž˜์Šค ํŒŒ์ผ์˜ ์ƒ์ˆ˜ ํ’€(Constant Pool) ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋œ๋‹ค.
  • access_flags
    • ์ฃผ๋กœ ํด๋ž˜์Šค์˜ public, final ๊ณผ ๊ฐ™์€ modifier ์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.
  • interface_count
    • ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ constant_pool ๋‚ด์˜ ์ธ๋ฑ์Šค๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.

 

์œ„์— ์„ค๋ช…ํ•œ ํฌ๋งท ๋ง๊ณ ๋„ ๋‹ค๋ฅธ ํฌ๋งท์˜ ์ •๋ณด๋„ ๋ถ„๋ช… ์กด์žฌํ•˜๊ฒ ์ง€๋งŒ ์ด๋“ค์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์˜คํžˆ๋ ค ์ด ํฌ์ŠคํŒ…์˜ ๋ชฉ์ ์„ ์žƒ๋Š” ๊ฒƒ์ด๋ผ ํŒ๋‹จ์ด ๋˜์–ด ์ƒ๋žตํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

 

์‚ฌ์‹ค ๋‚ด๊ฐ€ ์ดํ•ด๋ฅผ ํ•˜์ง€ ๋ชปํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—

 

Type์˜ ํ‘œํ˜„

 

์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ์˜ ํ‘œํ˜„์€ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  Type ์„ Bytecode Expression ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.


๋Œ€ํ‘œ์ ์ธ ํƒ€์ž…์€

 

  • B : byte
  • C : char
  • I : int
  • L<classname>; : reference

 

์ •๋„๊ฐ€ ์žˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด

 

Object print(String str, int i)

 

Type ์˜ ํ‘œํ˜„์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

(java/lang/String;I)Ljava/lang/Object;

 

๋”์šฑ ๊ตฌ์ฒด์ ์ธ ํƒ€์ž…์˜ ํ‘œํ˜„์€ oracle java bytecode docs๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋œ๋‹ค.

 

Chapter 4. The class File Format

The target of each jump and branch instruction (jsr, jsr_w, goto, goto_w, ifeq, ifne, ifle, iflt, ifge, ifgt, ifnull, ifnonnull, if_icmpeq, if_icmpne, if_icmple, if_icmplt, if_icmpge, if_icmpgt, if_acmpeq, if_acmpne) must be the opcode of an instruction wi

docs.oracle.com

 

Constant Pool

 

JVM์€ Host OS ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ตœ๋Œ€ํ•œ ํšจ์œจ์ ์œผ๋กœ ์ด์šฉํ•˜๋„๋ก ์„ค๊ณ„๊ฐ€ ๋˜์–ด์žˆ๋‹ค.

 

์ด๋ฅผ ์œ„ํ•ด์„œ JVM์€ Constant Pool ์ด๋ผ๋Š” ์ „๋žต์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, JVM์ด ๋™์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œํ‚ฌ ๋•Œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ฆ‰์‹œ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Constant Pool ์— ์ €์žฅํ•˜๊ณ  Constant Pool ์— ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๊ฐ€์ ธ์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋”์šฑ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

# ํ˜•ํƒœ์˜ ํ•ด์‹œ์ฝ”๋“œ๋กœ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค.

 

์ด Constant Pool์— ๋Œ€ํ•ด์„œ๋Š” ํ•ด๋‹น ๋ธ”๋กœ๊ทธ์˜ ์กฐ๊ธˆ ๋” ๊นŠ์€ Java - String Constant Pool ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

[์กฐ๊ธˆ ๋” ๊นŠ์€ Java] String ๊ณผ String Constant Pool

์šฐ๋ฆฌ๋Š” Java ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์•„์ฃผ ๋งŽ์€ String ์˜ Literal ์„ ์ด์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์˜ค๋Š˜์€ ๊ทธ String์ด ์–ด๋–ค ํŠน์„ฑ์„ ๊ฐ€์กŒ๋Š”์ง€ ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ฐ๋„์—์„œ ๋ด๋ณด๋ ค ํ•œ๋‹ค. String ์€? String ์€ Java ์—์„œ ์ œ๊ณตํ•˜๋Š” ํŠน๋ณ„ํ•œ ์ž๋ฃŒ

wonit.tistory.com

 

Instruction Set

 

์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋œ ๊ฒฐ๊ณผ๋กœ ์ƒ์„ฑ๋˜๋Š” ์ฝ”๋“œ ์ด๋ฏ€๋กœ ์ผ์ข…์˜ ๋ช…๋ น์–ด ์ง‘ํ•ฉ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ด๋ฅผ JVM Instruction Set ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

๋ช…๋ น์–ด๋Š” ๋‹น์—ฐํ•˜๊ฒŒ OpCode์™€ Operands ๋กœ ๊ตฌ์„ฑ๋˜๋Š”๋ฐ ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ์—์„œ๋Š” 1 Byte์˜ OpCode์™€ 2 Byte์˜ Operands ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

 

1 Byte์˜ OpCode ์ด๋ฏ€๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์ด ๋ช…๋ น์–ด์˜ ์ˆ˜๋Š” 256๊ฐœ๊ฐ€ ๋˜๊ณ  ์ž์„ธํ•œ ๋ช…๋ น์–ด์˜ ์ •์˜๋Š” Oracle Java Bytecode Instruction Set Docs ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Chapter 6. The Java Virtual Machine Instruction Set

The wide instruction modifies the behavior of another instruction. It takes one of two formats, depending on the instruction being modified. The first form of the wide instruction modifies one of the instructions iload, fload, aload, lload, dload, istore,

docs.oracle.com

 

์šฐ๋ฆฌ๊ฐ€ ๋””์ปดํŒŒ์ผํ•œ ๊ฒฐ๊ณผ์—์„œ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

Code:
      stack=4, locals=4, args_size=1
         0: ldc           #7                  // String ์›Œ๋‹‰
         2: astore_1
         3: bipush        25
         5: istore_2
         6: new           #9                  // class Person
         9: dup
        10: aload_1
        11: iload_2
        12: invokespecial #11                 // Method Person."<init>":(Ljava/lang/String;I)V
        15: astore_3
        16: aload_3
        17: invokevirtual #14                 // Method Person.print:()V
        20: return

 

์šฐ๋ฆฌ๊ฐ€ ์ง  ์†Œ์Šค์ฝ”๋“œ์˜ ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•Œ์•„์•ผํ•  ๋ช‡๊ฐ€์ง€ ๋ช…๋ น์–ด๋ฅผ ์•Œ์•„๋ณด์ž

 

  • aload : local variable ์„ stack ์— push ํ•œ๋‹ค
  • ldc : constant pool ์—์„œ๋ถ€ํ„ฐ #index ์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค
  • astore : local variable ์— ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
  • invokespecial : instance Method ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ stack ์— pushํ•œ๋‹ค.
  • new : ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • invokevirtual : ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  • dup : stack ์— ์žˆ๋Š” top ์„ ๋ณต์‚ฌํ•œ๋‹ค.

 

์ด์™ธ์—๋„ ์ •๋ง ๋งŽ์€ ๋ช…๋ น์–ด๊ฐ€ ์กด์žฌํ•˜๊ณ  ์˜๋ฏธ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ํ•œ๊ธ€๋กœ๋œ ์„ค๋ช…์€ aroundck ๋‹˜์˜ ๋ธ”๋กœ๊ทธ ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.