코딩쿠의 코드 연대기

Java) Enum 본문

코딩스터디/JAVA스터디

Java) Enum

코딩쿠 2024. 11. 17. 22:18

학습목표

  • enum 정의하는 방법
  • enum이 제공하는 메소드 (values()와 valueOf())
  • java.lang.Enum
  • EnumSet

enum 정의하는 방법

Java에서 enum(열거형)을 정의하는 방법은 다음과 같습니다.

Java

enum 요일 {
    월요일, 화요일, 수요일, 목요일, 금요일, 토요일, 일요일
}

설명:

  • enum 키워드를 사용하여 열거형을 선언합니다.
  • 열거형 이름은 일반적으로 대문자로 시작합니다 (예: 요일).
  • 중괄호 {} 안에 열거형 상수들을 쉼표로 구분하여 나열합니다.
  • 열거형 상수는 기본적으로 public, static, final 입니다.

예제:

Java

public class EnumExample {
    enum 요일 {
        월요일, 화요일, 수요일, 목요일, 금요일, 토요일, 일요일
    }

    public static void main(String[] args) {
        요일 오늘 = 요일.수요일;
        System.out.println(오늘);  // 출력: 수요일
    }
}

enum의 장점:

  • 가독성 향상: 코드를 읽고 이해하기 쉽습니다.
  • 타입 안정성: 컴파일 타임에 오류를 확인할 수 있습니다.
  • 유지보수 용이: 코드 변경이 쉽습니다.
  • 확장성: 필요에 따라 새로운 상수를 추가할 수 있습니다.

추가 정보:

  • enum은 클래스처럼 생성자, 메서드, 필드를 가질 수 있습니다.
  • ordinal() 메서드를 사용하여 상수의 순서 값(0부터 시작)을 얻을 수 있습니다.
  • values() 메서드를 사용하여 모든 상수를 배열로 얻을 수 있습니다.

더 자세한 내용은 다음 링크를 참조하십시오.

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

Java enum은 기본적으로 values()valueOf() 메소드를 제공합니다. 이 메소드들은 enum 상수들을 다루는 데 유용하게 사용됩니다.

1. values() 메소드

  • 기능: enum에 정의된 모든 상수들을 순서대로 포함하는 배열을 반환합니다.
  • 반환 타입: enum 타입[] (예: 요일[])
  • 사용 예시:

Java

enum 요일 {
    월요일, 화요일, 수요일, 목요일, 금요일, 토요일, 일요일
}

public class EnumExample {
    public static void main(String[] args) {
        요일[] 요일들 = 요일.values(); 

        for (요일 요일 : 요일들) {
            System.out.println(요일); 
        }
        // 출력:
        // 월요일
        // 화요일
        // 수요일
        // 목요일
        // 금요일
        // 토요일
        // 일요일
    }
}

2. valueOf() 메소드

  • 기능: 주어진 문자열과 일치하는 이름을 가진 enum 상수를 반환합니다.
  • 매개변수: String (enum 상수의 이름)
  • 반환 타입: enum 타입 (예: 요일)
  • 예외: 주어진 문자열과 일치하는 enum 상수가 없으면 IllegalArgumentException이 발생합니다.
  • 사용 예시:

Java

enum 요일 {
    월요일, 화요일, 수요일, 목요일, 금요일, 토요일, 일요일
}

public class EnumExample {
    public static void main(String[] args) {
        요일 오늘 = 요일.valueOf("수요일"); 
        System.out.println(오늘);  // 출력: 수요일
    }
}

주의 사항: valueOf() 메소드에 전달하는 문자열은 enum 상수의 이름과 정확히 일치해야 합니다. 대소문자도 구분합니다.

활용 예시:

  • values() 메소드는 enum의 모든 상수를 순회하며 작업을 수행할 때 유용합니다. 예를 들어, 모든 요일에 대한 작업을 처리하거나, 드롭다운 목록에 모든 요일을 표시할 때 사용할 수 있습니다.
  • valueOf() 메소드는 외부에서 문자열 형태로 enum 값을 입력받아 처리할 때 유용합니다. 예를 들어, 사용자로부터 요일을 입력받아 해당 요일에 대한 정보를 출력하는 프로그램을 작성할 수 있습니다.

이 외에도 enum은 ordinal(), name(), compareTo() 등의 메소드를 제공합니다.

java.lang.Enum

java.lang.Enum은 Java에서 모든 열거형(enum)의 최상위 클래스입니다. 즉, 사용자가 정의하는 모든 enum은 암묵적으로 java.lang.Enum 클래스를 상속받습니다.

java.lang.Enum 클래스는 enum 타입들이 공통적으로 가지는 메서드들을 제공하며, enum을 다루는 데 필요한 기능들을 포함하고 있습니다.

주요 특징:

  • 추상 클래스: java.lang.Enum은 추상 클래스이기 때문에 직접 인스턴스를 생성할 수 없습니다.
  • final 클래스: java.lang.Enum은 final 클래스이기 때문에 다른 클래스가 java.lang.Enum을 상속할 수 없습니다.
  • 생성자: java.lang.Enum은 protected 생성자를 가지고 있어서, enum 상수들이 인스턴스화될 때 사용됩니다. 사용자가 직접 enum의 생성자를 호출할 수는 없습니다.

