JAVA/Basic

[스터디할래? Java 11]enum

[스터디할래? Java] 목차

이글은 백기선님 스터디 할래? 스터디를 뒤늦게 따라간 기록입니다.

스터디할래 링크 >> https://github.com/whiteship/live-study

이필기를 시작으로 공부했습니다 >> https://xxxelppa.tistory.com/204?category=858435 , 

여기 없는내용은 스터디 할래 강의 내용 혹은 제가 java Doc보고작성하거나 예제를 만들어 추가했습니다.

그외는 같이 출처가 써있습니다. 

 

enum정의 public enum TODAY {
    MORNING,
    AFTERNOON
}

public enum TODAY_TIME {
    MORNING(6, 11),
    AFTERNOON(12, 6);
    private int startTime;
    private int endTime;

    TODAY_TIME(int startTime, int endTime) {
        this.startTime = startTime;
        this.endTime = endTime;
    }

    public int getStartTime() {
        return this.startTime;
    }

    public int getEndTime() {
        return this.endTime;
    }
}

내부 static
values() vs  valueOf() values : 선언 상수를 배열로 반환, 컴파일되며 생김
valueOf : enum 존재 상수를 가져올때. 상속 받음,  jdk8기준 없으면 illegalArgumentException
ordinal()  TODAY_TIME.AFTERNOON.ordinal()  //1
ordinal  서수 , enum 클래스에 나열된 상수가 몇번째 나열되어있는지. 
zero base 로 넘버링 한 위치를 반환. 
EnumSet, EnumMap 에서 사용.. 내부용
java.lang.Enum enum 은 java.lang.Enum 클래스 상속받음. - 아래 바이트 코드 참고. 
생성자 : Sole constructor : 컴파일러 사용, 사용자 직접 호출사용불가. 
  /**
     * Sole constructor.  Programmers cannot invoke this constructor.
     * It is for use by code emitted by the compiler in response to
     * enum type declarations.
     *
     * @param name - The name of this enum constant, which is the identifier
     *               used to declare it.
     * @param ordinal - The ordinal of this enumeration constant (its position
     *         in the enum declaration, where the initial constant is assigned
     *         an ordinal of zero).
     */
    protected Enum(String name, int ordinal) {
        this.name = name;
        this.ordinal = ordinal;
    }
EnumSet java.util
Set자료구조특징. 중복허용 안함. 
EnumSet<TODAY_TIME> todayTimeAllSet = EnumSet.allOf(TODAY_TIME.class);
EnumSet todayTimeSet = EnumSet.of(TODAY_TIME.AFTERNOON);
EnumSet todayTimeAt =todayTimeAllSet.complementOf(todayTimeSet);  //특정상수제외
System.out.println(todayTimeAllSet.range(TODAY_TIME.MORNING,TODAY_TIME.AFTERNOON));
// 출력 : [MORNING, AFTERNOON][MORNING, AFTERNOON]

EnumSet은 왜 생성자를 사용자가 호출할수있게만들었을까?
1. ReqularEnumSet 개수적을때  JumboEnumSet 많을때
개발한 사람이 구현 객체 발환해준다면.. 사용입장에서 접합한지 몰라도된다 
2. 사용자는 빈번하게 EnumSet초기화 진행가능
3. 확장성, 유지보수
EnumMap EnumMap<TODAY_TIME> enumMap = new EnumMap<>(TODAY_TIME.class)

enum 에넘, 이늄, 열거형

 

추천책 : 토비의 스프링.

하이버네이트 : java persistence ,> 번역서  하이버네이트 

                      JPA 프로그래밍

----------

type safey

- 타입에 안정적

- query DSR 각광.  http://www.querydsl.com/

------------

jpa 맵핑시

enum Fruit{

    kiwi, apple, banana

}

@Enumerated(EnumType.STRING)

Fruit fruit;

 

EnumType.STRING

EnumType.ORDINAL  

--------------------

private final static String hello = "/hello";

@GetMapping(hello)  << final 만 참조. "변하지않는값'

---------------------

순서 정의할때 1,2,3 보다는 10,20,30으로 정의 

---------------------

Enum 싱글톤으로 쓸수 있다. 

spring에서  @Component 하면 싱글톤을 사용할수 있다. 

---------

리플렉션 : 객체를 통해 클래스의 정보 분석해내는 기법

Calss c = Data.class;

 

 

 

바이트코드

// class version 52.0 (52)
// access flags 0x4031
// signature Ljava/lang/Enum<Lstudy/TODAY_TIME;>;
// declaration: study/TODAY_TIME extends java.lang.Enum<study.TODAY_TIME>
public final enum study/TODAY_TIME extends java/lang/Enum {

  // compiled from: TODAY_TIME.java

