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 |