목표
자바의 열거형에 대해 학습하세요.
학습할 것 (필수)
- enum 정의하는 방법
- enum이 제공하는 메소드 (values()와 valueOf())
- java.lang.Enum
- EnumSet
마감일시
2021년 1월 30일 토요일 오후 1시까지.
enum 정의하는 방법
열거형(enum)은 자바5부터 새로 추가되었다.
자바의 열거형은 C언어의 열거형과는 달리 타입까지 관리하기 때문에 보다 논리적인 오류를 줄일 수 있다.
예를 들어 C언어에서는 타입이 달라도 값이 같으면 조건식에서 참(true)였으나, 자바의 타입에 안전한 열거형(typesafe enum)에서는 실제 값이 같아도 타입이 다르면 조건식의 결과가 false가 된다. 이처럼 값뿐만 아니라 타입까지 체크하기 때문에 타입에 안전하다고 하는 것이다.
더 중요한 것은 상수의 값이 바뀌면, 해당 상수를 참조하는 모든 소스를 다시 컴파일해야 되지만 열거형 상수를 사용하면, 기존의 소스를 다시 컴파일하지 않아도 된다.
📌 열거형 정의하는 방법
enum 열거형이름 { 상수1, 상수2, 상수 3... }
✨ 열거형 특징
- 열거형 상수간의 비교에는 ==를 사용할 수 있다.
- <, >와 같은 비교 연산자는 사용할 수 없으며 compareTo()는 사용 가능하다. (compareTo는 왼쪽이 크면 양수, 오른쪽이 크면 음수)
- case문에 열거형 이름은 적지 않고 상수의 이름만 적어야 한다
- 열거된 순서에 따라 0 부터 순서 값을 가짐. 차례대로 증가한다.
- enum 열거형으로 지정된 상수는 대문자 사용한다
- 마지막 끝에 세미콜론(;)을 붙이지 않는다.
1) 하나의 java파일로 만들어서 선언하기
Travel.java
public class Travel {
public int budget;
public String country;
public Vehicle vehicle;
}
Vehicle.java
public enum Vehicle {
PLANE, TRAIN, CAR
}
2) 클래스 안에서 선언하기
3) 클래스 밖에서 선언하기
enum Type {
WALKING, RUNNING, TRACKING, HIKING
}
public class Shoes {
public String name;
public int size;
public Type type;
}
enum이 제공하는 메소드 (values()와 valueOf())
values() : 열거된 모든 원소를 배열에 담아 순서대로 반환
이 메소드는 모든 열거형이 가지고 있는 것이므로 컴파일러가 자동으로 추가해준다
valueOf() : 매개변수로 주어진 String과 열거형에서 일치하는 이름을 갖는 원소를 반환
(주어진 String과 일치하는 원소가 없는 경우 IllegalArgumentException 예외 발생한다)
즉, Enum에서 값을 가져오는 방법은 아래와 같은 방법이 있다.
1. Enum형 객체를 만들어서 가져오기
- Direction.WEST
2. valueOf()메소드를 이용하기
- Direction.valueOf("WEST");
ordinal() : 원소에 열거된 순서를 정수 값으로 반환
모든 열거형의 조상인 java.lang.Enum클래스에 정의된 것으로 열거형 상수가 정의된 순서(0부터 시작)를 정수로 반환한다.
name() : 요소의 이름을 반환한다.
열거형에 멤버 추가하기
Enum클래스에 정의된 ordinal()이 열거형 상수가 정의된 순서를 반환하지만, 되도록이면 이 값을 사용하지 않는 것이 좋다. 왜냐하면 ordinal()은 값의 내부적인 용도로만 사용되기 위한 것이기 때문이다.
그렇다면 열거형 상수에 값을 어떻게 추가할 수 있을까?
열거형 상수의 이름 옆에 원하는 값을 괄호와 함께 적어 주면 된다.
그리고 지정된 값을 지정할 수 있는 인스턴스 변수와 생성자를 새로 추가해 주면 된다.
이때 주의할 점은 열거형 상수 맨 마지막에 ';'도 잊지 말아야 한다.
예제 코드
public enum Rank {
SIXMATCH(6, 2_000_000_000),
FOURPLUSBONUS(5, 30_000_000),
FIVEMATCH(5, 15_000_000),
FOURMATCH(4, 50_000),
THREEMATCH(3, 5_000),
MISS(0, 0);
int countOfMatch;
int winningMoney;
private Rank(int countOfMatch, int winningMoney) {
this.countOfMatch = countOfMatch;
this.winningMoney = winningMoney;
}
public int getCountOfMatch() {
return countOfMatch;
}
public int getWinningMoney() {
return winningMoney;
}
}
열거형 생성자는 외부에서 호출 불가
위의 예제에서 열거형 Rank에 새로운 생성자가 추가되었지만 열거형의 객체를 생성할 수 없다.
왜냐하면 열거형 생성자는 제어자가 묵시적으로 private이기 때문이다.
java.lang.Enum
java.lang.Enum은 모든 열거형의 조상이다.
따라서 모든 열거 타입은 컴파일 시 java.lang.Enum 클래스를 상속받는다
EnumSet
noneOf() : 아무 요소도 추가하지 않는다
allOf() : enum의 모든 요소를 추가한다.
of() : 요소를 직업 추가한다.
public class EnumExample {
enum Fruit {
KIWI ,APPLE, BANANA, MELON
}
public static void main(String[] args) {
Set<Fruit> fruits = new HashSet<>();
fruits.add(Fruit.KIWI);
fruits.add(Fruit.APPLE);
fruits.add(Fruit.BANANA);
fruits.add(Fruit.MELON);
EnumSet<Fruit> enumSetAllOf = EnumSet.allOf(Fruit.class);
EnumSet<Fruit> enumSetNoneOf = EnumSet.noneOf(Fruit.class);
EnumSet<Fruit> enumSetOf = EnumSet.of(Fruit.MELON);
for(Fruit ff : fruits) {
System.out.println(ff);
}
System.out.println(enumSetAllOf);
System.out.println(enumSetNoneOf);
System.out.println(enumSetOf);
}
결과
EnumMap vs HashMap
구분 | EnumMap | HashMap |
기본 | 열거 타입의 키 사용을 위한 특수한 Map | 맵 인터페이스의 구현체 |
Null | null키를 가질 수 없다. | null키와 여러 null값을 가질 수 있다. |
성능 | 모든 연산이 일정한 시간에 실행되므로 HashMap보다 빠르다 | EnumMap보다 느리다. |
내부 구현 | 내부적으로 Array를 사용 | 내부적으로 HashTable을 사용 |
EnumMap 예제
public class EnumMapExample {
public enum Company {
Google, FACEBOOK, MS, APPLE
};
public static void main(String[] args) {
// create enum map
EnumMap map = new EnumMap(Company.class);
map.put(Company.Google, "100");
map.put(Company.FACEBOOK, "200");
map.put(Company.MS, "300");
map.put(Company.APPLE, "400");
EnumMap map2 = new EnumMap(Company.class);
map2.putAll(map);
// print the map
map.forEach((key, value) -> System.out.println(key + " " + value));
System.out.println("-----------");
map2.forEach((key, value) -> System.out.println(key + " " + value));
}
}
결과
Reference
자바의 정석
'Java' 카테고리의 다른 글
스터디 할래 12주차 과제: 애노테이션(피드백, feedback) (0) | 2021.02.14 |
---|---|
스터디할래 11주차 과제: Enum(feedback, 피드백) (0) | 2021.02.13 |
스터디할래 10주차 과제: 멀티쓰레드 프로그래밍 (feeback, 피드백) (0) | 2021.02.12 |
스터디 할래 10주차 과제: 멀티쓰레드 프로그래밍 (0) | 2021.01.28 |
8주자 과제: 인터페이스(피드백) (0) | 2021.01.28 |