🦁아기사자

[Java] Enum

코딩하는 하마 2025. 3. 26. 00:39

enum 정의하는 방법

1) enum 이란?

서로 관련된 상수를 편하게 선언하기 위한 것으로 상수를 여러개 정의할 때 사용한다. 

서로 연관된 상수들의 집합이다.

기존에 상수를 정의하는 방법이였던 final static string과 같이 문자열이나 숫자들을 나타내는 기본 자료형의 값을 enum 을 이용해서 같은 효과를 낼 수 있다.

 

2) enum의 장점

- 코드가 단순해지고 가독성이 좋아진다.

- 인스턴스 생성과 상속을 방지하여 상수값의 타입안정성이 보장된다. 

- enum class 를 사용해 새로운 상수들의 타입을 정의함으로 정의한 타입 이외의 타입을 가진 데이터값을 컴파일시 체크한다.

- 키워드 enum 을 사용하기 때문에 구현의 의도가 열거임을 분명하게 알 수 있다. 

 

3) 정의 방법 

enum 열거형 이름 {
    상수명 1, 상수명2 , 상수명n
 }

 

ex)

public class Main {
    enum Fruit{
        apple,banana,orange,grape;
    }
    public static void main(String[] args) {
        Fruit f;
        System.out.println(Fruit.apple.ordinal());
        System.out.println(Fruit.banana.ordinal());
        System.out.println(Fruit.orange.ordinal());
        System.out.println(Fruit.grape.ordinal());

    }
}

 

실행 결과)

 

enum에서 정의된 상수를 사용하는 방법 : 열거형이름.상수명 -> 클래스 static 변수를 참조하는 것과 같다. 


enum이 제공하는 메소드 (values()와 valueOf())

https://docs.oracle.com/javase/8/docs/api/index.html 

 

Java Platform SE 8

 

docs.oracle.com

 

 

 

values() : 이 메소드는 해당 enum 타입에 정의된 상수 배열을 반환한다.

                  enum 의 모든 상수들을 배열로 만들어준다

Fruit[] arr = Fruit.values();

 

ex)

public class Main {
    enum Fruit{
        apple,banana,orange,grape;
    }
    public static void main(String[] args) {
        Fruit[] f = Fruit.values();
        for(Fruit fruits : f ){
            System.out.println(fruits);
        }

    }
}

 

실행 결과)

 

위 코드와 실행결과와 같이 values()는 모든 상수들을 배열로 만들어 주는 것을 볼 수 있다.

 


 

valueOf() : 지정된 열거형에서 name과 일치하는 열거형 상수를 반환한다.

Fruit f = Fruit.valueOf("apple");
Fruit.apple == Fruit.valueOf("apple"); //true 반환

 

ex)

public class Main {
    enum Fruit{
        apple,banana,orange,grape;
    }
    public static void main(String[] args) {
        Fruit a = Enum.valueOf(Fruit.class, "apple");
        Fruit b = Fruit.valueOf("banana");
        System.out.println(a);
        System.out.println(b);

    }
}

 

실행 결과)

 

그 외에도 나머지 메소드는 위 링크를 참조하면 된다.


java.lang.Enum

Enum 클래스는 모든 자바 언어 열거 타입의 상위 클래스이며 추상 클래스이다.

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

인스턴스의 생성을 막고자 추상클래스를 선언했기 때문에 abstract 메소드가 존재하지 않는다. 

또한 선언하는 enum 타입은 enum 클래스를 자동으로 상속하여 enum 에 제공하는 ordinal과 같은 변수 및 메소드를 사용할 수 있게 된다.


EnumSet

참조 : https://docs.oracle.com/javase/8/docs/api/index.html

 

Java Platform SE 8

 

docs.oracle.com

 

java.util 패키지 클래스로 set 인터페이스를 기반으로 열거형 타입으로 지정해놓은 요소들을 가장 쉽고 빠르게 배열처럼 요소들을 다룰 수 있는 기능을 제공한다. HashSet과 비교했을 때 성능 상 더 좋기 때문에 열거형 데이터를 위한 Set이 필요할 때는 EnumSet을 사용하는 것이 좋다.

 

특징 ) 

- EnumSet 은 AbstractSet 클래스를 상속하고 Set 인터페이스를 구현한다.

- 오직 열거형 상수만을 값으로 가질 수 있고 모든 값은 같은 enum 타입이여야 한다.

- null 요소를 삽입할 수 없다. - NullPointException 발생

- ordinal 값의 순서대로 요소가 저장된다.

- EnumSet은 동기화가 되지 않는다 -> thread-safe 하지 않는다. 

- 모든 메소드는 arithmetic bitwise operation을 사용하므로 모든 기본 연산의 시간 복잡도가 O(1)이다..

- EnumSet의 내부는 추상 클래스이므로 객체로써 생성 및 사용이 불가능하다. -> new 연산자 사용 불가

 

ex)

import java.util.EnumSet;

public class Main {
    enum Fruit{
        apple,banana,orange,grape;
    }
    public static void main(String[] args) {
        EnumSet<Fruit> set1,set2,set3,set4;

        set1 = EnumSet.allOf(Fruit.class);
        set2 = EnumSet.of(Fruit.apple, Fruit.banana,Fruit.grape);
        set3 = EnumSet.complementOf(set2);
        set4 = EnumSet.range(Fruit.orange, Fruit.grape);

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

    }
}

 

실행 결과)

 

 


 

참고 자료
https://codingwell.tistory.com/77

 

[Java] enum(열거형)

enum(열거형)이란, 서로 관련된 상수를 편하게 선언하기 위한 것으로 상수를 여러개 정의해야 할 때 사용한다. 즉, 서로 연관된 상수들의 집합이다. 수많은 언어는 사용자들이 새로운 열거형을 정

codingwell.tistory.com

https://eatnows.tistory.com/91

 

Enum이란?

Enum이란? enum이란 enumerated type의 줄임말로 열거형이라고 부르기도 하는데 컴퓨터 프로그래밍에서 열거형(enumerated type, enumeration)은 요소, 멤버라 불리는 명명된 값의 집합을 이루는 자료형이다.

eatnows.tistory.com

 

'🦁아기사자' 카테고리의 다른 글

[Java] I/O  (0) 2025.03.31
[Java] 애노테이션  (0) 2025.03.27
[Java] 멀티스레드 프로그래밍  (0) 2025.03.25
[Java] 인터페이스  (0) 2025.03.20
[Java] 패키지  (0) 2025.03.19