티스토리 뷰

Study/Java

[스터디 11주차] Enum

나갱 2022. 2. 27. 23:57

열거형(enums)란?

  • 열거형 이란 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다. 
  • 원래 자바는 C 언어와 달리 열거형이라는 것이 존재하지 않았으나 JDK1.5부터 새로 추가되었다. 자바의 열거형은 C 언어의 열거형 보다 더 향상된 것으로 열거형이 갖는 값 뿐만 아니라 타입도 관리하기 때문에 보다 논리적인 오류를 줄일 수 있다. 
class Card{
	static final int CLOBER = 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 } // 열거형 Kind 정의
    enum Value { TWO, THREE, FOUR } // 열거형 Value 정의
    
    final Kind kind //; 타입이 int가 아닌 Kind 임을 유의할 것
    final Value value;
}

 

  • 자바의 열거형은 '타입에 안전한 열거형(typesage enum)'이라서 실제 값이 같아도 타입이 다르면 컴파일 에러가 발생한다. 
if(Card.Kind.CLOVER == Card.Value.TWO) // 컴파일 에러. 값은 같지만 타입이 다르다.

열거형(enum)의 정의

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

enum Direction { EAST, SOUTH, WEST, NORTH }

// 사용

class Unit {
    int x, y; // unit 위치
    Direction dir; // 열거형을 인스턴스 변수로 선언
    
    void init() {
    	dir = Direction.EAST; // 유닛의 방향을 EAST로 초기화
    }
}
  • 열거형 상수간의 비교에는 '==' 를 사용할 수 있다. 
  • '<', '>' 와 같은 비교연산자는 사용할 수 없고, compareTo()는 사용이 가능하다. 
  • compareTo()는 두 비교대상이 같으면 0, 왼쪽이 크면 양수, 오른쪽이 크면 음수를 반환한다. 

java.lang.Enum

  • Enum 클래스는 모든 자바 열거형의 기본 조상 클래스이다.
  • Enum 클래스에는 열거형을 다루기 위한 다양한 메소드들이 존재한다. 

열거형(enum)이 제공하는 메소드(values() 와 valueOf())

1) values() 

열거된 모든 원소를 배열에 담아 순서대로 리턴한다. 

public class EnumExample {

	public static void main(String[] args) {
		for (Direction type : Direction.values()) {
			System.out.println(type);
		}
	}

}

enum Direction { EAST, SOUTH, WEST, NORTH }

// 결과
EAST
SOUTH
WEST
NORTH

2) valueOf() 

매개변수로 주어진 String과 열거형에서 일치하는 이름을 갖는 원소를 리턴한다.

public class EnumExample {

	public static void main(String[] args) {
		Direction type1 = Direction.EAST;
		Direction type2 = Direction.valueOf("WEST");
		System.out.println(type1);
		System.out.println(type2);
	}

}

enum Direction { EAST, SOUTH, WEST, NORTH }

// 결과
EAST
WEST

 

EnumSet

  • java.util.EnumSet 은 enum 유형에 사용하기 위한 특수 set 구현체로, 자바 1.5 부터 등장하였다.
  • AbstractSet클래스를 상속하고 Set 인터페이스를 구현한 상태이다. 
  • 열거형 타입으로 저장해 놓은 요소들을 가장 쉽고 빠르게 다룰 수 있게 한다.
  • 요소의 개소가 2^6을 넘지 않을 경우 long 데이터형의 비트필드를 사용한다.
  • 겉으로는 Set을 기반으로 하지만 내부적으로 비트필드를 사용하기 때문에, 메모리 공간도 적게 차지하고 속도도 빠르다.
  • enum 과 static 메서드로 구성되어 있어 안정성을 추구하면서 편리한 사용이 가능하다. 
import java.util.EnumSet;

public class EnumExample {

	public static void main(String[] args) {
		
        // 1. allOf() : 열거형 Day의 모든 요소를 반환
        EnumSet es = EnumSet.allOf(Day.class);
        EnumSet es2 = EnumSet.copyOf(es); // es를 복사
        System.out.println("EnumSet Day: "+ es2);

        // 2. noneOf() : 열거형 Day를 비워라
        es2 = EnumSet.noneOf(Day.class);
        System.out.println("Day를 비워라 => "+ es2);

        // 3. of() : 지정한 요소를 반환
        es = EnumSet.of(Day.FRIDAY, Day.WEDNESDAY);
        System.out.println("금요일과 수요일만 => "+ es);

        // 4. comeplementOf() : 지정된 요소를 제외한 나머지를 반환
        es2 = EnumSet.complementOf(es);
        System.out.println("금요일과 수요일 제외한 나머지 => "+ es2);

        // 5. range() : 지정된 구간 내의 요소만 반환
        es2 = EnumSet.range(Day.TUESDAY, Day.FRIDAY);
        System.out.println("화요일부터 금요일까지 => "+ es2);
	}

}

enum Day{
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY
}

// 결과
EnumSet Day: [SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY]
Day를 비워라 => []
금요일과 수요일만 => [WEDNESDAY, FRIDAY]
금요일과 수요일 제외한 나머지 => [SUNDAY, MONDAY, TUESDAY, THURSDAY, SATURDAY]
화요일부터 금요일까지 => [TUESDAY, WEDNESDAY, THURSDAY, FRIDAY]
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함