본문 바로가기

개인적으로 공부한 것을 정리해 놓은 블로그입니다 틀린 것이 있으면 댓글 부탁 드립니다!


JAVA

JAVA 스터디 17 - ENUM

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

 

enum 이란 ? 

 enum이란 상수 그룹을 나타내는 특수 "클래스"이다 

 

enum의 특징

 

1.내부적으로 enum 은 class를 사용하여 구현된다. 

 

enum FoodType{
    KOREAN,JAPANESE,AMERICAN,ITALY;

}
//내부적으로는 아래와 같이 구현된다.
class FoodType{
    public static final FoodType KOREAN = new FoodType();
    public static final FoodType JAPANESE = new FoodType();
    public static final FoodType AMERICAN = new FoodType();
    public static final FoodType ITALY = new FoodType();
}

 

2.모든 enum의 상수는 enum의 인스턴스를 나타낸다.

 

3.enum은 switch 문의 case 변수로 사용될 수 있다.

 

 

enum FoodType{
    KOREAN,JAPANESE,AMERICAN,ITALY;

}

public class EnumExam {

    FoodType foodType;

    public EnumExam(FoodType foodType){
        this.foodType = foodType;
    }

    public void EnumWithSwitch(){
        switch (foodType){
            case ITALY:
                System.out.println("이태리음식이다");
                break;
            case KOREAN:
                System.out.println("한국음식이다");
                break;
            case AMERICAN:
                System.out.println("미국음식이다");
                break;
            case JAPANESE:
                System.out.println("일본음식이다");
                break;
            default:
                System.out.println("음식이다");
                break;
        }
    }

    public static void main(String[] args) {


        //switch 문에서 enum 활용
        EnumExam enumExam = new EnumExam(FoodType.AMERICAN);
        enumExam.EnumWithSwitch();
    }
}

 

 

결과 : 미국음식이다

 

4.모든 enum은 java . lang . Enum class를 상속 받는다. 자바에서는 단일 상속만 허용하기 때문에 다른 클래스를 상속받을 수 없다

 

5.toString() 은 Enum class 에서 override 되어 있으며 상수명을 리턴한다.

 

6.enum 은 여러 인터페이스를 상속 받을 수 있다 .   

 

enum 의 정의 및 사용

 

자바에서는 enum 키워드를 사용하여 enum 을 선언하고 구현구에 상수이름과  콤마 ( , )를 이용해서  enum을 클래스를 만들 수 있다. enum 의 상수 이름은 대문자로 정의해야 한다.

 

enum 열거체이름{상수1이름 , 상수2이름, ....}



enum Rainbow{RED,ORANGE,YELLOW,GREEN,BLUE,INDIGO,VIOLET}

 

이렇게 정의된 enum을 사용하는 방법은 다음과 같다 .

 

열거체이름.상수이름

Rainbow.RED

 

 enum의 상숫값 정의 및 추가

 

  위와 같이 정의된 열거체의 첫 번째 상숫값은 0부터 설정되며 , 그 다음은 바로 앞의 상숫값보다 1만큼 증가되며 설정된다. 또한 ,불규칙한 값을 상숫값으로 설정하고 싶으면 상수의 이름 옆에 괄호(())를 추가하고 , 그 안에 원하는 상숫값을 명시할 수 있다. 

하지만 이때에는 불규칙한 특정 값을 저장할 수 있는 인스턴스 변수와 생성자를 다음과 같이 별도로 추가해야 한다.

 

enum이 제공하는 메소드

 

 1. values() : 열거된 모든 원소를 배열에 담아 순서대로 반환한다. 

 

enum FoodType{
    KOREAN,JAPANESE,AMERICAN,ITALY
}
public class EnumExam {

    public static void main(String[] args) {

        Food food = new Food("김치찌개",FoodType.KOREAN);
        Food food1 = new Food("pasta" , FoodType.ITALY);
        Food food2 = new Food("burger" , FoodType.AMERICAN);
        Food food3 = new Food("sushi" , FoodType.JAPANESE );

        //enum 의 메서드들
        //1.values()
        //열거된 모든 원소를 배열에 담아 순서대로 반환
        FoodType[] values = FoodType.values();
        for (FoodType value : values) {
            System.out.println(value);
        }

    }
}

result:

KOREAN
JAPANESE
AMERICAN
ITALY

Process finished with exit code 0

2.valueof(String name):  파라미터로 주어진 String과 열거형에서 일치하는 이름을 갖는 원소를 반환한다.

(주어진 String과 일치하는 원소가 없는 경우 illegalArgumentException 발생)

 

//2.valueOf()
FoodType italy = FoodType.valueOf("ITALY");
System.out.println(italy);

 

enum 과 생성자

 

enum은 생성자를 갖을 수 있으며 , enum 클래스 로드시 각각의 상수에 대해 개별적으로 실행된다.

