[Java] Enum class 활용하기

🌟 JAVA Enum

🎯 Enum class이란?

Enum 타입은 서로 연관된 상수들의 집합입니다.
비슷한 속성을 지닌 문자열이나 숫자를 묶어서 클래스로 정의하는 것 입니다.
기본적으로 인덱스가 0부터 자동으로 지정되고,
이외에도 이름에 의미하는 바를 바로 정의 할 수 있어 코드가 단순해집니다.
Enum을 사용하여 새로운 타입을 정의하게 된다는 점을 활용하여
컴파일시 실행되는 타입 체크를 통해 안정성또한 챙길 수 있습니다.
내부에 메소드를 정의할 수 있으며, 각 인스턴스가 가지는 값을
여러개 설정할 수 있습니다.(이런건 파라미터에 활용하면 좋습니다.)

ex)

//PcType이라는 새로운 타입 정의
public enum PcType{
    // 데이터 삽입시 이 세가지중 하나에 해당하는지 체크함
    desktop("d",0), 
    laptop("l",1), 
    gaming("g",2)
}

🎯 Enum class 장점

  1. 인풋 타입 체크

enum내에 지정되어있지 않은 형식의 인풋이 들어오면 컴파일 에러를 리턴합니다.
예시로 제 키덕 프로젝트의 회원 타입부분을 들 수 있는데
type필드를 이넘클래스로 만들고 Keyduck, Google, Kakao 세가지를
인스턴스로 정의한 뒤 입력으로 Naver을 보내면 다음과 같은 에러가 뜹니다.

{
  "success": false,
  "code": 500,
  "msg": "JSON parse error: Cannot deserialize value of type `com.keyduck.member.domain.MemberType` from String \"Naver\": not one of the values accepted for Enum class: [Keyduck, Google, Kakao]; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `com.keyduck.member.domain.MemberType` from String \"Naver\": not one of the values accepted for Enum class: [Keyduck, Google, Kakao]\n at [Source: (PushbackInputStream); line: 4, column: 9] (through reference chain: com.keyduck.member.dto.MemberCreateDto[\"type\"])"
}
  1. 타입 안정성 보장 Enum클래스는 private로 선언되기에
    다른 패키지나 클래스에서 값을 조작하거나 할당할 수 없습니다.
    이런 점에서 값에 대한 안정성을 보장할 수 있습니다.

🎯 Enum class 언제쓰나?

같은 카테고리 안에서 경우의 수가 정해져있고
인스턴스마다 처리할 동작이 다를때 사용하면 좋을 것 같습니다.
다음 예시는 https://jojoldu.tistory.com/137 에서
발췌해와 변형한 예시입니다.

public enum Weather{
    WARM("따뜻한날",temperature -> temperature + 3),
    COLD("추운날",temperature-> temperature - 3)

    private String viewName;
    Function<Integer,Integer> WCTemperature;

    Weather(String viewName, Function<Integer,Integer> WCTemperature){
        this.viewName  = viewName;
        this.WCTemperature = WCTemperature;
    }

    public Integer WCTemperature(Integer weather){
        return WCTemperature.apply(temperature);
        }
}

public class WCTemperatureCalculate{
    @Test
    public void 체감온도계산(){
        //given
        todayTemperature = 30;

        //then
        Integer warmDay = Weather.WARM.WCTemperature(todayTemperature);
        Integer coldDay = Weather.COLD.WCTemperature(todayTemperature);
    }
}

https://jojoldu.tistory.com/137 https://woowabros.github.io/tools/2017/07/10/java-enum-uses.html https://velog.io/@ljinsk3/Concept-Enum


Written by@이주형
平常心

GitHubFacebook