데이터 중에는 몇 가지로 한정된 값만을 갖는 경우가 흔히 있다. 예를 들어 계절은 봄, 여름, 가을, 겨울 그리고 요일은 월, 화, 수, 목, 금, 토, 일이라는 한정된 값을 가진다. 이렇게 한정된 값만을 가지는 데이터 타입이 열거 타입(Enumeration type)이다.
열거 타입의 장점
- 문자열과 비교해 IDE의 지원을 받을 수 있다. (자동완성, 오타 검증, 텍스트 리팩토링)
- 허용 가능한 값들을 제한
- 리팩토링 시 변경 범위가 최소화 된다. (내용 추가가 필요해도 Enum 코드 외에 수정할 필요가 없다.)
해당 장점은 모든 언어가 Enum에서 얻을 수 있는 장점이다. 더 나아가 Java Enum의 경우 C/C++과 다르게 Enum이 int 값이 아니라 완전한 기능을 가진 클래스이다. 이를 기반한 장점이 더 있다.
열거 타입 선언
열거 타입 선언을 위해서는 먼저 열거 타입의 이름을 정하고 열거 타입 이름으로 소스 파일(.java)를 생성해야 한다. 관례상 첫 문자를 대문자로 하고 나머지는 소문자로 구성한다. 두 단어 이상으로 구성됬다면 단어의 첫 문자를 대문자로 한다.
Season.java
Week.java
Season.java
소스 파일의 내용은 다음과 같이 열거 타입 선언이 온다. public enum 키워드는 열거 타입을 선언하기 위한 키워드이다.
열거 타입을 선언했다면 이제 열거 상수를 선언하면 된다. 열거 상수는 열거 타입의 값으로 사용되는데, 관례적으로 모두 대문자로 작성한다. 여러 단어일 경우는 LOGIN_SUCCESS
, LOGIN_FAILED
와 같이_
로 연결하는 것이 관례다.
public enum Season {
SPRING,
SUMMER,
AUTUMN,
WINTER
}
열거 타입 변수
열거 타입 선언 후 사용하는 방법에 대해 알아보자. 열거 타입도 하나의 데이터 타입이므로 변수를 선언하고 사용해야한다.
다음은 열거 타입 변수를 선언하는 방법이다.
열거타입 변수;
Season season;
Season weddingSeason;
열거 타입 변수를 선언했다면 다음과 같이 열거 상수를 저장할 수 있다.
열거타입 변수 = 열거타입.열거상수;
Season weddingSeason = Season.AUTUMN;
열거 타입 변수는 다음과 같이 null을 저장할 수 있는데, 열거 타입도 참조 타입이기 때문이다.
Season season = null;
참조 타입 변수는 객체를 참조하는 변수로 알고 있는데 열거 상수는 객체일까? 그렇다. 열거 상수는 열거 객체로 생성된다. 열거 타입 Season의 경우 SPRING에서 WINTER까지 4개의 Season 객체로 생성된다. 그리고 메소드 영역에 생성된 열거 상수가 해당 Season 객체를 각각 참조하게 된다.
그렇다면 다음 코드를 어떻게 이해하면 좋을까?
Season season = Season.SPRING;
열거 타입 변수 season은 스택 영역에 생성된다. season에 저장되는 값은 Season.SPRING 열거 상수가 참조하는 객체의 번지이다. 따라서 열거 상수 Season.SPRING과 season 변수는 서로 같은 Season 객체를 참조하게 된다.
그렇기 때문에 season 변수와 Season.SPRING 상수의 ==
연산 결과는 true가 된다.
season == Season.SPRING // true
열거 객체의 메소드
name()
열거 객체의 문자열 리턴
Season season = Season.SPRING;
String name = season.name(); // "SPRING"
ordinal()
열거 객체가 몇 번째인지를 리턴
public enum Season {
SPRING, // 0
SUMMER, // 1
AUTUMN, // 2
WINTER // 3
}
Season season = Season.AUTUMN;
int ordinal = season.ordinal(); // 2
compareTo()
매개값으로 주어진 열거 객체를 기준으로 전 후로 몇 번째 위치하는지 비교
Season season1 = Season.SPRING; // 0
Season season2 = Season.WINTER; // 3
int result1 = season1.compareTo(season2); // -3
int result2 = season2.compareTo(season1); // 3
valueOf()
매개값으로 주어지는 문자열과 동일한 문자열을 가지는 열거 객체를 리턴한다.
외부로부터 문자열을 받아 열거 객체로 변환할 때 유용하다.
Season season = Season.valueOf("SPRING")
values()
열거 타입의 모든 열거 객체들을 배열로 만들어 리턴
Season[] seasons = Season.values();
for(Season season : seasons) {
System.out.println(season);
}
열거 상수를 다른 값과 연결하기
열거 상수 각각이 열거 객체이므로 열거 객체에 생성자를 사용해서 다음과 같이 열거 상수에 다른 값을 할당할 수 있다.
public enum Type {
// 상수("연결할 문자")
WALKING("워킹화"),
RUNNING("러닝화"),
TRACKING("트래킹화"),
HIKING("등산화");
final private String name;
private Type(Stirng name) { // enum에서 생성자 같은 역할
this.name = name;
}
public String getName() { // 문자를 받아오는 함수
return name;
}
}
public class Shoes {
public static void main(String[] args) {
for(Type type : Type.values()){
System.out.println(type.getName());
}
}
}
결과
워킹화
러닝화
트래킹화
등산화
클래스의 static final 이용해 열거 타입 선언하기
class Type {
static final String WALKING = "워킹화";
static final String RUNNING = "러닝화";
static final String TRACKING = "트래킹화";
static final String HIKING = "등산화";
}
public class Shoes {
public static void main(String[] args) {
String w = Type.WALKING;
System.out.println(w);
}
}
결과
워킹화
참고
[웹사이트] 생활코딩
[웹사이트] 우아한형제들 기술 블로그
[서적] 이것이 자바다
'Basic > Java' 카테고리의 다른 글
[JAVA] Garbage Collection의 기초 (4) | 2016.07.20 |
---|---|
[JAVA] 객체(Object)의 형 변환 (2) | 2016.07.19 |
[JAVA] Static에 대하여 (0) | 2016.07.19 |
[JAVA] JVM의 메모리구조 (0) | 2016.07.19 |
[JAVA] 자바의 변수 (클래스 변수, 인스턴스 변수, 지역 변수) (6) | 2016.07.19 |
[JAVA] 절차지향언어와 객체지향언어 (0) | 2016.07.19 |