korean IT student

[Java-Live-Study] 11주차 - Enum 본문

back-end/JAVA

[Java-Live-Study] 11주차 - Enum

현창이 2021. 12. 1. 14:46

 

목표

자바의 열거형에 대해 학습하세요.

학습할 것 (필수)

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

 

Enum 이란?

enum Fruit { APPLE, BANANA, PEAR }

public class main {
    public static void main(String[] args) {
        System.out.println(Fruit.APPLE);
        System.out.println(Fruit.BANANA);
        System.out.println(Fruit.PEAR);
    }
    /*실행 결과
    * APPLE
    * BANANA
    * PEAR
    * */
}

enum(열거형)은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 상수를 여러 개 정의할 때 사용한다. enum은 여러 상수를 정의한 후, 정의된 것 이외의 값은 허용하지 않는다.

 

Enum 정의하는 방법

일반적인 생성 방법

enum 열거형이름 { 상수명1, 상수명2, 상수명3 ... }
enum Fruit { APPLE, BANANA, PEAR }

괄호 { } 안에 상수의 이름을 나열하기만 하면 된다.

 

이를 클래스로 정의하면 아래와 같이 표현할 수 있다.

class Fruit {
    public static final Fruit APPLE = new Fruit("APPLE");
    public static final Fruit BANANA = new Fruit("BANANA");
    public static final Fruit PEACH = new Fruit("PEACH");

    private String name;

    private Fruit(String name) {
        this.name = name;
    }
}

생성자와 메서드 생성 방법

 

enum Fruit {
    APPLE("사과"),
    BANANA("바나나"),
    PEAR("배");

    private String name;

    Fruit(String name){
        this.name = name;
    }

    public String value() {
        return  name;
    }


}

public class main {
    public static void main(String[] args) {

        System.out.println(Fruit.APPLE.value());
        System.out.println(Fruit.BANANA.value());
        System.out.println(Fruit.PEAR.value());
    }
    /*실행 결과
    * 사과
    * 바나나
    * 배
    * */
}

Enum 생성자는 왜 private인가?

  • enum타입은 고정된 상수들의 값의 집합으로 Runtime이 아닌 컴파일 타임에 모든 값을 알고 있어야 하므로 다른 패키지나 클래스에서 enum 타입에 접근해서 동적으로 어떤 값을 정해줄 수 없다. 따라서 컴파일 시에 타입 안정성이 보장된다.
  • 생성자의 접근 제어자를 private가 아닌 public, protected으로 할 수 없다.
  • enum은 외부에서 접근할 수 있는 생성자가 없어 실제적으로 final이나 다름 없고 외부에서 인스턴스를 생성 할 수 없습니다.

Enum이 제공하는 메서드

values()

enum Fruit {
    APPLE,BANANA,PEAR;
}

public class main {
    public static void main(String[] args) {

        for(Fruit x : Fruit.values()){
            System.out.println(x);
        }

        for(var x : Fruit.values()){
            System.out.println(x);
        }

    }
    /*실행 결과
    * APPLE
    * BANANA
    * PEAR
    * */
}

해당 enum 타입에 정의된 상수 배열을 반환

 

valueOf()

 

enum Fruit {
    APPLE,BANANA,PEAR;
}

public class main {
    public static void main(String[] args) {
        Enum.valueOf(Fruit.class,"APPLE");
        Fruit.valueOf("PEAR");

    }
    /*실행 결과
    * APPLE
    * PEAR
    * */
}

지정된 열거형에서 name과 일치하는 열거형 상수를 반환

 

java.lang.Enum

  • Enum 클래스는 모든 자바 열거체의 공통된 조상 클래스입니다.
  • Enum 클래스에는 열거체를 조작하기 위한 다양한 메소드가 포함되어 있습니다.

EnumSet

import java.util.EnumSet;

enum Fruit {
    APPLE,BANANA,PEAR,GRAPE,WATERMELON;
}

public class main {
    public static void main(String[] args) {
        EnumSet<Fruit> fruitEnumSet1 = EnumSet.allOf(Fruit.class);  //모든 요소를 포함한 enum셋트
        System.out.println("fruitEnumSet1: " + fruitEnumSet1);

        EnumSet<Fruit> fruitEnumSet2 = EnumSet.of(Fruit.GRAPE); // 지정된 요를 포함한 enum셋트
        System.out.println("fruitEnumSet2: " + fruitEnumSet2);

        fruitEnumSet2.add(Fruit.APPLE);                         // 지정한 요소를 추가
        System.out.println("fruitEnumSet2: " + fruitEnumSet2);

        fruitEnumSet2.remove(Fruit.GRAPE);                      // 지정한 요소를 삭제
        System.out.println("fruitEnumSet2: " + fruitEnumSet2);


        EnumSet<Fruit> fruitEnumSet3 = fruitEnumSet2.clone();   // 지정된 enum셋트와 같은 요소의 enum셋트 복체
        System.out.println("fruitEnumSet3: " + fruitEnumSet3);

        EnumSet<Fruit> fruitEnumSet4 = EnumSet.complementOf(fruitEnumSet2); //지정된 enum셋트외의 enum셋트
        System.out.println("fruitEnumSet4: " + fruitEnumSet4);

        EnumSet<Fruit> fruitEnumSet5 = EnumSet.noneOf(Fruit.class); //빈 상의 enum셋트
        System.out.println("fruitEnumSet5: " + fruitEnumSet5);

        EnumSet<Fruit> fruitEnumSet6 = EnumSet.range(Fruit.PEAR, Fruit.WATERMELON);    // 지정된 2개의 enum셋트의 범위의 enum셋트
        System.out.println("fruitEnumSet6: " + fruitEnumSet6);

    }
}

출력 값

  • EnumSet은 Set 인터페이스를 기반으로 하여 enum 열거요소들을 다룰수 있는 기능을 제공

 

출처 - https://wisdom-and-record.tistory.com/52

Comments