[Java] 6. 1 열거형

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