주요 메서드:

  • name(): enum 상수의 이름을 문자열로 반환합니다.
  • ordinal(): enum 상수의 순서 값(0부터 시작)을 정수로 반환합니다.
  • compareTo(E o): 현재 enum 상수와 지정된 enum 상수의 순서를 비교합니다.
  • equals(Object other): 현재 enum 상수와 지정된 객체가 같은지 비교합니다.
  • hashCode(): enum 상수의 해시 코드를 반환합니다.
  • toString(): enum 상수의 이름을 문자열로 반환합니다. (기본적으로 name()과 동일한 결과를 반환합니다.)
  • valueOf(Class<T> enumType, String name): 지정된 이름을 가진 enum 상수를 반환합니다.
  • values(): enum에 정의된 모든 상수들을 배열로 반환합니다. (각 enum 타입에 대해 컴파일러가 자동으로 생성합니다.)

활용:

java.lang.Enum 클래스는 enum 타입을 다루는 데 필요한 기본적인 기능을 제공합니다.

  • name() 메서드는 enum 상수를 문자열로 표현해야 할 때 유용합니다.
  • ordinal() 메서드는 enum 상수의 순서를 기반으로 작업을 수행할 때 유용합니다.
  • compareTo() 메서드는 enum 상수들을 정렬할 때 유용합니다.

예제:

Java

enum 요일 {
    월요일, 화요일, 수요일, 목요일, 금요일, 토요일, 일요일
}

public class EnumExample {
    public static void main(String[] args) {
        요일 오늘 = 요일.수요일;

        System.out.println(오늘.name());  // 출력: 수요일
        System.out.println(오늘.ordinal()); // 출력: 2
    }
}

이처럼 java.lang.Enum 클래스는 Java enum의 기반을 이루는 중요한 클래스입니다. enum을 사용할 때 java.lang.Enum 클래스가 제공하는 메서드들을 활용하면 enum을 더욱 효과적으로 사용할 수 있습니다. 궁금한 점이 있다면 언제든지 질문하세요! 😊

EnumSet

EnumSet은 Java Collections Framework에 포함된 특수한 Set 구현체로, enum 타입의 요소만 저장할 수 있도록 설계되었습니다.

일반적인 HashSet과 같은 Set 구현체와 비교했을 때, EnumSetenum에 최적화되어 더 빠르고 효율적인 연산을 제공합니다.

주요 특징:

  • 타입 안전성: EnumSet은 특정 enum 타입의 상수만 저장할 수 있으므로, 컴파일 타임에 타입 안전성을 보장합니다.
  • 성능: 내부적으로 비트 벡터를 사용하여 구현되어 있어, HashSet보다 메모리 사용량이 적고 연산 속도가 빠릅니다.
  • null 허용 안 함: EnumSet에는 null 값을 저장할 수 없습니다. null을 추가하려고 하면 NullPointerException이 발생합니다.
  • 구현: EnumSet은 추상 클래스이며, RegularEnumSetJumboEnumSet 두 가지 구현체를 갖습니다. enum의 요소 개수에 따라 적절한 구현체가 선택됩니다.

장점:

  • 가독성 및 유지보수: enum 상수를 사용하여 코드를 명확하게 작성할 수 있으며, 유지보수가 용이합니다.
  • 효율성: 비트 벡터를 사용하여 구현되어 있어, 메모리 사용량이 적고 연산 속도가 빠릅니다. 특히 많은 수의 enum 상수를 다룰 때 성능 이점이 두드러집니다.

생성 방법:

EnumSet은 생성자를 제공하지 않고, 정적 팩토리 메서드를 통해 인스턴스를 생성합니다. 몇 가지 주요 메서드는 다음과 같습니다.

  • allOf(Class<E> elementType): 지정된 enum 타입의 모든 상수를 포함하는 EnumSet을 생성합니다.
  • noneOf(Class<E> elementType): 지정된 enum 타입의 상수를 포함하지 않는 빈 EnumSet을 생성합니다.
  • of(E first, E... rest): 지정된 enum 상수들을 포함하는 EnumSet을 생성합니다.
  • range(E from, E to): 지정된 범위의 enum 상수들을 포함하는 EnumSet을 생성합니다.

활용 예시:

Java

enum 요일 {
    월요일, 화요일, 수요일, 목요일, 금요일, 토요일, 일요일
}

public class EnumSetExample {
    public static void main(String[] args) {
        // 모든 요일을 포함하는 EnumSet
        EnumSet<요일> 모든요일 = EnumSet.allOf(요일.class); 

        // 주말을 포함하는 EnumSet
        EnumSet<요일> 주말 = EnumSet.of(요일.토요일, 요일.일요일); 

        // 평일을 포함하는 EnumSet
        EnumSet<요일> 평일 = EnumSet.complementOf(주말); 

        System.out.println("모든 요일: " + 모든요일); // 출력: 모든 요일: [월요일, 화요일, 수요일, 목요일, 금요일, 토요일, 일요일]
        System.out.println("주말: " + 주말); // 출력: 주말: [토요일, 일요일]
        System.out.println("평일: " + 평일); // 출력: 평일: [월요일, 화요일, 수요일, 목요일, 금요일]
    }
}

요약:

EnumSet은 enum 타입에 특화된 Set 구현체로, 성능과 타입 안전성을 동시에 제공합니다. enum 상수를 다루는 작업이 많거나 성능이 중요한 경우 EnumSet을 사용하는 것이 좋습니다.

'코딩스터디 > JAVA스터디' 카테고리의 다른 글

Java) I/O  (0) 2024.11.19
Java 애노테이션  (3) 2024.11.18
Java 멀티쓰레드 프로그래밍  (2) 2024.11.16
Java 예외 처리  (4) 2024.11.15
Java) 인터페이스 (interface)  (6) 2024.11.14