티스토리 뷰
열거형(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]
'Study > Java' 카테고리의 다른 글
[스터디 12주차] 애노테이션(@, Annotation) (0) | 2022.03.07 |
---|---|
[스터디 10주차] 멀티쓰레드(Multi-thread) 프로그래밍 (0) | 2022.02.20 |
[스터디 9주차] 자바가 제공하는 예외 계층 구조 (0) | 2022.02.13 |
[스터디 9주차] 자바의 예외(Exception)처리 (0) | 2022.02.13 |
[스터디 8주차] 인터페이스(Interface) (0) | 2022.01.30 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 자바
- 프로그래머스강의
- 코드업 기초
- SW
- 운영체제
- 프로그래머스
- 데이터베이스
- 리스트2
- 리스트
- Greedy sort
- 정렬
- 리스트 복사
- 완전탐색
- 파이썬
- 이진탐색
- 보험
- 프로세스 주소공간
- 리스트함축
- It
- https
- 자료구조
- CS
- 자료구조와알고리즘 23강
- 알고리즘
- 연결리스트활용
- 스터디
- CS.
- 이차 리스트
- 네트워크
- CS 스터디
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함