ENUM

Min Kyu Jeon·2021년 9월 7일
3

열거형 enums

서로 관련된 상수를 편리하게 선언하기 위한 것

  • Enum으로 정의
enum Command { EXIT, CREATE, LIST } //String형식으로 들어감
// <열거형이름> <상수> 
  • Class로 정의
class Command {
    static final Command EXIT = new Direction("EXIT");
    static final Command CREATE = new Direction("CREATE");
    static final Command LIST = new Direction("LIST");
    
    private String command;
    private Command(String str){
        this.command = str;
    }
}

메소드

메소드내용
getDeclaringClass()enum의 Class 객체를 반환
name()enum의 이름을 문자열로 반환
ordinal()enum에 정의된 순서를 반환
valueOf(String)String과 일치하는 enum 반환
values()enum의 요소들을 순서대로 배열로 반환
compareTo(E)지정된 객체의 순서를 비교. 지정된 객체보다 작은 경우 음의 정수, 동일하면 0, 크면 양의 정수 리턴

열거형 상수간의 비교시 '==' 연산자 사용가능 (equals보다 빠른성능)
그러나 비교연산자는 사용불가 (compareTo사용)

  • 코드
public class Main {
    public static void main(String[] args) {
        Command c = Command.EXIT;
        System.out.println(c.getDeclaringClass());
        System.out.println(c.name());
        System.out.println(c.ordinal());
        Command b = Command.valueOf("CREATE");
        System.out.println(b);
        System.out.println(c.compareTo(b));
    }
}
  • 실행결과

Enum에 멤버 추가

(열거형 상수의 값 추가)
기본적인 인덱스 대신 멤버 변수를 두는것 ( 변수와 생성자를 추가해야함)
멤버는 여러개 가능

enum Command {
    EXIT("exit"), CREATE("create"), LIST("list"), ELSE("");
    private final String command;

    Command(String str) {
        this.command = str;
    }
    public String get() {
    	return command;
    }
    public static Command findBy(String command) {
        for (Command commandType : values()) {
            if (commandType.command.equals(command)) {
                return commandType;
            }
        }
        return ELSE;
    }
}
  • Stream 이용
enum Command {
    EXIT("exit"), CREATE("create"), LIST("list"), ELSE("");
    private final String command;

    Command(String str) {
        this.command = str;
    }
    public String get() {
    	return command;
    }
    public static Command getCommandType(String command){
        return Arrays.stream(values())
                .filter(commandType -> commandType.command.equals(command))
                .findAny()
                .orElse(ELSE);
    }
}
  • HashMap을 통해 성능 향상
enum Command {
    EXIT, CREATE, LIST, ELSE;
    private static final Map<String, Command> stringToEnum = new HashMap<String, Command>();

    static {
        stringToEnum.put("exit", EXIT);
        stringToEnum.put("create", CREATE);
        stringToEnum.put("list", LIST);
    }
    
    public String get(){
    	return stringToEnum.
    }
    public static Command findBy(String command) {
        Command cm = stringToEnum.get(command);
        if(cm==null) return ELSE;
        else return cm;
    }
}

사용예

  • switch문에 적용
    이 때 case문에 열거형의 이름은 적지 않고 상수의 이름만 적는 제약이 있음.

    public void CommandLineApplicationRun() throws IOException {
        while (true) {
            //String command = "";
            bw.write("명령어를 입력해주세요. \n");bw.flush();
            Command command = Command.findBy(br.readLine());
            switch (command) {
                case EXIT:
                    bw.write("프로그램을 종료합니다");
                    bw.flush();
                    bw.close();
                    return;
                case CREATE:
                    bw.write("Voucher 타입 번호를 입력하세요.\n 1:FixedAmount    2:PrecentDiscount\n");
                    bw.flush();
                    command = Command.findBy(br.readLine());
                    if (!createSelect(command)) continue;
                    break;
                case LIST:
                    Map<UUID, Voucher> voucherList = voucherService.getVouchers();
                    for (UUID uuid : voucherList.keySet()) {
                        Voucher voc = voucherList.get(uuid);
                        bw.write(voc.toString() + "\n");
                        bw.flush();
                    }
                    break;
                default:
                    bw.write("유효하지 않은 명령어 입니다.\n");
                    bw.flush();
                    continue;
            }
        }
    }
  • Boolen 대신 사용
    코드 가독성이 좋아진다.

Boolen 사용코드

public class Booltest {
    public static void main(String[] args) {
        printGender(true);
        printGender(false);
    }
    public static void printGender(boolean gender){
        if(gender == true){
            System.out.println("I am boy");
        }
        else if(gender == false){
            System.out.println("I am girl");
        }
    }
}

Enum 사용코드

public enum Gender {
    boy,girl
}
import static Gender.*;

public class Booltest {
    public static void main(String[] args) {
        printGender(boy);
        printGender(girl);
    }
    public static void printGender(Gender gender){
        if(gender == boy){
            System.out.println("I am boy");
        }
        else if(gender == girl){
            System.out.println("I am girl");
        }
    }
}

0개의 댓글