DevCastleOne

JAVA] Enum은 무엇인가?

2021. 2. 6. 16:59

목차

- Enum 이란?

- Enum 정의하는 방법

- Enum이 제공하는 메소드

- java.lang.Enum

- EnumSet

- Enum SingleTon

 

Enum이란?

컴퓨터 프로그래밍에서 Enum이란 enumerated type을 줄일만로써 멤버라 불리는 명명된 값의 집합을 이루는 자료형이며 일반적으로 상수 역할을 하는 식별자이다. ( 위키피디아 ) 

 

Enum 정의하는 방법

* 생성자가 없는경우

enum 이름{
  상수명1 , 상수명2 ...;
}

{} 상수안에 상수명만 정의하면 된다.


* 생성자가 있는경우

enum 이름{
  상수명1(),
  상수명2(),
  ...
  
  private final 데이터타입 변수명;
  
  //setter
  
  //getter
   
  private 생성자(매개변수1,매개변수2....){
  
  } 

}

 

생성자를 선언할 경루 private 타입으로 정의해야 한다.

public, default , protected의 경우 컴파일 에러가 난다.

enum 타입의 경우 고정된 상수들의 집합이기 때문에 private이 아닌경우

확장의 가능성이 더 커지는 문제가 발생할수 있다.

 

- 생성자가 없는 Enum 사용법

enum Operation{
    ADDITION, SUBRACTION , MULTIPLICATION , DIVIDE
}

public class Main {
    public static void main(String[] args) {
        System.out.println(Operation.ADDITION);
        System.out.println(Operation.SUBRACTION);
        System.out.println(Operation.MULTIPLICATION);
        System.out.println(Operation.DIVIDE);
    }
}

=====================출력결과=====================
ADDITION
SUBRACTION
MULTIPLICATION
DIVIDE

 

- 생성자가 있는 Enum 사용법

enum Fruit{
    APPLE("red") ,
    BANANA("yello");

    private final String color;

    public String getColor() {
        return color;
    }

    Fruit(String color) {
        this.color = color;
    }
}

public class EnumTest {
    public static void main(String[] args) {
        System.out.println(Fruit.APPLE);
        System.out.println(Fruit.APPLE.getColor());
    }
}

========================출력결과========================
APPLE
red

 

- enum 상수 메서드 정의 사용법

package item3;

enum Fruit{
    APPLE("red"){
        public void print(){
            System.out.println("Apple color is red");
        }
    },
    BANANA("yello");

    private final String color;

    public String getColor() {
        return color;
    }

    public void print(){

    }

    Fruit(String color) {
        this.color = color;
    }
}

public class EnumTest {
    public static void main(String[] args) {
        System.out.println(Fruit.APPLE);
        System.out.println(Fruit.APPLE.getColor());
        Fruit.APPLE.print();
        Fruit.BANANA.print();
    }
}
===============출력결과===============
APPLE
red
Apple color is red
none

 enum 메소드 상수를 정의할수 있는데 반드시 외부에 메소드를 정의해야지만 호출 가능하다.

 

 

Enum이 제공하는 메소드

enum Operation{
    ADDITION, SUBRACTION , MULTIPLICATION , DIVIDE
}

public class Main {
    public static void main(String[] args) {
        System.out.println(Operation.ADDITION);
        System.out.println(Operation.SUBRACTION);
        System.out.println(Operation.MULTIPLICATION);
        System.out.println(Operation.DIVIDE);
        System.out.println("============================");

        System.out.println(Operation.ADDITION.toString());
        System.out.println(Operation.ADDITION.name());
        System.out.println("============================");

        System.out.println(Operation.ADDITION.ordinal());
        System.out.println(Operation.SUBRACTION.ordinal());
        System.out.println("============================");

        Operation[] values = Operation.ADDITION.values();

        for(Operation op : values){
            System.out.println(op);
        }
    }
}
=====================출력결과=======================
ADDITION
SUBRACTION
MULTIPLICATION
DIVIDE
============================
ADDITION
ADDITION
============================
0
1
============================
ADDITION
SUBRACTION
MULTIPLICATION
DIVIDE

