Enum 타입은 서로 연관된 상수들의 집합입니다.
비슷한 속성을 지닌 문자열이나 숫자를 묶어서 클래스로 정의하는 것 입니다.
기본적으로 인덱스가 0부터 자동으로 지정되고,
이외에도 이름에 의미하는 바를 바로 정의 할 수 있어 코드가 단순해집니다.
Enum을 사용하여 새로운 타입을 정의하게 된다는 점을 활용하여
컴파일시 실행되는 타입 체크를 통해 안정성또한 챙길 수 있습니다.
내부에 메소드를 정의할 수 있으며, 각 인스턴스가 가지는 값을
여러개 설정할 수 있습니다.(이런건 파라미터에 활용하면 좋습니다.)
ex)
//PcType이라는 새로운 타입 정의
public enum PcType{
// 데이터 삽입시 이 세가지중 하나에 해당하는지 체크함
desktop("d",0),
laptop("l",1),
gaming("g",2)
}
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\"])"
}
같은 카테고리 안에서 경우의 수가 정해져있고
인스턴스마다 처리할 동작이 다를때 사용하면 좋을 것 같습니다.
다음 예시는 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