Enum 분석

Programing/Java 2016. 4. 11. 01:09 by kira-master

1.       Enum 이란 

 

 

 

 

2.       Enum 코드

public enum Operation {


   
PLUS("+") {
       
@Override
       
double apply(double x, double y) {
           
return x-y;
       
}

    }
, MINUS("-") {
       
@Override
       
double apply(double x, double y) {
           
return x-y;
       
}

    }
, TIMES("*") {
       
@Override
       
double apply(double x, double y) {
           
return x*y;
       
}

    }
, DIVIDE("/") {
       
@Override
       
double apply(double x, double y) {
           
return x/y;
       
}

    }
;

    private final
String symbol;

   
Operation(String symbol) {
       
this.symbol = symbol;
   
}

   
abstract double apply(double x, double y);

}

 

3.       Enum 바이트 코드 분석

 

 

Enum 클래스를 생성하게 되면 bytecode 시점에서는

enum 추상 클래스로 생성되면서 Enum 클래스의 상속을 받는다.

Enum 자료형은 모두 public static final enum Enum자료명으로 된다.

Static enum 형태로 내부 클래스로 선언된 되는데 밑에 보면 PlUS , MINUS, TIMES, DIVICE 라고 선언한


// class version 52.0 (52)
// access flags 0x4421
// signature Ljava/lang/Enum<Lcom/study/enum01/Operation;>;
// declaration: com/study/enum01/Operation extends java.lang.Enum<com.study.enum01.Operation>
public abstract enum com/study/enum01/Operation extends java/lang/Enum  {

// compiled from: Operation.java
// access flags 0x4008
static enum INNERCLASS com/study/enum01/Operation$4 null null
// access flags 0x4008
static enum INNERCLASS com/study/enum01/Operation$3 null null
// access flags 0x4008
static enum INNERCLASS com/study/enum01/Operation$2 null null
// access flags 0x4008
static enum INNERCLASS com/study/enum01/Operation$1 null null

// access flags 0x4019
public final static enum Lcom/study/enum01/Operation; PLUS

// access flags 0x4019
public final static enum Lcom/study/enum01/Operation; MINUS

// access flags 0x4019
public final static enum Lcom/study/enum01/Operation; TIMES

// access flags 0x4019
public final static enum Lcom/study/enum01/Operation; DIVIDE

// access flags 0x12
private final Ljava/lang/String; symbol

// access flags 0x101A
private final static synthetic [Lcom/study/enum01/Operation; $VALUES

// access flags 0x9
public static values()[Lcom/study/enum01/Operation;
       
L0
        LINENUMBER
6 L0
        GETSTATIC com/study/enum01/Operation.$VALUES : [Lcom/study/enum01/Operation
;
       
INVOKEVIRTUAL [Lcom/study/enum01/Operation;.clone ()Ljava/lang/Object;
       
CHECKCAST [Lcom/study/enum01/Operation;
       
ARETURN
        MAXSTACK =
1
       
MAXLOCALS = 0

// access flags 0x9
public static valueOf(Ljava/lang/String;)Lcom/study/enum01/Operation;
       
L0
        LINENUMBER
6 L0
        LDC Lcom/study/enum01/Operation
;.class
ALOAD 0
       
INVOKESTATIC java/lang/Enum.valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
       
CHECKCAST com/study/enum01/Operation
        ARETURN
        L1
        LOCALVARIABLE name Ljava/lang/String
; L0 L1 0
       
MAXSTACK = 2
       
MAXLOCALS = 1

// access flags 0x2
// signature (Ljava/lang/String;)V
// declaration: void <init>(java.lang.String)
private <init>(Ljava/lang/String;ILjava/lang/String;)V
        L0
        LINENUMBER
37 L0
        ALOAD
0
       
ALOAD 1
       
ILOAD 2
       
INVOKESPECIAL java/lang/Enum.<init> (Ljava/lang/String;I)V
        L1
        LINENUMBER
38 L1
        ALOAD
0
       
ALOAD 3
       
PUTFIELD com/study/enum01/Operation.symbol : Ljava/lang/String;
       
L2
        LINENUMBER
39 L2
        RETURN
        L3
        LOCALVARIABLE
this Lcom/study/enum01/Operation; L0 L3 0
       
LOCALVARIABLE symbol Ljava/lang/String; L0 L3 3
       
MAXSTACK = 3
       
MAXLOCALS = 4

// access flags 0x400
abstract apply(DD)D

       
// access flags 0x1000
       
synthetic <init>(Ljava/lang/String;ILjava/lang/String;Lcom/study/enum01/Operation$1;)V
        L0
        LINENUMBER
6 L0
        ALOAD
0
       
ALOAD 1
       
ILOAD 2
       
ALOAD 3
       
INVOKESPECIAL com/study/enum01/Operation.<init> (Ljava/lang/String;ILjava/lang/String;)V
        RETURN
        L1
        LOCALVARIABLE
this Lcom/study/enum01/Operation; L0 L1 0
       
LOCALVARIABLE x0 Ljava/lang/String; L0 L1 1
       
LOCALVARIABLE x1 I L0 L1 2
       
LOCALVARIABLE x2 Ljava/lang/String; L0 L1 3
       
LOCALVARIABLE x3 Lcom/study/enum01/Operation$1; L0 L1 4
       
MAXSTACK = 4
       
MAXLOCALS = 5

// access flags 0x8
static <clinit>()V
        L0
        LINENUMBER
9 L0
        NEW com/study/enum01/Operation$1
        DUP
        LDC
"PLUS"
       
ICONST_0
        LDC
"+"
       
INVOKESPECIAL com/study/enum01/Operation$1.<init> (Ljava/lang/String;ILjava/lang/String;)V
        PUTSTATIC com/study/enum01/Operation.PLUS : Lcom/study/enum01/Operation
;
       
L1
        LINENUMBER
15 L1
        NEW com/study/enum01/Operation$2
        DUP
        LDC
"MINUS"
       
ICONST_1
        LDC
"-"
       
INVOKESPECIAL com/study/enum01/Operation$2.<init> (Ljava/lang/String;ILjava/lang/String;)V
        PUTSTATIC com/study/enum01/Operation.MINUS : Lcom/study/enum01/Operation
;
       
L2
        LINENUMBER
21 L2
        NEW com/study/enum01/Operation$3
        DUP
        LDC
"TIMES"
       
ICONST_2
        LDC
"*"
       
INVOKESPECIAL com/study/enum01/Operation$3.<init> (Ljava/lang/String;ILjava/lang/String;)V
        PUTSTATIC com/study/enum01/Operation.TIMES : Lcom/study/enum01/Operation
;
       
L3
        LINENUMBER
27 L3
        NEW com/study/enum01/Operation$4
        DUP
        LDC
"DIVIDE"
       
ICONST_3
        LDC
"/"
       
INVOKESPECIAL com/study/enum01/Operation$4.<init> (Ljava/lang/String;ILjava/lang/String;)V
        PUTSTATIC com/study/enum01/Operation.DIVIDE : Lcom/study/enum01/Operation
;
       
L4
        LINENUMBER
6 L4
        ICONST_4
        ANEWARRAY com/study/enum01/Operation
        DUP
        ICONST_0
        GETSTATIC com/study/enum01/Operation.PLUS : Lcom/study/enum01/Operation
;
       
AASTORE
        DUP
        ICONST_1
        GETSTATIC com/study/enum01/Operation.MINUS : Lcom/study/enum01/Operation
;
       
AASTORE
        DUP
        ICONST_2
        GETSTATIC com/study/enum01/Operation.TIMES : Lcom/study/enum01/Operation
;
       
AASTORE
        DUP
        ICONST_3
        GETSTATIC com/study/enum01/Operation.DIVIDE : Lcom/study/enum01/Operation
;
       
AASTORE
        PUTSTATIC com/study/enum01/Operation.$VALUES : [Lcom/study/enum01/Operation
;
       
RETURN
        MAXSTACK =
5
       
MAXLOCALS = 0
       
}

 

 

 

 

'Programing > Java' 카테고리의 다른 글

자바 8 로 오면서 Runnable API 보던중에  (0) 2016.01.23
Connection 객체 // Properties  (0) 2015.09.09
계산기 예제  (0) 2015.08.27
POJO 의 개념과 예시  (0) 2015.08.24
Singleton 정리  (0) 2015.08.23
Nav