본문 바로가기

BackEnd/Java

enum (데이터 열거형 타입)

enum이란 enumeration(열거, 목록)의 약자입니다.

자바에서는 enum을 같은 종류의 상수 집합으로 사용합니다.

 

일반적으로 상수를 선언할 때는 아래와 같습니다.

 

private final static int KIM;
private final static int CHOI;
private final static int PARK;

 

일반 상수에서 배웠듯이 private final static 은 생략해도 상수가 기본적으로 생략하며 가질 수 있습니다.

상수를 관리할 때 자료형 상수 방식으로 상수를 선언하는 것 보다 enum 방식으로 관리하는 게 장점이 더 많습니다.

 

enum FirstName {
	KIM, CHOI, PARK
}

 

위 enum 방식은 최상단 일반적인 상수 선언했던 내용과 100% 동일합니다.

enum에 들어간 상수는 배열처럼 각각의 인덱스를 순서대로 가집니다.

 

- 인덱스 (위 코드 참고)

KIM : 0

CHOI : 1

PARK : 2

 

이러한 enum의 인덱스를 ordinal 값이라고 칭합니다.

일반적인 상수 선언으로도 충분히 코딩이 가능한데 왜 굳이 enum을 사용하는 걸까요?

 

public class EnumEX {
	public static void method(int firstName) {
    	/*
         * KIM == 1;
         * CHOI == 2;
         * PARK == 3;
         */
         
         switch(firstName) {
         case 1:
         	System.out.println("KIM");
            break;
         case 2:
         	System.out.println("CHOI");
            break;
         case 3:
         	System.out.println("PARK");
            break;
         }
    }
}

 

위처럼 일반적인 상수 선언 방식으로 switch~case문을 사용했을 때,

주석으로 상수의 의미를 적어놓고 설명하는 경우가 많습니다.

 

주석을 실수로 삭제하거나 설명 주석이 없을 경우 상수 값을 혼동하여 코딩하거나 분리된다면

임의로 넣어준 값들이 어떤 상수를 의미하는지 이해하기 힘들 수가 있습니다.

 

다음은 enum 상수를 이용하여 switch~case문을 작성해보겠습니다.

 

public class EnumEX {
	public static void method(FirstName str) {
         switch(str) {
         case KIM:
         	System.out.println("KIM");
            break;
         case CHOI:
         	System.out.println("CHOI");
            break;
         case PARK:
         	System.out.println("PARK");
            break;
         }
    }
}

 

굳이 주석을 달지않아도 어느정도 의미 해석이 가능해지고 코드도 훨씬 간결해져 가독성이 좋아졌습니다.

그리고 enum에 열거된 상수는 인스턴스 생성과 상속이 불가능해집니다.

 

위에서 enum은 배열처럼 인덱스가 있다고 했습니다.

enum 자체의 메서드가 따로 있는데 아래 메서드를 통해 값을 비교하거나 찾아낼 수 있습니다.

 

1. values()

enum에 담긴 모상수의 주소값

 

2. name()

enum에 담긴 상수의 이름

 

3. ordinal()

enum에 담긴 상수의 인덱스

 

4. valueOf()

enum에 담긴 상수의 값

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

구현 코드가 없는 인터페이스 (interface)  (0) 2020.04.26
[기본 클래스] Object 클래스  (0) 2020.04.05
향상된 for문 (for each문)  (0) 2020.03.23
추상화 (Abstract)  (0) 2020.03.16
상수 (final)  (0) 2020.03.16