서수 라고 하는것은 순서를 나타내는 수, 쉽게말해서 첫번쨰 두번째 세번째 하는게 서수다.

서수대신 인스턴스 필드를 사용하자? 제목만 봐서는 무슨소리인지 이해가 안가지만 이 챕터가 Enum에 관한 챕터라는것을 떠올린다면 쉽게 연관지을수 있을것이다.

열겨형인 enum의 상수들을 적은 순서대로 0번부터 번호를 매기는것을 서수라고 하는데 enum객체는 항상 ordinal()이라는 메소드가 따라다닌다. 이것은 열거형의 상수가 몇번째로 적힌녀석인지 알기 위한 부분인데 이 값을 직접적으로 사용하지 말라는 것이 이 항목의 요점이다.

순서 라는 enum클레스를 만들었다고 가정해보자.

enum 순서{
	첫번째, 두번째, 세번째, 네번째;
}


라는 형태로 작성할수 있을것이다. 자 이것을 이용해서 프로그래밍을 한다면 첫번째.ordinal()을 호출해서 1이라는 값을 얻기를 원할것이다. 그러나 열겨형의 상수의 순서는 배열과 마찬가지로 0번부터 시작한다.
따라서 항상 사용할때는 ordinal()+1을 해서 써야한다. 이부분은 메소드로 바꾼다면 쉽게 해결이 되긴한다.

또다른 방법은 첫번째 앞에 영번째 라는녀석을 넣어주는것인데 이것또한 사용하지 않을 코드를 집어넣게되므로 비효율적인 코드가 된다.

또다른 경우를 생각해보자. 첫번째 두번째 라는순서에서 갑자기 100번째 라는 것이 필요해졌다.
네번째와 백번째 사이의 순서는 별로 필요하지 않다고 해보자.
그렇다면 백번째를 만들기 위해서는 네번째와 백번째 사이에 95개의 상수를 추가해주어야한다.

이런 문제를 간단하게 해결하는 방법이 있다. 이전 항목에서도 이야기 했지만 enum은 클레스와 거의 동일하다고 했으며 메소드를 만드는 것을 보여주었다. 그러면 필드(맴버변수)를 만들수는 없을까? 가능하다.

enum을 다음과 같은 형식으로 만든다면 간단히 해결이 된다.
enum 순서{
	첫번째(1), 두번째(2), 세번째(3), 네번째(4), 백번째(100);
	private final int order;
	순서(int order){
		this.order=order;
	}
	public int order(){
		return order;
	}
}



열거형에 구현되어있는 ordinal()이라는 메소드는 왠만하면 사용하지 않는 편이 좋다.
http://docs.oracle.com/javase/6/docs/api/java/lang/Enum.html#ordinal()
Java API Document 에서는 ordinal()이라는 메소드는 enum 기반의 자료구조에서만 사용할것을 권하고있다.
Posted by 동적할당
: