안녕하세요•ɞ•!
이번에는 줄여서 enum이라고 부르는 enumeration에 대해서 알아보려고 합니다.
먼저 enum을 한 줄로 얘기하자면 상수*(constants)의 집합으로 이루어진 특수한 Class데이터 타입입니다.
*열거형상수, enmeration constants라고 부르기도 합니다.
Enum의 상수들은 객체이며 따로 명시하지 않아도 public static final* 이기 때문에 instance 없이도 접근이 가능하고 변경이 불가능합니다.
또, 다른 class들과 마찬가지로 인스턴스 변수, 메서드, 생성자도 가질 수 있습니다. 그렇지만 다른 class와는 다르게 instance를 만들지 않고 사용하게 됩니다.
생성시에 앞에 enum이라는 keyword를 붙여주면 됩니다. 한 번 직접 생성해서 사용법을 익혀보겠습니다.
enum 역시 클래스이기 때문에 클래스 생성 방법과 굉장히 유사합니다. 클래스를 만들 때 클래스명 앞에 class를 써주듯이 enum의 이름 앞에 enum 키워드를 적어준 다음 { }을 만들어 그 안에 멤버들을 만들어 주면 됩니다. 상수들은 ','로 구분해주고 모두 대문자로 작성하여야 합니다.
변수를 만들때도 클래스 변수를 선언하듯이 해주면 됩니다. 다만 new keyword로 인스턴스화하지는 않고 static이기 때문에 '.'을 이용해 'enum이름.상수명' 내부의 상수를 참조할 수 있습니다.
Switch문과 같이 사용하기
enum은 switch문과도 잘 사용이 되는데요, 어떻게 사용하는 건지 위의 Days enum을 활용해 살펴보겠습니다.
Enum class가 제공하는 몇가지 methods가 있는데, 각 기능과 사용법에 대해서도 알아보겠습니다.
1. values()
values()를 사용하면 원하는 enum type의 상수들의 array를 return 받을 수 있습니다.
for loop을 이용하면 반환 받은 array 내부의 요소들을 looping 할 수 있습니다.
그러면 Days라는 enum의 상수들이 모두 출력됩니다.
2. valueOf()
valueOf(String str)을 사용하면 주어진 이름을 가진 상수를 반환받을 수 있습니다.
3. ordinal()
ordinal()를 사용하면 특정한 상수의 index를 int type으로 알수 있습니다.
역시나 순서는 0부터 시작하기 때문에 위 예제에서는 3을 반환하였습니다.
인스턴스 변수, 메서드, 생성자를 갖는 enum
위에서 얘기한 인스턴스 변수, 메서드와 생성자를 갖는 enum은 어떤 형태인지 한 번 살펴보겠습니다.
각 요일별로 며칠씩 있는지 나타내기 위한 value를 Days enum의 각 상수마다 설정을 해주었고,
value를 할당받을 numberOfDays라는 int type 변수를 생성했고,
value값을 가져올 수 있는 getter 메서드를 정의했고,
Days의 생성자까지 정의해보았습니다.
Enum 사용의 장점
어떻게 사용하는지는 이제 알겠는데, 왜 enum을 사용하는 것일까요?
크게 두 가지 장점이 있는데, 바로 가독성 개선과 타입 에러 방지가 가능해집니다.
Days enum 대신 int를 넘겨받아 사용하는 switch문으로 바꾸어보았습니다.
int로 사용도 물론 가능하지만 어떤 사람은 0이 Sunday라고 생각할 수도 있고 어떤 사람은 Monday라고 생각하여 이러한 부분에서도 혼란이 생길 수 있습니다. 하지만 위에서처럼 enum을 사용하면 이러한 혼동 없이 사용이 가능하며 숫자가 아닌 단어로 쓰여있기 때문에 더욱 직관적으로 이해할 수 있습니다.
뿐만 아니라 enum type을 변수로 받도록 하면 타입 체크도 더욱 용이해집니다.
int 파라미터인 경우에는 범위에 벗어나는 int가 들어올 가능성이 있습니다. 그렇기 때문에 따로 예외처리를 해주지 않는다면 runtime 에러가 발생하게 됩니다.
반면에 enum 파라미터를 사용하게 되면, 해당 enum에 정의된 상수만 파라미터로 들어올 수 있게 됩니다. 혹시나 정의되지 않은 상수 사용 시도 시에는 compile 에러를 발생시킵니다.
*위에서 enum의 상수들은 모두 static final이라고 했는데, 그러면 그냥 public static final을 쓰지 않고 enum이라는 data type을 만들게 된걸까요? 🤔
사실 JDK1.5 이전에는 public static final로 contants를 만들어서 사용했다고 합니다. 하지만 동일한 이름의 constants 중복, 타입 안정성 문제등의 오류들이 있어 enum을 사용하게 되었다고 합니다. 관련된 내용이 자세히 정리된 글이 있어 링크를 가져왔으니 확인해보시면 좋을 것 같습니다!
https://www.nextree.co.kr/p11686/
여기까지 enum이 무엇인지와 어떻게 사용하는지 알아보았습니다.
수정이나 보충할 사항이 보이면 댓글로 꼭 알려주세요! 감사합니다 ☺️
**nested enum은 static!
참조 자료
http://net-informations.com/java/basics/enum.htm
https://limkydev.tistory.com/66
https://old-developer.tistory.com/105
'Java' 카테고리의 다른 글
Comparable & Comparator 인터페이스 사용하기! (0) | 2022.06.04 |
---|---|
Scanner input 타입 체크하기! (0) | 2022.05.30 |
Stream 사용하기(3) - 최종 연산의 종류와 방법 (0) | 2022.05.21 |
Stream 사용하기(2) - 중간 연산의 종류와 방법 (2) | 2022.05.20 |
Stream 사용하기(1) - stream 생성 (0) | 2022.05.20 |