  // access flags 0x4019
  public final static enum Lstudy/TODAY_TIME; MORNING

  // access flags 0x4019
  public final static enum Lstudy/TODAY_TIME; AFTERNOON

  // access flags 0x2
  private I startTime

  // access flags 0x2
  private I endTime

  // access flags 0x101A
  private final static synthetic [Lstudy/TODAY_TIME; $VALUES

  // access flags 0x9
  public static values()[Lstudy/TODAY_TIME;
   L0
    LINENUMBER 5 L0
    GETSTATIC study/TODAY_TIME.$VALUES : [Lstudy/TODAY_TIME;
    INVOKEVIRTUAL [Lstudy/TODAY_TIME;.clone ()Ljava/lang/Object;
    CHECKCAST [Lstudy/TODAY_TIME;
    ARETURN
    MAXSTACK = 1
    MAXLOCALS = 0

  // access flags 0x9
  public static valueOf(Ljava/lang/String;)Lstudy/TODAY_TIME;
    // parameter mandated  name
   L0
    LINENUMBER 5 L0
    LDC Lstudy/TODAY_TIME;.class
    ALOAD 0
    INVOKESTATIC java/lang/Enum.valueOf (Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;
    CHECKCAST study/TODAY_TIME
    ARETURN
   L1
    LOCALVARIABLE name Ljava/lang/String; L0 L1 0
    MAXSTACK = 2
    MAXLOCALS = 1

  // access flags 0x2
  // signature (II)V
  // declaration: void <init>(int, int)
  private <init>(Ljava/lang/String;III)V
    // parameter synthetic  $enum$name
    // parameter synthetic  $enum$ordinal
    // parameter  startTime
    // parameter  endTime
   L0
    LINENUMBER 11 L0
    ALOAD 0
    ALOAD 1
    ILOAD 2
    INVOKESPECIAL java/lang/Enum.<init> (Ljava/lang/String;I)V
   L1
    LINENUMBER 12 L1
    ALOAD 0
    ILOAD 3
    PUTFIELD study/TODAY_TIME.startTime : I
   L2
    LINENUMBER 13 L2
    ALOAD 0
    ILOAD 4
    PUTFIELD study/TODAY_TIME.endTime : I
   L3
    LINENUMBER 14 L3
    RETURN
   L4
    LOCALVARIABLE this Lstudy/TODAY_TIME; L0 L4 0
    LOCALVARIABLE startTime I L0 L4 3
    LOCALVARIABLE endTime I L0 L4 4
    MAXSTACK = 3
    MAXLOCALS = 5

  // access flags 0x1
  public getStartTime()I
   L0
    LINENUMBER 17 L0
    ALOAD 0
    GETFIELD study/TODAY_TIME.startTime : I
    IRETURN
   L1
    LOCALVARIABLE this Lstudy/TODAY_TIME; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x1
  public getEndTime()I
   L0
    LINENUMBER 21 L0
    ALOAD 0
    GETFIELD study/TODAY_TIME.endTime : I
    IRETURN
   L1
    LOCALVARIABLE this Lstudy/TODAY_TIME; L0 L1 0
    MAXSTACK = 1
    MAXLOCALS = 1

  // access flags 0x8
  static <clinit>()V
   L0
    LINENUMBER 6 L0
    NEW study/TODAY_TIME
    DUP
    LDC "MORNING"
    ICONST_0
    BIPUSH 6
    BIPUSH 11
    INVOKESPECIAL study/TODAY_TIME.<init> (Ljava/lang/String;III)V
    PUTSTATIC study/TODAY_TIME.MORNING : Lstudy/TODAY_TIME;
   L1
    LINENUMBER 7 L1
    NEW study/TODAY_TIME
    DUP
    LDC "AFTERNOON"
    ICONST_1
    BIPUSH 12
    BIPUSH 6
    INVOKESPECIAL study/TODAY_TIME.<init> (Ljava/lang/String;III)V
    PUTSTATIC study/TODAY_TIME.AFTERNOON : Lstudy/TODAY_TIME;
   L2
    LINENUMBER 5 L2
    ICONST_2
    ANEWARRAY study/TODAY_TIME
    DUP
    ICONST_0
    GETSTATIC study/TODAY_TIME.MORNING : Lstudy/TODAY_TIME;
    AASTORE
    DUP
    ICONST_1
    GETSTATIC study/TODAY_TIME.AFTERNOON : Lstudy/TODAY_TIME;
    AASTORE
    PUTSTATIC study/TODAY_TIME.$VALUES : [Lstudy/TODAY_TIME;
    RETURN
    MAXSTACK = 6
    MAXLOCALS = 0
}

 

 

 

 

 

 

  • enum 정의하는 방법
  • enum이 제공하는 메소드 (values()와 valueOf())
  • java.lang.Enum
  • EnumSet