> For the complete documentation index, see [llms.txt](https://docs.sysout.co.kr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.sysout.co.kr/base-language/java/java-advanced/enum-type.md).

# 열거형(Enum)

## 열거형(Enum)

**열거형(Enum, Enumeration Type)**&#xC774;란 상수들을 모아둔 클래스이다. 서로 관련이 있는 값들을 묶어서 편하게 사용할 수 있도록 하는 것이 목적이다.

### Enum의 생성

Enum은 별도로 생성하는 메뉴가 존재하며, 원하는 패키지에 Enum을 생성하면 된다.

![열거형은 별도의 메뉴로 생성하며, enum이라는 형태로 생성된다.](https://4208234536-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-M_TNZwLuHV9ipYLbvRq%2F-MewfF0KvqeisLW0iE7q%2F-MewfunSbEXiNQWO6HA0%2Fimage.png?alt=media\&token=381c0af0-454f-483e-a1be-98d649729ea1)

다음과 같은 형태로 생성된다.

```java
public enum 이름 {

}
```

### Enum의 특징 &#x20;

Enum은 다음의 특징을 가진다.

* 클래스와 같은 문법 체계를 가진다.
* 객체 생성이 불가하다.
* 최상단에 열거할 값들을 작성해야 한다.
* 단순 열거형으로 사용할 경우 값을 부여하지 않아도 된다.
* 멤버 변수를 만들어 객체 형태로 사용할 수 있다. 단, 생성자를 구현해야 한다.
* public 생성자를 가질 수 없으며, 기본 생성자는 private 이다.
* 상속이 불가하다.

### 데모 1 : 기본 형태의 Enum

{% tabs %}
{% tab title="Week" %}
{% code title="Week.java" %}

```java
public enum Week {
    MONDAY,
    TUESDAY,
    WEDNESDAY,
    THURSDAY,
    FRIDAY,
    SATURDAY,
    SUNDAY
}
```

{% endcode %}
{% endtab %}

{% tab title="EnumExample01" %}
{% code title="EnumExample01.java" %}

```java
public class EnumExample01 {
    public static void main(String[] args){
        System.out.println(Week.MONDAY);
				System.out.println(Week.MONDAY.name());
				System.out.println(Week.MONDAY.ordinal());
        System.out.println(Week.TUESDAY);
        System.out.println(Week.TUESDAY.name());
        System.out.println(Week.TUESDAY.ordinal());
        System.out.println(Week.WEDNESDAY);
        System.out.println(Week.WEDNESDAY.name());
        System.out.println(Week.WEDNESDAY.ordinal());
        System.out.println(Week.THURSDAY);
        System.out.println(Week.THURSDAY.name());
        System.out.println(Week.THURSDAY.ordinal());
        System.out.println(Week.FRIDAY);
        System.out.println(Week.FRIDAY.name());
        System.out.println(Week.FRIDAY.ordinal());
        System.out.println(Week.SATURDAY);
        System.out.println(Week.SATURDAY.name());
        System.out.println(Week.SATURDAY.ordinal());
        System.out.println(Week.SUNDAY);
        System.out.println(Week.SUNDAY.name());
        System.out.println(Week.SUNDAY.ordinal());
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="실행 결과" %}

```
MONDAY
MONDAY
0
TUESDAY
TUESDAY
1
WEDNESDAY
WEDNESDAY
2
THURSDAY
THURSDAY
3
FRIDAY
FRIDAY
4
SATURDAY
SATURDAY
5
SUNDAY
SUNDAY
6
```

{% endtab %}
{% endtabs %}

Week의 코드를 살펴보면, 세미콜론 없이 값을 열거했음을 확인할 수 있다.&#x20;

```java
public enum Week {
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
```

값을 부여할 수도 있는데 다음 데모에서 살펴보기로 한다. 값을 부여하지 않으면 자동으로 변수명이 문자열 형태의 값으로 인식되며, 작성한 순서대로 0번부터 번호가 부여된다. 이름과 순서는 각각 name() , ordinal() 로 확인할 수 있다.

위 Enum은 다음 상수 형태로 표현이 가능하다

{% tabs %}
{% tab title="Week" %}
{% code title="Week.java" %}

```java
public class Week {
    public static final String MONDAY = "MONDAY";
    public static final String TUESDAY = "TUESDAY";
    public static final String WEDNESDAY = "WEDNESDAY";
    public static final String THURSDAY = "THURSDAY";
    public static final String FRIDAY = "FRIDAY";
    public static final String SATURDAY = "SATURDAY";
    public static final String SUNDAY = "SUNDAY";
}
```

{% endcode %}
{% endtab %}

{% tab title="EnumExample02" %}
{% code title="EnumExample02.java" %}

```java
public class EnumExample02 {
    public static void main(String[] args){
        System.out.println(Week.MONDAY);
        System.out.println(Week.TUESDAY);
        System.out.println(Week.WEDNESDAY);
        System.out.println(Week.THURSDAY);
        System.out.println(Week.FRIDAY);
        System.out.println(Week.SATURDAY);
        System.out.println(Week.SUNDAY);
    }
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

### 데모 2 : 내부에 값을 가지는 Enum

{% tabs %}
{% tab title="Week" %}
{% code title="Week.java" %}

```java
public enum Week {
	MONDAY("월요일"),
	TUESDAY("화요일"),
	WEDNESDAY("수요일"),
	THURSDAY("목요일"),
	FRIDAY("금요일"),
	SATURDAY("토요일"),
	SUNDAY("일요일");
	
	private String value;
	Week(String value){
		this.value = value;
	}
	public String getValue() {
		return this.value;
	}
}
```

{% endcode %}
{% endtab %}

{% tab title="EnumExample03" %}
{% code title="EnumExample03" %}

```java
public class EnumExample03 {
    public static void main(String[] args){
        System.out.println(Week.MONDAY.name());
        System.out.println(Week.MONDAY.ordinal());
        System.out.println(Week.MONDAY.getValue());
        System.out.println(Week.TUESDAY.name());
        System.out.println(Week.TUESDAY.ordinal());
        System.out.println(Week.TUESDAY.getValue());
        System.out.println(Week.WEDNESDAY.name());
        System.out.println(Week.WEDNESDAY.ordinal());
        System.out.println(Week.WEDNESDAY.getValue());
        System.out.println(Week.THURSDAY.name());
        System.out.println(Week.THURSDAY.ordinal());
        System.out.println(Week.THURSDAY.getValue());
        System.out.println(Week.FRIDAY.name());
        System.out.println(Week.FRIDAY.ordinal());
        System.out.println(Week.FRIDAY.getValue());
        System.out.println(Week.SATURDAY.name());
        System.out.println(Week.SATURDAY.ordinal());
        System.out.println(Week.SATURDAY.getValue());
        System.out.println(Week.SUNDAY.name());
        System.out.println(Week.SUNDAY.ordinal());
        System.out.println(Week.SUNDAY.getValue());
    }
}
```

{% endcode %}
{% endtab %}

{% tab title="실행 결과" %}

```
MONDAY
0
월요일
TUESDAY
1
화요일
WEDNESDAY
2
수요일
THURSDAY
3
목요일
FRIDAY
4
금요일
SATURDAY
5
토요일
SUNDAY
6
일요일
```

{% endtab %}
{% endtabs %}

이름과 별개로 값을 가질 수 있으며, 이 때는 내부에 변수를 만들고 생성자를 구현해야 한다. 또한 열거형 상수 선언 시 ( ) 안에 생성자에 들어갈 데이터를 명시해야 한다. 변수는 여러 개 만들어서 여러 값을 보관시킬 수 있다. `getValue()` 는 임의의 getter 메소드이며, 데이터가 많다면 많이 만들어서 원하는 작업을 처리할 수 있다.

{% hint style="info" %}
Enum의 생성자는 public일 수 없다.
{% endhint %}

이 예제를 통해 단순 상수 선언보다 Enum은 더 많은 데이터와 기능을 묶어서 가질 수 있음을 알 수 있다.

### 데모 3 : valueOf() 의 활용

{% tabs %}
{% tab title="Holiday" %}
{% code title="Holiday.java" %}

```java
public enum Holiday {
	NEWYEAR("신정", 1, 1),
	LABORDAY("근로자의날", 5, 1),
	CHILDRENSDAY("어린이날", 5, 5),
	MEMORIALDAY("현충일", 6, 6),
	INDEPENDENTDAY("광복절", 8, 15),
	CHRISTMAS("크리스마스", 12, 25);
	
	private String name;
	private int month, day;
	Holiday(String name, int month, int day){
		this.name = name;
		this.month = month;
		this.day = day;
	}
	public String getName() {
		return name;
	}
	public int getMonth() {
		return month;
	}
	public int getDay() {
		return day;
	}
}
```

{% endcode %}
{% endtab %}

{% tab title="EnumExample04" %}
{% code title="EnumExample04.java" %}

```java
public class EnumExample04 {
    public static void main(String[] args){
        String name = "CHILDRENSDAY";
        Holiday holiday = Holiday.valueOf(name);
        
        System.out.println(holiday.getName());
        System.out.println(holiday.getMonth());
        System.out.println(holiday.getDay());
    }
}
```

{% endcode %}
{% endtab %}
{% endtabs %}

`valueOf()`는 생성된 열거형 데이터 중에 해당하는 이름이 존재할 경우 객체를 반환하는 명령이다. 존재하지 않을 경우 `java.lang.IllegalArgumentException`을 발생시킨다. 이를 통하여 기존의 상수에 비해 좀 더 다양한 처리를 구현할 수 있다.
