본문 바로가기

개발/Java

Enum

자바가 제공하는 열거형 타입인 Enum ?

Enum

Java에서 Enum Type은 서로 연관된 상수들의 집합을 정의할 때 유용하게 사용되어진다.

특정 값들이 제한된 범위 안에 있을 때, 해당 값들을 열거형으로 정의하면 코드의 가독성과 안전성이 크게 향상된다.

 

그럼 Enum을 사용하지 않았을때와 사용했을때의 차이점을 보며 Enum을 쓰는 이유를 살펴보자.

public class EnumExample1 {
    public static void main(String[] args) {
        String today = "Monday";
        
        if (today.equals("Sunday")) {
            System.out.println("It's a holiday!");
        } else {
            System.out.println("It's a working day.");
        }
    }
}

위 코드는 요일을 문자열로 표현하고 있지만, 문자열 비교에서 발생할 수 있는 오타나 예외 처리 문제가 존재한다.

여기서 만약 "monday"처럼 소문자로 입력되거나 오타가 있다면, 원하는 결과를 얻지 못할 수 있다.

 

열거형 사용

enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

public class EnumExample2 {
    public static void main(String[] args) {
        Day today = Day.MONDAY;
        
        if (today == Day.SUNDAY) {
            System.out.println("It's a holiday!");
        } else {
            System.out.println("It's a working day.");
        }
    }
}

열거형을 사용하면 미리 정의된 값만 사용하게 되어 오류를 줄이고, 코드의 가독성을 높일 수 있다. 정의된 값만 사용하니 오타나 실수를 걱정안해도 된다.

 

enum Day {
    SUNDAY {
        @Override
        public boolean isHoliday() {
            return true;
        }
    },
    MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;

    public boolean isHoliday() {
        return false;
    }
}

public class EnumExample1 {
    public static void main(String[] args) {
        Day today = Day.SUNDAY;

        if (today.isHoliday()) {
            System.out.println("It's a holiday!");
        } else {
            System.out.println("It's a working day.");
        }
    }
}

좀 더 나아가서 상수 집합 이상으로 동작할 수 있도록 할 수 있는데 각 요일마다 공휴일을 지정하도록 코드를 작성할수가 있다.

 

그럼 Enum 열거형 타입을 사용해서 HttpStatusCode를 다루는 코드를 간단하게나마 만들어보자.

package enumeration;

import java.util.Optional;

public enum HttpStatus {
    OK(200, "OK"),
    BAD_REQUEST(400, "Bad Request"),
    NOT_FOUND(404, "Not Found"),
    INTERNAL_SERVER_ERROR(500, "Internal Server Error");

    private final int code;
    private final String message;

    HttpStatus(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }

    public boolean isSuccess() {
        return code >= 200 && code <= 299;
    }

    public static Optional<HttpStatus> findByCode(int code) {
        for (HttpStatus status : values()) {
            if (status.getCode() == code) {
                return Optional.of(status);
            }
        }
        return Optional.empty();
    }

    @Override
    public String toString() {
        return code + " " + message;
    }
}

findByCode 함수가 핵심인데, Enum으로 관리되어지는 code값(200, 400, 404, 500)을 전달받아 처리하는데 여기서 만약에 Enum에서 설정한 코드가 아닌경우에는 Optional을 사용함으로써 null 대신 값이 없음을 명시적으로 표현해주었다.

(null을 리턴해버리면 NullPointerException이 날 수 있기 때문!)

 

위에서 만든 HttpStatus Main Example Code

package enumeration;
import java.util.Optional;
import java.util.Scanner;

public class HttpStatusMain {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("HTTP CODE: ");

        int httpCodeInput = scanner.nextInt();
        Optional<HttpStatus> status = HttpStatus.findByCode(httpCodeInput);

        if (status.isPresent()) {
            HttpStatus httpStatus = status.get();
            System.out.println("HTTP Status: " + httpStatus);

            // 3. 성공 여부를 출력
            if (httpStatus.isSuccess()) {
                System.out.println("The request was successful!");
            } else {
                System.out.println("The request failed.");
            }
        } else {
            System.out.println("HTTP Status code " + httpCodeInput + " not found.");
        }
    }
}

scanner로 입력받은 값이 찾은 상태 코드(HttpStatus)를 출력하고, isSuccess() 메서드를 사용하여 요청이 성공했는지 여부를 출력할 수 있다.

'개발 > Java' 카테고리의 다른 글

Java 예외처리  (0) 2024.08.17
날짜와 시간  (0) 2024.08.16
String Class  (0) 2024.08.14
불변객체  (0) 2024.08.13
기본형과 참조형  (0) 2024.08.13