11장. Enum
목표
자바의 Enum에 대해 학습하세요. issue
학습할 것
열거형 (Enum)이란?
- 서로 관련된 상수를 편리하게 선언하기 위한 것.
- 자바의 열거형은
타입에 안전한 열거형
이라서 실제 값이 같더라고 타입이 다르면 다르다는 결과를 얻는다.
이전에 상수를 처리하던 방법
public class Number {
static final int ONE = 1;
static final int TWO = 2;
}
public class Number2 {
static final int ONE = 1;
static final int TWO = 2;
}
main {
if (Number.ONE == Number2.TWO) {
// 이런 식이 가능
}
}
위에 내용은 사실 전혀 같지 않다는 것을 알 수 있지만 타입이 같기 때문에 비교를 한다.
상수를 이용하는데 똑같은 타입을 사용하는데 있어서 실수가 존재할 수 있다. -> 전혀 다른 상수의 집합을 표현하고 있다고 하더라도 전혀 컴파일 단계에서 걸러내지 못함.
enum 정의하는 방법
enum 열거형이름 {상수명1 , 상수명2, 상수명3, ...}
---
enum Fruit {
APPLE(5000), BERRY(1000), ...
Fruit(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
---
main() {
Fruit fruit = Fruit.APPLE;
sout(fruit.getPrice);
}
---
5000
위와 같이 정의해서 사용할 수 있다.
우리는 상수만 정의해서 사용하는 것이 아닌 상수에 대한 추가적인 정보까지 작성해서 묶음으로 관리할 수 있다.
위에 예제를 보게 되면 과일과 관련해서 가격까지 넣을 수 있다.
Enum type별 처리 방법
switch문을 활용한 방법
enum Fruit {
APPLE(5000), BERRY(1000), ...
Fruit(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
}
---
main() {
Fruit fruit = Fruit.APPLE;
switch(fruit) {
case Fruit.APPLE:
sout("이것은 애플");
case Fruit.BERRY:
sout("이것은 베리");
}
}
---
이것은 애플
메소드를 추가하는 방법
enum Fruit {
APPLE(5000) {
@Override
void print() {
sout("이것은 애플");
}
},
BERRY(1000) {
@Override
void print() {
sout("이것은 베리");
}
},
...
Fruit(int price) {
this.price = price;
}
public int getPrice() {
return price;
}
abstract void print();
}
---
main() {
Fruit fruit = Fruit.APPLE;
fruit.print();
}
---
이것은 애플
enum이 제공하는 메소드 (values()와 valueOf())
values()
enum Fruit {
APPLE, BERRY, ..
}
---
main() {
for (Fruit f : Fruit.values()) {
sout(f.name());
}
}
---
APPLE
BERRY
- Enum이 가지고 있는 모든 벨류를 보여준다.
valueOf()
enum Fruit {
APPLE, BERRY, ..
}
---
main() {
Fruit fruit = Fruit.valueOf("APPLE");
sout(fruit);
}
---
APPLE
- 상수 값을 이용해서 Enum 인스턴스를 만드는 방법이다.
- 여기서 중요한 것은 값은 것이 있어야지 된다는 것이다.
- 소문자를 받고 싶다고 조금 커스텀해서 적용할 수도 있다.
enum Fruit {
APPLE, BERRY, ..
public Fruit toValue(String fruit) {
if (fruit == null) {
return null;
}
return valueOf(fruit.toUpperCase());
}
}
- java.lang.Enum
Enum 클래스를 만들게 되면 기본적으로 해당
java.lang.Enum
를 상속받게 된다.
그렇기 때문에 우리가 현재 기본적으로 사용하고 있는 values()
, name()
, valueOf()
와 같은 것을 사용하고 있는 것이다.
대부분의 메소드가 final로 정의되어 있기 때문에 오버라이딩은 불가능하다.
EnumSet
enum Fruit{
APPLE
}
---
main(String[] args){
EnumSet<Fruit> enumSet = EnumSet.allOf(Fruit.class);
}
- allOf: 모든 Enum 값을 넣음.
- noneOf: 특정 것들을 제거한다.
- of: 원하는 것을 선택해서 넣음
- range: 범위에 있는 값을 모두 넣음
Ref
라이브 방송
책 추천
방송 중
베스트 글 모음
https://wisdom-and-record.tistory.com/52
https://b-programmer.tistory.com/262
https://www.notion.so/Enum-6ffa87530c424d8ab7a1b585bfb26fa2
https://parkadd.tistory.com/50
https://velog.io/@kwj1270/Enum
https://velog.io/@ljs0429777/11%EC%A3%BC%EC%B0%A8-%EA%B3%BC%EC%A0%9C-Enum
https://yadon079.github.io/2021/java%20study%20halle/week-11
https://www.notion.so/11-Enum-ccbba2bf2b7746ed8a12d2dee09aa833
https://blog.naver.com/hsm622/222218251749
Leave a comment