하지만 이넘 객체를 생성할 수 없음으로 생성자를 직접 호출 할 수는 없다 .

 

enum과 메서드

 

enum에 일반 메서드와 추상메서드를 정의할 수 있다. 만약 enum이 추상 메서드를 가지고 있다면 각각의 인스턴스는 추상메서드를 구현해야한다.

 

enum Color{
    RED,GREEN,BLUE;

    Color() {
        System.out.println("생성자 호출됨:"+this.toString());
    }
    public void colorInfo(){
        System.out.println("색깔 상수 이넘");
    }
}

public class EnumExam2 {
    public static void main(String[] args) {
        Color c1 = Color.BLUE;
        System.out.println(c1);
        c1.colorInfo();
    }
}

결과값

생성자 호출됨:RED
생성자 호출됨:GREEN
생성자 호출됨:BLUE
BLUE
색깔 상수 이넘

Process finished with exit code 0

 

결과 값을 보면 각각의 상수에 개별적으로 생성자가 호출되었고 enum에 정의한 메서드가 호출 되었다.

Java.lang.Enum Class in Java

 enum 클래스는 java.lang 패키지에 위치해 있다.  모든 자바 언어 Enum 타입의 공통 기본 클래스다. 

 

enum 클래스의 정의를 보면 아래와 같이 추상클래스로 정의 되어있기 때문에 Enum 객체를 생성할 수 없다 .

 

public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable {

EnumSet 

 

 enumSet은 enum 타입을 사용하는데 필요한 Set 인터페이스를 구현하는 특수 유형 클래스이다.

 

EnumSet의 특징

 

 1. enumSet은 AbstractSet을 상속받으며 SetInterface를 구현한다.

 2. enumSet은 자바 컬렉션의 멤버이며 , 동기화되지 않았다.

 3. enumSet은 HashSet보다 빠로게 작동하는 고성능 구현체이다.

 4. 모든 enumSet의 모든 요소는 집합이 set이 생성 될 때 지정되는 single enumeration type이여야 한다.

 

 왜 enumSet을 쓰는가?

 

  enumSet의 모든 메서드는 비트 산술 연산을 사용하여 구현된다.  이러한 계산은 매우 빠르고 일정한 시간으로 실행되며 메모리를 덜 사용하고 간결하고 효율적이다.

 

enumSet의 메서드

 

메서드 설명
allOf (Class elementType) 지정된 요소 유형을 가진 모든 요소를 포함하는 enumSet을 만드는데 사용된다.
noneOf (Class elementType) 지정된 요소 유형으로 빈 열거형 집합을 만드는 데 사용된다.
copyOf (Collection c) 지정된 컬렉션으로 초기화되는 enumSet을 만드는데 사용된다.
of (E e) 지정된 단일 요소를 포함하는 열거 형 집합을 만드는데 사용된다. 
range (E from, E to) 지정된 요소 범위를 포함하는 enumSet을 만드는데 사용된다.
clone() 특정 집합의 복사본을 반환하는 데 사용된다.

지정된 집합에 포함되지 않은이 형식의 모든 요소를 ​​처음에 포함하는 지정된 열거 집합과 동일한 요소 형식을 사용하여 열거 집합을 만듭니다.

 

enumSet예제

 

    import java.util.EnumSet;
    enum example
    {
        one, two, three, four, five
    };
    public class EnumSetExam
    {
        public static void main(String[] args)
        {
            // Creating a set
            EnumSet<example> set1, set2, set3, set4;

            // 지정한 enum 요소를 사용하여 enumSet을 만들어낸다.
            set1 = EnumSet.of(example.four, example.three,
                    example.two, example.one);
            //지정된 enumSet에서 포함되지 않은 요소를 사용하여 enumSet을 만든다.
            set2 = EnumSet.complementOf(set1);
            //enum의 모든 요소를 사용하여 enumSet을 만들어낸다
            set3 = EnumSet.allOf(example.class);
            //enum의 범위를 지정하여 enumSet을 만들어낸다
            set4 = EnumSet.range(example.one, example.three);
            System.out.println("Set 1: " + set1);
            System.out.println("Set 2: " + set2);
            System.out.println("Set 3: " + set3);
            System.out.println("Set 4: " + set4);
        }
    }

 

enumSet 참조 www.educative.io/edpresso/what-is-an-enumset-in-java   

enum 개념 및 특징 참조  www.geeksforgeeks.org/enum-in-java/

반응형

'JAVA' 카테고리의 다른 글

JAVA 스터디 20 - 람다식 (Lamda Expression)  (0) 2021.03.27
JAVA 스터디 18 - 애노테이션  (0) 2021.03.26
JAVA 스터디 15 - 예외처리  (0) 2021.03.24
JAVA 스터디 14 - 인터페이스  (0) 2021.03.24
JAVA 스터디 13 - 접근제어자  (0) 2021.03.23