[자바] Java Enum
References
📌 What’s Enum?
Enum이란 Enumeration의 앞 글자로 열거라는 의미를 갖는다. Enum은 서로 관련된 상수(constant)를 편리하게 선언하기 위해 묶어 놓은 것으로 여러 상수를 정의할 때 사용하면 유용하고, Java는 타입에 안전한 열거형(typesafe enum)을 제공한다.
함수형 인터페이스와 같이 사용하면 아름답게 사용할 수 있다고 한다.
정수 열거 패턴의 단점
Java는 Enum을 지원하기 전에 상수를 한 묶음으로 선언해 사용하는 정수 열거 패턴을 사용했다. 하지만 이 패턴에는 많은 단점이 존재한다.
public static final int APPLE_FUJI = 0;
public static final int APPLE_PIPPIN = 1;
public static final int APPLE_GRANNY_SMITH = 2;
public static final int ORANGE_NAVEL = 0;
public static final int ORANGE_TEMPLE = 1;
public static final int ORANGE_BLOOD = 2;
- 타입 안정성을 보장할 수 없고 표현력이 좋지 않다
- 컴파일러 입장에서 숫자가 같으면 동등하다 판단한다. 따라서 값만 같으면 다른 값이 전달되어도 아무런 문제 없이 컴파일되기 때문에 타입 안정성을 보장할 수 없다
- 정수 열거 패턴을 사용한 프로그램은 깨지기 쉽다
- 문자열로 출력하기 까다롭다
결국 Enum도 객체지향 세계에서 객체를 프로그래밍으로 구현하는 방법 중 하나이다. 스스로 상태를 관리하고 행위를 결정할 수 있는 자율적인 존재가 되야 한다. 단순히 상수 값만 퍼다 나르는 노동자가 아니다
📌 Enum의 장점
1. 인스턴스가 하나씩만 존재함을 보장한다
- 생성자를 제공하지 않아 인스턴스를 생성하거나 확장할 수 없어 인스턴스가 하나씩만 존재함을 보장한다
- Enum은 싱글턴(Singleton)을 일반화한 형태라 말할 수 있다
2. 타입 안정성 제공
public enum Apple { FUJI, PIPPIN, GRANNY_SMITH }
public enum Orance { NAVEL, TEMPLE, BLOOD }
- 다른 타입을 넘기려 하면 컴파일 오류가 발생한다
3. namespace 제공
public enum Apple { FUJI, PIPPIN, GRANNY_SMITH }
public enum Orange { FUJI, PIPPIN, GRANNY_SMITH }
- 열거 타입에는 각자의 namespace가 존재해 이름이 같은 상수도 공존할 수 있다
4. 임의의 메서드나 필드를 추가와 인터페이스 구현 가능
import java.util.function.BiFunction;
public enum Operator {
PLUS("더하기", (a, b) -> (a + b)),
MINUS("빼기", (a, b) -> (a - b)),
MULTIPLY("곱하기", (a, b) -> (a * b)),
DIVIDE("나누기", (a, b) -> (a / b));
private final String description;
private final BiFunction<Double, Double, Double> biFunction;
Operator(String description, BiFunction<Double, Double, Double> biFunction) {
this.description = description;
this.biFunction = biFunction;
}
public double calculate(double n1, double n2) {
return this.biFunction.apply(n1, n2);
}
}
class Main {
public static void main(String[] args) {
double plusResult = Operator.PLUS.calculate(1, 2);
System.out.println("plusResult = " + plusResult);
}
}
이외에도 많은 장점을 갖고있다
- 문자열과 비교해 IDE의 적극적인 지원을 받을 수 있다
- 허용 가능한 값들을 제한할 수 있다
- 리팩토링시 변경 범위가 최소화 된다
댓글남기기