단순한 열거형
값을 갖는 열거형
2개 이상 값을 갖는 열거형
메서드를 갖는 열거형
Enum을 사용하는 이유?
int 자료형으로 조건 비교하여 사용할 때 발생할 수 있는 다양한 실수를 방지하는 효과를 가지기 위해서이다.
사례1. int 자료형에 값 넣어서 비교할 경우
발생 가능할 문제점(실수) :
색의 조건 상수와, 대중교통의 조건 상수처럼 서로 다른 속성의 상수를 비교하는 생각지도 못한 실수가 발생할 수 있다.
-> 하지만 Compile, runtime 과정에서 에러 발생하지 않는다. 그래서 잘못된 방법으로 사용한 걸 알아차리기 힘들다.
-> BIKE와 RED는 서로 다른 속성의 조건 상수 값 이지만, 초기화 된 값은 1로 같아서 동등 비교 연산 시 True가 된다.
void enumTest(){
// enum을 사용하는 이유는 결과적으로 string 변수로 조건을 비교하여 사용할 때 일어날 수 있는 다양한 실수를 방지하는 효과를 가지기 위해서이다
// 색 집합
final int RED = 1;
final int BLUE = 2;
final int GREEN = 3;
//대중교통 집합
final int BIKE = 1;
final int SUBWAY = 2;
final int BUS = 3;
int inputColor = RED;
System.out.println(inputColor == RED ? "RED" : "Not Red");
// 물리적으로 값 비교 결과가 True로 나오는 것은 맞으나, 설계(생성) 의도에서 생각했을 때 둘의 속성의 의미는 다르므로 논리적으로 True가 나오면 안 된다.
System.out.println(inputColor == BIKE ? "Red" : "Not Red");
}
사례 1에서 발생한 문제 : int 자료형으로 비교하면 의도치 않은 실수가(휴먼 에러) 발생 할 수 있다.
개선방안 : 각 속성값을 나타내는 클래스를 만들고, 속성 상수에 int 대신 instance 주소값을 넣어서 비교에 활용한다.
단점 : 각 속성값들의 클래스를 사용자들이 직접 만들어야 한다.
void enumTest2(){
// 숫자 값으로 비교하면 위의 사례에서 나왔던 논리적인 에러가 발생할 수 있으니, 각 속성의 값을 나타내는 class를 만들고
// 각 속성 변수에 서로다른 인스턴스의 주소값을 넣어서 비교하는 것에 활용한다.
// but 문제는 객체를 비교하기 위해서 class를 직접 만들어야 한다는 번거로움이 있다.
final Color RED = Color.RED;
final Color BLUE = Color.BLUE;
final Color ORANGE = Color.ORANGE;
final Transportation BIKE = Transportation.BIKE;
final Transportation BUS = Transportation.BUS;
final Transportation SUBWAY = Transportation.SUBWAY;
Color inputColor = RED;
System.out.println(inputColor == RED ? "RED" : "Not Red");
System.out.println(inputColor.equals(Color.RED) ? "RED" : "Not Red");
// class, instance 값이 다르므로 Compile 에러가 발생한다.
//System.out.println(inputColor == SMALL ? "Red" : "Not Red");
System.out.println(inputColor.equals(Transportation.BIKE) ? "Red" : "Not Red");
}
class Color{
public final static Color RED = new Color();
public final static Color BLUE = new Color();
public final static Color ORANGE = new Color();
}
class Transportation{
public final static Transportation BIKE = new Transportation();
public final static Transportation BUS = new Transportation();
public final static Transportation SUBWAY = new Transportation();
}
# ==와 equals()의 차이점 https://go-coding.tistory.com/35
사례 2에서 발생한 문제 : 각 속성값들의 클래스를 사용자들이 직접 만들어야 한다.
개선 : Enum 사용 (사례1, 사례2 문제 해결 위해 만들어진 것)
장점 : 간결하게 사용이 가능하다.
Enum 클래스에서 정의하지 않은 값을 Enum 상수에 초기화 하려고 하면 컴파일 에러 발생 (휴먼 에러 방지)
void enumTest3(){
Color1 RED = Color1.RED;
Color1 BLUE = Color1.BLUE;
Color1 ORANGE = Color1.ORANGE;
//Error
//Color1 ORANGE = Color1.asda;
Transportation1 BIKE = Transportation1.BIKE;
Transportation1 BUS = Transportation1.BUS;
Transportation1 SUBWAY = Transportation1.SUBWAY;
//Error
//Transportation1 SUBWAY = Transportation1.AIRPLANE;
Color1 input = Color1.RED;
System.out.println(input.equals(Color1.RED) ? "Red" : "Not Red");
System.out.println(input.equals(Transportation1.BIKE) ? "Red" : "Not Red");
}
// class 생성 방식과 비교하면 instance 생성 부분이 간략해졌음
enum Color1{
RED, BLUE, ORANGE
}
enum Transportation1{
BIKE, BUS, SUBWAY
}
'두고두고 볼 것' 카테고리의 다른 글
트렌젝션 (0) | 2022.07.02 |
---|---|
JPA 변경 감지와 병합(merge) (0) | 2022.04.03 |
Java Collections, Iterator, Enumeration 인터페이스 간략 정리 (0) | 2022.03.31 |
Computer Science 관련 키워드 별 주요 내용 정리 (0) | 2022.03.05 |
DB (about 관계형 데이터 모델링, 정규화, 트랜잭션) (0) | 2020.10.05 |
댓글