- toString() : 해당 상수의 이름을 문자열로 변환 , Object의 클래스로 오버라이딩 가능

- name() : 해당 상수의 이름을 문자열로 변환 . final로 선언된 메소드로 오버라이딩 불가능

- ordinal() : 상수의 선언 인덱스를 가르킴

- values() : 선언된 모든 Enum을 배열로 담음

 

java.lang.Enum

Enum 클래스는 모든 열거형이 공통으로 상속받는 추상 클래스이다.

abstract 클래스로 인스턴스를 생성할수 없다.

인스턴스의 생성을 할수없다.

우리가 선언하는 enum 타입은 자동으로 Enum 클래스를 상속받으며 Enum 클래스의 메소드 호출이 가능

 

 

 

 

 

Enum 싱글톤

public enum EnumSingleTon {

    INSTANCE;

    private String name = "default";

    private EnumSingleTon(){}

    public EnumSingleTon getInstance(){
        return INSTANCE;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

- Reflection을 통해 싱글톤을 깰수없다.

- 단 한번의 인스턴스 생성을 보장함

 

EnumSet

열거형을 위해 고안된 특별한 Set 인터페이스 구현체로 HashSet과 비교했을때 장점이 많이 때문에 열거형 데이터가 필요한 경우 EnumSet이 좋음.

 

 

아래의 특징들을 가지고 있다.

- ordinal값의 순서대로 저장이 된다.

- 쓰레드 safe 하지 않기 때문에 동기화에 신경을 써야한다.

- null value를 추가하는것은 허용하지 않으며 nullPointException을 던지는것도 허용하지 않음

 

import java.util.EnumSet;

enum Operation{
    ADDITION, SUBRACTION , MULTIPLICATION , DIVIDE
}

public class Main {
    public static void main(String[] args) {

        EnumSet<Operation> set1,set2,set3,set4,set5;

        set1 = EnumSet.allOf(Operation.class);
        set2 = EnumSet.of(Operation.ADDITION,Operation.MULTIPLICATION);
        set3 = EnumSet.complementOf(set2);
        set4 = EnumSet.range(Operation.ADDITION,Operation.MULTIPLICATION);

        set5 = EnumSet.noneOf(Operation.class);
        set5.add(Operation.DIVIDE);
        set5.add(Operation.SUBRACTION);
        set5.remove(Operation.SUBRACTION);

        System.out.println("set1 = " + set1);
        System.out.println("set2 = " + set2);
        System.out.println("set3 = " + set3);
        System.out.println("set4 = " + set4);
        System.out.println("set5 = " + set5);

    }
}

==================결과==================
set1 = [ADDITION, SUBRACTION, MULTIPLICATION, DIVIDE]
set2 = [ADDITION, MULTIPLICATION]
set3 = [SUBRACTION, DIVIDE]
set4 = [ADDITION, SUBRACTION, MULTIPLICATION]
set5 = [DIVIDE]

- allOf : 열거형의 모든 상수를 새로운 EnumSet으로 만듬

- of(Enum e1,Enum e2) : 열거형 상수 2개를 새로운 EnumSet으로 만듬

- complementOf(EnumSet e) :  인자의 EnumSet의 열거형 상수들을 제외한 열거형 상수들을 새로운 EnumSet으로 만듬

- range(Enum From , Enum to ) : 인자로 받은 열거형 상수 사이의 범위를 인덱스 순서대로 EnumSet으로 넣어 반환

'JAVA' 카테고리의 다른 글

JAVA] 예외처리 하는 방법  (0) 2021.01.15
[JAVA] 자바 패키지란?  (0) 2020.12.30
자바 Dispatch란? ( static , dynamic , double Dispatch )  (0) 2020.12.25
자바 상속이란?  (0) 2020.12.25
[JAVA] 클래스란?  (0) 2020.12.16

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band