ryanjang-devnotes
Published in

ryanjang-devnotes

[Java] Enum의 역사

Image: https://twitter.com/java?lang=es

What is Enum?

자바 5버전에서 소개된 Enum 타입은 미리 정의된 상수의 집합을 변수로 취급하는 특별한 데이터 타입입니다. 보통 컴파일 시 앞으로 사용할 값들을 예상 가능할 때 주로 사용되는데, 물론 필요할 때에 언제든 이 상수들을 변경하는 것 또한 가능합니다.

History of Enum

Enum이 나오기 전까지, 자바 개발자들은 주석으로 상수를 정의하곤 했습니다.

이 코드에서 월요일은 1, 화요일은 2, 그리고 수요일은 3으로 고정되어야만 합니다. 이 때, 이러한 규칙이 주석으로 전달되는 까닭에 주석과 코드가 분리되거나, 어느 한 쪽이 지워진다면 문제가 될 수도 있죠. 만약 이름만으로 이 값의 의미를 알 수 있다면 우리는 코드를 좀 더 개선할 수 있습니다.

이제 각 숫자들은 우리 쉽게 이해할 수 있는 이름을 가지고 있어서 여기서 사용된 switch 문은 좀더 직관적으로 바뀌었습니다. 또한, 변수들은 final 키워드를 사용해 상수화하였고, static 키워드를 통해 메모리에 오직 한 번만 할당되게 바꾸었습니다. 그런데 여기서 인터페이스를 사용하면 이러한 형태의 코드를 생략할 수 있기 때문에 좀 더 간결한 코드가 만들어집니다.

훨씬 더 좋아보이지 않나요? 그럼에도 불구하고, 한 가지 사소한 문제가 남아있습니다. 바로 이것이 컴파일 타임 안정성을 보장할 수 없다는 문제인데요, 특히 두 가지 서로 다른 상수 집합을 비교할 때 확연히 드러납니다.

if (Day.Monday == Month.January) {
System.out.println("Mondays are bad");
}

만약 자바 컴파일러가 이러한 종류의 소스코드를 발견하지 못해 에러로 표시되지 않는다면, 런타임 시 예상치 못한 에러가 발생할 지도 모릅니다. 이러한 위험을 없애기 위해 똑똑한 자바 개발자는 한 가지 방법을 제시할 것입니다.

“인터페이스들을 클래스로 바꾸고, 각 상수의 데이터 타입을 int 나 다른 것들이 아닌 그 집합이 되는 클래스로 바꿉시다. 그리고 각자 클래스의 인스턴스를 할당하면 각 상수 집합들은 서로 다른 데이터 타입을 가지게 되므로 컴파일 시 에러를 확인할 수 있게 됩니다.”

맞는 말입니다. 분명 컴파일러는 Day.MondayMonth.January 를 비교하는 것이 에러임을 감지하게 될 것입니다. 하지만 이 놀라운 방법에도 한 가지 제약 사항이 존재합니다. switch 문을 더 이상 사용할 수 없다는 것인데요. 자바는 switch 문에서 커스텀 데이터를 지원하지 않기 때문입니다. 기존의 방법들로는 완전히 해결할 수 없는 이러한 근본적인 이유들 때문에 새로운 데이터 타입에 대한 필요성이 생겨났고, 그래서 만들어진 것이 Enum입니다.

Conclusion

모든 것은 각자의 역사를 가집니다. 수 많은 자바 개발자들의 분노와 부서진 키보드들이 오랜 시간동안 쌓여왔고, 그렇게 해서 썬 마이크로시스템즈는 Enum 타입을 만들기로 결심합니다. 다음 포스트에서는 그래서 이것이 어떻게 구성되어있고, 또 어떻게 작동하는 지를 다뤄보겠습니다. 읽어주셔서 감사합니다.

--

--

Backend engineer, Data Analyst, Political Scientist, Lifelong Learner — github : https://github.com/wkdalsgh192

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Minho Jang

Minho Jang

Backend Developer, Writer, and Lifelong Learner