제 블로그의 모든 글은 IMHO로 쓴 것입니다. 잘못된 부분이 있으면 덧글을 통해서 소통을 하면 더 좋은 글로 발전이 될 수 있을 것 같습니다. 그렇지만 소통을 할 때 서로의 감정을 존중하는 선에서 해주셨으면 좋겠습니다. 감사합니다:) —
java의 Enum은 class이다. 즉 Enum은 상수처럼 보이는 class
- 서로 관련있는 상수들끼리 모아 상수들을 대표할 수 있는 이름으로 타입을 정의
Enum 이란?
- Enum은 열거형이라고 불리며, 서로 연관된 상수들의 집합이다.
- class이기에 get method, 생성자 등을 쓸 수도 있다.
- 기존에 상수를 정의하는 방법이였던 final static string 과 같이 문자열이나 숫자들을 나타내는 기본자료형의 값을 enum을 이용해서 같은 효과
Enum의 장점
- 인스턴스 생성과 상속을 방지하여 상수값의 타입안정성이 보장
- enum class를 사용해 새로운 상수들의 타입을 정의함으로 정의한 타입이외의 타입을 가진 데이터값을 컴파일시 체크
- 키워드 enum을 사용하기 때문에 구현의 의도가 열거
public static final 을 쓸 때
기존의 상수를 정의하는 방법에 따라 다음과 같이 상수를 정의했습니다.
public static final String MALE = "MALE";
public static final String FEMALE = "FEMALE";
잘못 할당했을 경우
String gender;
gender = 'joos';
- 우리가 기대하는 MALE, FEMALE 의 상수가 아닌 엉뚱한 값이 들어가면 무너지게 된다.
- 원치않는 “joos” 라는 값이 실수로 할당되었을 때 따로 우리가 기대하는 상수값이 할당되었는지 안되었는지에 대한 유효성을 검사하는 로직이 들어가 있지 않다면, 런타임시 문제가 발생
- 이러한 문제가 발생하는 것은 자바 컴파일시 문제점을 발견할 수 없기 때문입니다.
- 자바입장에서는 String이라는 타입에 String 값이 할당되었기 때문에 이상하지 않습니다.
- 만약 상수가 무수히 많고 복잡하다면, 이 잠재적인 문제는 프로그램의 치명적인 오작동을 초래할 수 있습니다.
enum을 쓸 때
String gender;
gender = Gender.MALE;
gender = Gender.FEMAL;
enum class의 인스턴스를 따로 생성하지 않고 바로 MALE, FEMALE 접근했다. 내부적으로 생략되었을 뿐 다음 class와 같다.
class Gender{
public static final Gender MALE = new Gender();
public static final Gender FEMALE = new Gender();
}
static이 생략되었을 뿐 엄연히 enum class 안에 정의된 상수들은 static 변수 효과를 나타낸다.
잘못 할당했을 경우
String gender;
gender = 'joos';
타입은 Gender라는 상수타입인데 String 타입인 boy를 할당하려고하니 컴파일에러가 발생됩니다.
즉 컴파일시 우리가 기대하지 않는 상수값의 할당을 사전에 체크할 수 있는 것입니다.
Enum 쓰는 법
Class 외부에서 선언
public class Developer {
public static void main(String[] args){
for(DevType type : DevType.values()){
System.out.println(type);
}
}
}
enum DevType {
MOBILE, WEB, SERVER
}
- 열거형으로 선언된 순서에 따라 0 부터 인덱스 값을 가지며 순차적으로 증가된다.
열거형 상수를 다른 값과 연결하기
public class Developer {
public String name;
public int career;
public DevType type;
public static void main(String[] args){
for(DevType type : DevType.values()){
System.out.println(type.getName());
}
}
}
enum DevType {
MOBILE("안드로이드"), WEB("스프링"), SERVER("리눅스");
final private String name;
public String getName() {
return name;
}
private DevType(String name){
this.name = name;
}
}
- enum의 생성자가 접근 제어자 private만을 허용
Enum이 맞지 않은 곳
가장 큰 허들은 “변경이 어렵다”
- 변경이 잦은 곳 신경 써야 하는 것 : 얼마나 자주 변경
참고: https://limkydev.tistory.com/50 https://www.opentutorials.org/course/2517/14151 http://woowabros.github.io/tools/2017/07/10/java-enum-uses.html