• Home
  • About
    • JOOS photo

      JOOS

      Joos's blog

    • Learn More
    • Email
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[Spring] Java Enum Type

04 Jun 2019

Reading time ~2 minutes

제 블로그의 모든 글은 IMHO로 쓴 것입니다. 잘못된 부분이 있으면 덧글을 통해서 소통을 하면 더 좋은 글로 발전이 될 수 있을 것 같습니다. 그렇지만 소통을 할 때 서로의 감정을 존중하는 선에서 해주셨으면 좋겠습니다. 감사합니다:) —

java의 Enum은 class이다. 즉 Enum은 상수처럼 보이는 class

  • 서로 관련있는 상수들끼리 모아 상수들을 대표할 수 있는 이름으로 타입을 정의

Enum 이란?

  • Enum은 열거형이라고 불리며, 서로 연관된 상수들의 집합이다.
  • class이기에 get method, 생성자 등을 쓸 수도 있다.
  • 기존에 상수를 정의하는 방법이였던 final static string 과 같이 문자열이나 숫자들을 나타내는 기본자료형의 값을 enum을 이용해서 같은 효과

Enum의 장점

  • 인스턴스 생성과 상속을 방지하여 상수값의 타입안정성이 보장
  • enum class를 사용해 새로운 상수들의 타입을 정의함으로 정의한 타입이외의 타입을 가진 데이터값을 컴파일시 체크
  • 키워드 enum을 사용하기 때문에 구현의 의도가 열거

public static final 을 쓸 때

기존의 상수를 정의하는 방법에 따라 다음과 같이 상수를 정의했습니다.

public static final String MALE = "MALE";
public static final String FEMALE = "FEMALE";

잘못 할당했을 경우

String gender;
gender = 'joos';
  • 우리가 기대하는 MALE, FEMALE 의 상수가 아닌 엉뚱한 값이 들어가면 무너지게 된다.
  • 원치않는 “joos” 라는 값이 실수로 할당되었을 때 따로 우리가 기대하는 상수값이 할당되었는지 안되었는지에 대한 유효성을 검사하는 로직이 들어가 있지 않다면, 런타임시 문제가 발생
  • 이러한 문제가 발생하는 것은 자바 컴파일시 문제점을 발견할 수 없기 때문입니다.
  • 자바입장에서는 String이라는 타입에 String 값이 할당되었기 때문에 이상하지 않습니다.
  • 만약 상수가 무수히 많고 복잡하다면, 이 잠재적인 문제는 프로그램의 치명적인 오작동을 초래할 수 있습니다.

enum을 쓸 때

String gender;
gender = Gender.MALE;
gender = Gender.FEMAL;

enum class의 인스턴스를 따로 생성하지 않고 바로 MALE, FEMALE 접근했다. 내부적으로 생략되었을 뿐 다음 class와 같다.

class Gender{
  public static final Gender MALE = new Gender();
  public static final Gender FEMALE = new Gender();
}

static이 생략되었을 뿐 엄연히 enum class 안에 정의된 상수들은 static 변수 효과를 나타낸다.

잘못 할당했을 경우

String gender;
gender = 'joos';

타입은 Gender라는 상수타입인데 String 타입인 boy를 할당하려고하니 컴파일에러가 발생됩니다.

즉 컴파일시 우리가 기대하지 않는 상수값의 할당을 사전에 체크할 수 있는 것입니다.

Enum 쓰는 법

Class 외부에서 선언

public class Developer {

    public static void main(String[] args){
        for(DevType type : DevType.values()){
            System.out.println(type);
        }
    }

}

enum DevType {

    MOBILE, WEB, SERVER
}
  • 열거형으로 선언된 순서에 따라 0 부터 인덱스 값을 가지며 순차적으로 증가된다.

열거형 상수를 다른 값과 연결하기

public class Developer {

    public String name;
    public int career;
    public DevType type;

    public static void main(String[] args){

        for(DevType type : DevType.values()){
            System.out.println(type.getName());
        }

    }

}

enum DevType {

    MOBILE("안드로이드"), WEB("스프링"), SERVER("리눅스");

    final private String name;

    public String getName() {
        return name;
    }

    private DevType(String name){
        this.name = name;
    }

}
  • enum의 생성자가 접근 제어자 private만을 허용

Enum이 맞지 않은 곳

가장 큰 허들은 “변경이 어렵다”

  • 변경이 잦은 곳 신경 써야 하는 것 : 얼마나 자주 변경

참고: https://limkydev.tistory.com/50 https://www.opentutorials.org/course/2517/14151 http://woowabros.github.io/tools/2017/07/10/java-enum-uses.html



Java_enumSpring Share Tweet +1