Java 언어에서는 사용할 수 있는 값의 종류를 미리 정하는 열거형을 제공하고 있습니다. 예를 들어 성별을 표현한다고 할 때 int 형식이나 Boolean 형식 혹은 문자열을 사용하여 표현할 수도 있을 것입니다. 하지만 이는 가독성이나 신뢰성에서 문제를 유발할 수 있습니다.
예를 들어 int 형식 변수에 1이라는 값이 들어있을 때는 여성, 2는 남성, 0은 결정하지 않은 값으로 사용하기로 정한다고 가정합시다. 그런데 이 때 개발자의 실수에 의해 해당 변수의 값을 3으로 설정한다면 논리적 버그를 만드는 것입니다.
이 때 성별 데이터를 표현하기 위한 열거형을 정의하여 사용하면 논리적 버그를 미연에 방지할 수 있습니다.
[접근자] enum 형식명{
값,…
}
다음은 성별 형식을 열거형 Gender로 정의하여 사용한 예제입니다.
//성별을 열거형으로 정의 public enum Gender { NoGender, Female, Male }
//성별 형식을 열거형 Gender로 정의하여 사용한 예 import java.util.Scanner; public class Program { static Scanner scanner = new Scanner(System.in); public static void main(String[] args){ System.out.println("성별 입력 (1:Female 2:Male:);"); int value = scanner.nextInt(); Gender gender = Gender.NoGender; switch(value){ case 1: gender = Gender.Female; break; case 2: gender = Gender.Male; break; default: System.out.println("입력 오류"); break; } System.out.println(gender.ordinal()); System.out.println(gender.toString()); } }
실행 결과
성별 입력 (1:Female 2:Male:); 2 2 Male
위의 예제에서 열거형의 멤버 ordinal() 메서드를 호출하면 몇 번째 나열한 값인지 확인할 수 있습니다. 주의할 점은 맨 앞에 열거한 표현이 0입니다. 그리고 toString 메서드는 열거형에 표현한 값(NoGender, Female, Male)을 문자열로 반환합니다.
만약 열거형을 정의할 때 나열하는 표현에 개발자가 원하는 값으로 매핑할 수도 있습니다. 이 때는 열거형에 나열하는 표현을 “표현=(매핑 값)”을 지정하며 접근 지정하지 않은 생성자와 매핑할 값을 기억할 멤버를 캡슐화하여 사용할 수 있습니다. 이 때 멤버 필드 값을 접근할 수 있는 접근자 메서드를 제공하면 사용이 편합니다.
[접근자] enum 형식명{
값(매핑 값),…;
[final] int 멤버 필드명;
생성자(int 변수명){
멤버 필드명 = 변수명;
}
[접근자 메서드]
}
다음은 게임에 사용할 상수를 열거형에 정의하는 예제입니다.
//열거형의 표현에 매핑 값을 설정 public enum GameConst { MinHP(0), MaxHP(100),MinIQ(0),MaxIQ(300); final int value; GameConst(int value){ this.value = value; } public int GetValue(){ return value; } }
//열거형의 표현에 매핑 값을 설정 예 public class Program { public static void main(String[] args){ System.out.println("toString() 메서드 호출 결과"); System.out.println(GameConst.MinHP.toString()); System.out.println(GameConst.MaxHP.toString()); System.out.println(GameConst.MinIQ.toString()); System.out.println(GameConst.MaxIQ.toString()); System.out.println("ordinal() 메서드 호출 결과"); System.out.println(GameConst.MinHP.ordinal()); System.out.println(GameConst.MaxHP.ordinal()); System.out.println(GameConst.MinIQ.ordinal()); System.out.println(GameConst.MaxIQ.ordinal()); System.out.println("GetValue() 메서드 호출 결과"); System.out.println(GameConst.MinHP.GetValue()); System.out.println(GameConst.MaxHP.GetValue()); System.out.println(GameConst.MinIQ.GetValue()); System.out.println(GameConst.MaxIQ.GetValue()); } }
실행 결과
toString() 메서드 호출 결과 MinHP MaxHP MinIQ MaxIQ ordinal() 메서드 호출 결과 0 1 2 3 GetValue() 메서드 호출 결과 0 100 0 300