1 분 소요

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

댓글남기기