열겨형의 전반적인 개념(3)

2022. 5. 17. 13:18·자바/열거형(enums)

5. 열거형의 구조

- 아래와 같이 Direction이라는 열거형을 정의되었다고 가정해보자.

enum Direction{ EAST, SOUTH, WEST, NORTH };

 

( 이 열거형 Direction은 사실 상수 하나하나가 Direction 객체이다. )

 

 

( 그러므로, 위의 문장을 클래스로 정의하면 아래의 코드가 된다. )

class Direction{
   static final Direction EAST = new Direction("EAST");
   static final Direction SOUTH = new Direction("SOUTH");
   static final Direction WEST = new Direction("WEST");
   static final Direction NORTH = new Direction("NORTH");
   
   private String name;
   
   private Direction(String name) {
       this.name = name;
   }
}

 

( 이때, static 상수들의 값은 객체의 주소이고, 이 값은 바뀌지 않는 값이므로 '=='으로 비교가 가능하다. )

 

 

( 또한 모든 열거형은 추상 클래스 Enum의 자손이므로, Enum을 흉내 내어 MyEnum을 작성하면 아래와 같다. )

abstract class MyEnum<T extends MyEnum<T>> implements Comparable<T> {
    static int id = 0;   // 객체에 붙일 일련번호 (0부터 시작)
    
    int ordinal;
    String name = "";
    
    public int ordinal() { return ordinal; }
    
    MyEnum(String name) {
        this.name = name;
        ordinal = id++;
    }
    
    public int compareTo(T t){
        return ordinal - t.ordinal();
    }
}

 

( 만일 클래스를 MyEnum<T>와 같이 선언하였다면, compareTo()를 위와 같이 간단히 작성할 수 없었을 것이다. )

( 그 이유는 타입 T에 ordinal()이 정의되어 있는지 확인할 수 없기 때문이다. )

 

 

 

 

5-1. 열거형의 구조를 이해하기 위한 예제(1)

: 지금까지 배웠던 내용을 다룬 예제이다.

 

abstract class MyEnum<T extends MyEnum<T>> implements Comparable<T>{
	static int id = 0;
		
	int ordinal;
	String name = "";

	public int ordinal() { return ordinal; }
	
	MyEnum(String name) {
		this.name = name;
		ordinal = id++;	
	}

	public int compareTo(T t) {
		return ordinal - t.ordinal();
	}
}

abstract class MyTransportation extends MyEnum {
	static final MyTransportation BUS   = new MyTransportation("BUS", 100) {
		int fare(int distance) { return distance * BASIC_FARE; }
	};
	static final MyTransportation TRAIN = new MyTransportation("TRAIN", 150) {
		int fare(int distance) { return distance * BASIC_FARE; }
	};
	static final MyTransportation SHIP  = new MyTransportation("SHIP", 100) {
		int fare(int distance) { return distance * BASIC_FARE; }
	};
    static final MyTransportation AIRPLANE = 
                                           new MyTransportation("AIRPLANE", 300) {
		int fare(int distance) { return distance * BASIC_FARE; }
	};

	abstract int fare(int distance); // 추상 메서드

	protected final int BASIC_FARE;

	private MyTransportation(String name, int basicFare) {
		super(name);
		BASIC_FARE = basicFare;
	}

	public String name()     { return name; }
	public String toString() { return name; }
}

public class Exercise004 {
	public static void main(String[] args){
		MyTransportation t1 = MyTransportation.BUS;
		MyTransportation t2 = MyTransportation.BUS;
		MyTransportation t3 = MyTransportation.TRAIN;
		MyTransportation t4 = MyTransportation.SHIP;
		MyTransportation t5 = MyTransportation.AIRPLANE;
			
		System.out.printf("t1=%s, %d%n", t1.name(), t1.ordinal());
		System.out.printf("t2=%s, %d%n", t2.name(), t2.ordinal());
		System.out.printf("t3=%s, %d%n", t3.name(), t3.ordinal());
		System.out.printf("t4=%s, %d%n", t4.name(), t4.ordinal());
		System.out.printf("t5=%s, %d%n", t5.name(), t5.ordinal());
		System.out.println("t1==t2 ? "+(t1==t2));
		System.out.println("t1.compareTo(t3)="+ t1.compareTo(t3));
	}
}

저작자표시 (새창열림)

'자바 > 열거형(enums)' 카테고리의 다른 글

열겨형의 전반적인 개념(2)  (0) 2022.05.17
열겨형의 전반적인 개념(1)  (0) 2022.05.17
'자바/열거형(enums)' 카테고리의 다른 글
  • 열겨형의 전반적인 개념(2)
  • 열겨형의 전반적인 개념(1)
백_곰
백_곰
  • 백_곰
    친절한 코딩
    백_곰
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 알고리즘 (with JAVA)
        • 기본 알고리즘
        • 완전 탐색
        • 분할 정복 알고리즘
        • 동적 계획법
        • 탐욕법
        • 코딩 테스트 기출 문제
        • 코드트리 조별과제
      • 백준 (with JAVA)
        • 완전 탐색
        • 분할 정복
        • 그 외
      • 자바
        • 개발 환경 구축하기
        • 팁
        • 기본적인 개념
        • 컬렉션 프레임워크
        • 프로세스와 쓰레드
        • 지네릭스
        • 람다식
        • 스트림
        • 입출력 IO
        • 네트워킹
        • 열거형(enums)
        • java.lang 패키지
        • java.time 패키지
        • 유용한 클래스들
        • 형식화 클래스들
      • 안드로이드 with 자바
        • 응용 문제들
        • 자잘한 문제들
        • 오류 보고서
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      불안정 정렬
      알고스팟
      다형성
      유용한 클래스
      TCP 소켓 프로그래밍
      코드트리
      java.time 패키지
      file
      map()
      역직렬화
      snail
      람다식
      안드로이드 스튜디오
      자바 개념
      serializable
      코딩테스트
      안정 정렬
      선택 정렬
      outputstream
      코딩트리조별과제
      소켓 프로그래밍
      ServerSocket
      제자리 정렬
      문자 기반 스트림
      중간연산
      InputStream
      java.lang패키지
      스트림
      Collections Framework
      Arrays
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    백_곰
    열겨형의 전반적인 개념(3)
    상단으로

    티스토리툴바