Enum 클래스는 고유 타입으로 상수를 이용할 수 있게 하는 특수한 클래스입니다. (자세한 내용) 다음은 가장 기초적 형태의 Enum 선언입니다.

public enum FourDevas {	
  백호, 주작, 청룡, 현무;
}

이렇게 하면 백호, 주작, 청룡, 현무의 4개의 상수가 지정되며 FourDevas 자료형을 통해 해당 상수들을 사용할 수 있습니다.

 

아래 코드에서 변수fd에는 FourDevas 클래스에서 지정한 상수들만 사용 가능하며 String을 지정하려고 하면 예외가 발생합니다.

public class EnumTest {

  public static void main(String[] args) {
    System.out.println(FourDevas.백호);
    // 백호
    
    FourDevas fd = FourDevas.주작;
    System.out.println(fd);
    // 주작
    
    // fd = "참새"; // 예외 발생
  }

}

이를 통해 특정 변수에 할당되는 상수의 범위를 정할 수 있습니다.

 

Enum 클래스는 values()라는 메소드를 기본적으로 제공하며 상수 목록을 배열 형태로 반환합니다.

public class EnumTest2 {
  public static void main(String[] args) {
    
    for(FourDevas f : FourDevas.values()) {
      System.out.println(f);
    }
    
    /*
     * 백호
     * 주작
     * 청룡
     * 현무
     */
    
  }
}

 

스트링 값을 통해 상수에 접근하고 싶다면 valueOf() 메소드를 이용합니다.

FourDevas cr = FourDevas.valueOf("청" + "룡");
System.out.println(cr);
// 청룡

 

상수는 보통 이름과 값이 같지만 생성자getter를 만들어서 상수에 부수 속성을 지정할 수도 있습니다. 상수 선언시 이름 옆에 소괄호를 붙여 부수 속성을 설정합니다. 부수 속성은 한 개 뿐만 아니라 여러개를 지정할 수도 있습니다.

package blog.enex;

public enum Appliance {
  ICE("냉장고"),
  WATER("식기세척기", "세탁기"),
  HEAT("전기장판", "온풍기");
  
  private String[] appList;
  
  // 생성자
  private Appliance(String... ss) {
    this.appList = ss;
  }

  public String getAppList() {
    String outStr = "";
    for(String s : this.appList) {
      outStr += s + " ";
    }
    return outStr;
  }
  
}
package blog.enex;

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

    for(Appliance a : Appliance.values()) {
      System.out.println(a + ": " + a.getAppList());
    }
  }
}
ICE: 냉장고 
WATER: 식기세척기 세탁기 
HEAT: 전기장판 온풍기

 

예제는 영어로 된 문장을 모스 부호로 해석하는 프로그램입니다. 다소 비약이 있는 코드이지만 enum에 대한 예제로 봐주시기 바랍니다.

public enum EngToMorse {
 
    A(".-"),
    N("-."),
    B("-..."),    
    O("---"),
    C("-.-."),
    P(".--."),
    D("-.."),
    Q("--.-"),
    E("."),    
    R(".-."),
    F("..-."),    
    S("..."),
    G("--."),    
    T("-"),
    H("...."),
    U("..-"),
    I(".."),
    V("...-"),
    J(".---"),    
    W(".--"),
    K("-.-"),
    X("-..-"),
    L(".-.."),    
    Y("-.--"),
    M("--"),
    Z("--..");
    
    private String morseCode;
    
    EngToMorse(String morseCode){
        this.morseCode = morseCode;
    }
    
    public String getMorseCode() {
        return morseCode;
    }
    
}
package blog.enex;

public class MorseTest {
  public static void main(String[] args) {
    String exStr = "ArE yoU sERioUs";

    String outCode = "";

    // 모스부호에서 글자간: 띄어쓰기 하나, 단어 사이: 띄어쓰기 둘(원칙)
    for(char c : exStr.toCharArray()) {
      if(c != ' ') {
        outCode += EngToMorse.valueOf(String.valueOf(c).toUpperCase()).getMorseCode();
        outCode += " ";
      } else if (c == ' ') {
        outCode += "  ";
      }

    }
    System.out.println(outCode);
  }
}
.- .-. .   -.-- --- ..-   ... . .-. .. --- ..- ...