반응형
목차
1. Enum이란?
2. 사용 방법
3. 주요 메소드
4. Singleton과 Enum
1. Enum이란? 🤔
- enumerance type = 열거형
- JDK 1.5부터 생겨난 기능으로 열거체를 정의할 수 있는 클래스
- 비교 시 실제 값 뿐만 아니라 타입까지 체크 가능
- 상수값이 재정의 되어도 다시 컴파일 할 필요 X
2. 사용 방법 🤩
enum Color {
RED, YELLOW, GREEN, BLUE
}
기본적으로 위와 같이 정의하고 Color.RED 와 같이 사용한다.
아래와 같이 특정 값을 저장할 수도 있다.
enum Color {
RED(3), YELLOW(21), GREEN(5), BLUE(1);
private final int value;
Color(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
3. 주요 메소드 😍
메소드 | 설명 |
static E values() | 해당 열거체의 모든 상수를 저장한 배열을 생성하여 반환 |
static E valueOf(String name) | 전달된 문자열과 일치하는 해당 열거체의 상수를 반환함 |
protected void finalize() | 해당 Enum 클래스가 final 메소드를 가질 수 없게 함 |
String name() | 해당 열거체 상수의 이름 반환 |
int ordinal() | 해당 열거체 상수가 열거체 정의에서 정의된 순서 반환 |
boolean equals(Object other) | 객체가 해당 열거체 상수와 동일하면 true |
(+)
name() 메소드가 존재하지만 모든 프로그래머들은 toString()이라는 메소드가 더 익숙할 것이다.
Java에서도 name()보다는 toString()이라는 메소드를 사용하기를 권장하고 있다.
4. Singleton과 Enum 😵
Singleton이란 한 JVM에 하나의 인스턴스만 존재하는 클래스이다.
멀티 스레드에 의해 클래스의 같은 인스턴스가 재사용된다.
enum이 Singleton이 보장되는 이유는 크게 3가지가 있다.
1. clone 미지원
enum의 clone()이라는 메소드를 살펴보면 아래와 같다.
/* Throws CloneNotSupportedException.
* This guarantees that enums are never cloned, which is necessary to preserve their "singleton" status.
* Returns: (never returns)
*/
protected final Object clone() throws CloneNotSupportedException {
throw new CloneNotSupportedException();
}
사람들이 일반적으로 clone() 메소드를 이용할 때, 값만 같고 서로 다른 객체가 반환되기를 기대한다.
enum은 각 인스턴스의 값이 하나씩만 존재해야 하므로 clone을 지원하지 않는다.
2. 역직렬화로 인한 중복 인스턴스 생성 방지
enum은 기본적으로 `serializable`가 가능하다.
`serializable interface`를 구현할 필요 없으므로 역직렬화 시 새로운 객체가 생성될 걱정을 안해도 된다.
3. Reflection을 이용한 enum의 인스턴스화를 금지
Enum의 생성자는 Sole Constructor이다.
컴파일러에서 사용하고 사용자가 직접 호출할 수는 없다.
따라서 enum -> getConstructor -> newInstance로 사용하는 객체 생성 흐름이 적용되지 않는다.
(Reflection은 new와 동일하게 클래스 내 생성자로 인스턴스를 사용하기 때문에...)
참고
반응형
'Develop > Java' 카테고리의 다른 글
[JPA] Entity 매핑 (0) | 2022.01.10 |
---|---|
[JPA] JPA란? (0) | 2022.01.03 |
[Java] org.opentest4j.AssertionFailedError: Expected ... to be thrown, but nothing was thrown. 에러 (0) | 2021.12.07 |
[Mockito] Mockito란? (0) | 2021.12.02 |
[Java] java.lang.UnsupportedOperationException (1) | 2021.11.21 |