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

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

1. 열거형이란?

- 열겨형은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면

유용하다.

 

- 아래의 코드를 통해 원래의 코드와 enum을 적용한 코드의 비교를 통해 이해하자.

 

< 적용 전 >

class Card{
   static final int CLOVER = 0;
   static final int HEART = 1;
   static final int DIAMOND = 2;
   static final int SPADE = 3;
   
   static final int TWO = 0;
   static final int THREE = 1;
   static final int FOUR = 2;
   
   final int kind;
   final int num;
}

 

< 적용 후 >

class CARD{
    enum Kind { CLOVER, HEART, DIAMOND, SPADE }
    enum Value { TWO, THREE, FOUR }
    
    final Kind kind;
    // 타입이 int가 아닌 Kind이다.
    
    final Value value;
    // 타입이 int가 아닌 Value이다.
}

 

 

( 자바의 열거형은 타입에 안전한 열거형이라서 c언어와 달리 아무리 값이 같더라도 아래의 코드처럼 타입이

다르다면 false를 출력한다. )

if(Card.CLOVER == CARD.TWO)
// true지만 false이어야 의미상 맞음.

if(Card.KIND.CLOVER == CARD.Value.TWO)
// 컴파일 에러. 값은 같지만 타입은 다름.

 

( 만약 상수의 값을 바꾼다면, 기존의 코드를 전부 컴파일하지만, 열거형 상수를 쓴다면 기존의 코드를 컴파일하지

않아도 된다. )

 

 

 

 

2. 열거형의 정의와 사용

- 열거형의 정의하는 방법은 위에서도 보았듯이 아래의 코드처럼 수행하면 된다.

enum 열거형이름 { 상수명1, 상수명2, ... };

 

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

 

 

- 또한 정의된 상수를 호출하는 방법은 '열거형이름.상수명'으로 호출하면 된다.

class Unit{
    int x, y;
    // 유닛의 위치
    
    Direction dir;
    // 열거형을 인스턴스 변수로 선언
    
    void init(){
        dir = Direction.EAST;
        // 유닛의 방향을 EAST로 초기화
    }
}

 

 

- 열거형 상수간의 비교도 가능한데, equals()가 아닌 '=='을 사용한다는 점에서 빠른 성능을 제공한다.

 

- 그러나, '<', '>' 연산은 사용할 수 없고, compareTo()는 사용가능하다.

if(dir = Direction.EAST){
   x++;
} else if (dir > Direction.WEST) { // 에러 발생
   ...
} else if (dir.compareTo(Direction.WEST) > 0) { // 비교 가능
   ...
}

( compareTo()는 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수이다. )

 

 

- 비교뿐만 아니라 switch 문의 조건식에도 사용이 가능하다.

void move(){
    switch(dir){
        case EAST:   x++;   // Direction.East라고 쓰면 안됨.
             break;
        case WEST:   x--; 
             break;
        case SOUTH:  y++;  
             break;
        case NORTH:  y--;   
             break;
    }
}

 

 

 

- 열거형 Direction에 정의된 모든 상수를 출력할려면 아래의 코드처럼 values()를 사용하면 된다.

Direction[] dArr = Direction.values();

for(Direction d : dArr)
    System.out.printf("%s = %d\n", d.name(), d.ordinal());

( ordinal()은 열거형 상수가 정의된 순서(0부터)를 반환하는 메서드이다. )

 

 

 

 

2-1. 열거형의 정의와 사용을 이해하기 위한 예제(1)

 

enum Direction { EAST, SOUTH, WEST, NORTH }

public class Exercise001 {	
	public static void main(String[] args){
		Direction d1 = Direction.EAST;
		Direction d2 = Direction.valueOf("WEST");
		Direction d3 = Enum.valueOf(Direction.class, "EAST");

		System.out.println("d1="+d1);
		System.out.println("d2="+d2);
		System.out.println("d3="+d3);

		System.out.println("d1==d2 ? "+ (d1==d2));
		System.out.println("d1==d3 ? "+ (d1==d3));
		System.out.println("d1.equals(d3) ? "+ d1.equals(d3));
//		System.out.println("d2 > d3 ? "+ (d1 > d3)); // 에러
		System.out.println("d1.compareTo(d3) ? "+ (d1.compareTo(d3)));
		System.out.println("d1.compareTo(d2) ? "+ (d1.compareTo(d2)));

		switch(d1) {
			case EAST: // Direction.EAST라고 쓸 수 없다.
				System.out.println("The direction is EAST."); 
				break;
			case SOUTH:
				System.out.println("The direction is SOUTH."); 
				break;
			case WEST:
				System.out.println("The direction is WEST."); 
				break;
			case NORTH:
				System.out.println("The direction is NORTH."); 
				break;
			default:
				System.out.println("Invalid direction."); 
//				break;
		}

		Direction[] dArr = Direction.values();

		for(Direction d : dArr)  // for(Direction d : Direction.values()) 
			System.out.printf("%s=%d%n", d.name(), d.ordinal()); 
	}
}

 

 

 

 

다음장

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

 

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

 

kind-coding.tistory.com

 

저작자표시 (새창열림)

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

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

    • 링크

    • 공지사항

    • 인기 글

    • 태그

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

    • 최근 글

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

    티스토리툴바