[자바] 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의 적극적인 지원을 받을 수 있다
 - 허용 가능한 값들을 제한할 수 있다
 - 리팩토링시 변경 범위가 최소화 된다
 
댓글남기기