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

2022. 5. 17. 10:14·자바/열거형(enums)

3. 열거형에 멤버 추가하기

- ordinal()은 열거형 상수가 정의된 순서를 반환하지만, 이 값을 열거형 상수의 값으로 사용하지 않는 것이 좋다.

그 이유는 그 값들은 내부적인 용도로만 사용하기 때문이다.

 

 

- 만약 상수의 값들이 불연속적이라면, 그냥 상수 멤버 옆에 '()'을 사용하여 값을 넣어주며 된다.

enum Direction{ EAST(5), SOUTH(1), WEST(-1), NORTH(0) };

 

 

- 또한 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해 주어야 한다.

enum Direction{
    EAST(1), SOUTH(5), WEST(-1), NORTH(10); // 끝에 ; 
    
    private final int value; // 인스턴스 변수 추가
    Direction(int value) { this.value = value; } // 생성자 추가
    
    public int getValue() { return value; }
}

( 인스턴스 변수의 제어자가 final이어야 한다는 제약은 없지만, 열거형 상수의 값을 저장하기 때문에 final로 지정했다. )

 

( 만약 Direction d = new Direction(1); 로 객체생성을 한다면, 에러가 발생하게 된다. )

( 그 이유는 Direction() 생성자는 묵시적으로 private이기 때문이다. )

 

 

- 또한 필요하다면, 아래와 같이 열거형 상수에 여러 값을 지정할 수도 있다.

enum Direction{
    EAST(1, ">"), SOUTH(5, "v"), WEST(-1, "<"), NORTH(10,"^"); // 끝에 ; 
    
    private final int value;
    private final String symbol; 
    
    Direction(int value, String symbol){ //private이 생략됨.
         this.value = value;
         this.symbol = symbol;
    }
    
    public int getValue()     { return value; }
    public String getSymbol() { return symbol; }
}

 

 

 

 

3-1. 열거형에 멤버 추가하기를 이해하기 위한 예제(1)

 

enum Direction2 { 
	EAST(1, ">"), SOUTH(2,"V"), WEST(3, "<"), NORTH(4,"^");

	private static final Direction2[] DIR_ARR = Direction2.values();
	private final int value;
	private final String symbol;

	Direction2(int value, String symbol) { // private Direction2(int value)
		this.value  = value;
		this.symbol = symbol;
	}

	public int getValue()      { return value;  }
	public String getSymbol()  { return symbol; }

	public static Direction2 of(int dir) {
        if (dir < 1 || dir > 4) {
            throw new IllegalArgumentException("Invalid value :" + dir);
        }
        return DIR_ARR[dir - 1];		
	}	

	// 방향을 회전시키는 메서드. num의 값만큼 90도씩 시계방향으로 회전한다.
	public Direction2 rotate(int num) {
		num = num % 4;

		if(num < 0) num +=4; // num이 음수일 때는 시계반대 방향으로 회전 

		return DIR_ARR[(value-1+num) % 4];
	}

	public String toString() {
		return name()+getSymbol();
	}
} // enum Direction2

public class Exercise002 {
	public static void main(String[] args){
		for(Direction2 d : Direction2.values()) 
			System.out.printf("%s=%d%n", d.name(), d.getValue()); 

		Direction2 d1 = Direction2.EAST;
		Direction2 d2 = Direction2.of(1);

		System.out.printf("d1=%s, %d%n", d1.name(), d1.getValue());
		System.out.printf("d2=%s, %d%n", d2.name(), d2.getValue());

		System.out.println(Direction2.EAST.rotate(1));
		System.out.println(Direction2.EAST.rotate(2));
		System.out.println(Direction2.EAST.rotate(-1));
		System.out.println(Direction2.EAST.rotate(-2));
	}
}

 

 

 

 

4. 열거형에 추상 메서드 추가하기

- 예를 들어, 아래의 코드처럼 각 운송 수단에 요금이 정의되어있다고 가정해보자.

enum Transportation { 
    BUS(100), TRAIN(150), SHIP(100), AIRPLANE(300);
    
    private final int BASIC_FARE;
	
    Transportation(int basicFare) {
		BASIC_FARE = basicFare;
    }

    int fare(){ // 운송 요금을 반환
        return BASIC_FARE;
    }
}

 

( 이렇게 작성한다면, 거리에 따라 요금을 계산하는 방식이 없으므로, 이것만으로는 부족하다. )

 

( 이럴 경우, 열거형에 추상 메서드 'fare(int distance)' 를 선언하면 각 열거형 상수가 이 추상 메서드를

아래의 코드와 같이 반드시 구현해야 한다. )

enum Transportation { 
	BUS(100)      { int fare(int distance) { return distance*BASIC_FARE;}},
	TRAIN(150)    { int fare(int distance) { return distance*BASIC_FARE;}},
	SHIP(100)     { int fare(int distance) { return distance*BASIC_FARE;}},
	AIRPLANE(300) { int fare(int distance) { return distance*BASIC_FARE;}};

	protected final int BASIC_FARE; // protected로 해야 각 상수에서 접근가능
	
	Transportation(int basicFare) { // private Transportation(int basicFare) {
		BASIC_FARE = basicFare;
	}

	public int getBasicFare() { return BASIC_FARE; }

	abstract int fare(int distance); // 거리에 따른 요금 계산
}

 

 

 

 

4-1. 열거형에 추상 메서드 추가하기를 이해하기 위한 예제(1)

 

enum Transportation { 
	BUS(100)      { int fare(int distance) { return distance*BASIC_FARE;}},
	TRAIN(150)    { int fare(int distance) { return distance*BASIC_FARE;}},
	SHIP(100)     { int fare(int distance) { return distance*BASIC_FARE;}},
	AIRPLANE(300) { int fare(int distance) { return distance*BASIC_FARE;}};

	protected final int BASIC_FARE; // protected로 해야 각 상수에서 접근가능
	
	Transportation(int basicFare) { // private Transportation(int basicFare) {
		BASIC_FARE = basicFare;
	}

	public int getBasicFare() { return BASIC_FARE; }

	abstract int fare(int distance); // 거리에 따른 요금 계산
}

public class Exercise003 {
	public static void main(String[] args){
		System.out.println("bus fare="     +Transportation.BUS.fare(100));
		System.out.println("train fare="   +Transportation.TRAIN.fare(100));
		System.out.println("ship fare="    +Transportation.SHIP.fare(100));
	        System.out.println("airplane fare="+Transportation.AIRPLANE.fare(100));
	}
}

 

 

 

 

다음장

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

 

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

 

kind-coding.tistory.com

 

저작자표시 (새창열림)

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

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

    • 링크

    • 공지사항

    • 인기 글

    • 태그

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

    • 최근 글

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

    티스토리툴바