<aside> ⭐
※상수만 들어갈 수 있다.
</aside>
<aside> 💡
열거형을 왜 써야하나
⇒ enum은 단순 상수 집합이 아니라 필드, 생성자,메서드도 가질 수 있기 때문에 상태값에 따라 동작을 다르게 만들 수 있다.
</aside>
Item .java(enum 클래스)
public enum Item {
//public static final Item START = new Item();
//객체를 만들기 위한 생성자를 호출하는 것이라고 생각한다.
//각각의 상수들은 Item클래스로 만든 객체라고 생각하면 된다.
START("시작" , ">"),//Item START = new Item("시작",">");
STOP("정지","||"),
EXIT("종료","X");
//각각의 상수에 필드 추가하기
//필드의 선언
String itemStr;
String symbol;
//생성자의 선언
//열거형의 생성자는 기본적으로 private
private Item(String itemStr ,String symbol){
this.itemStr = itemStr;
this.symbol = symbol;
}
//메서드 선언
public String getItemStr() {
return itemStr;
}
public String getSymbol() {
return symbol;
}
}
EnumMain .java
import java.util.Arrays;
public class EnumMain {
public static void main(String[] args) {
//열거형은 직접 객체를 생성할 수 없다.
//enum의 생성자는 암묵적으로 private으로 만들어져있다(접근 불가)
//JVM이 각 상수를 단 한번만 생성하고 공유한다.
Item i1 = Item.START;
System.out.println(i1);//START
//모든 열거형이 상속하는 Enum클래스에 toString()메서드에서
//이름을 반환하기 때문에 이름이 출력된다
Item[] items = Item.values();
System.out.println(Arrays.toString(items));
//열거형 상수에 들어있는 순서 보기
for(Item item : items) {
System.out.println("name = "+item.name()+", ordinal = "+item.ordinal());
}
Item i2 = Item.valueOf("START");
System.out.println(i2);
System.out.println(i1==i2);
Item i3 = Item.EXIT;
//열거형끼리는 == 이외의 비교연산자는 사용할 수 없다
//compareTo()는 사용이 가능하다.
//System.out.println(i1>i3); - error
System.out.println(i1.compareTo(i3));//-2
//i1의 ordinal = 0 / i3의 ordinal=2 .. -> 0-2 = -2
//a.compareTo(b)
//a가 b보다 앞서면 -> 음수
//a와 b가 같으면 -> 0
//a가 b보다 뒤면 -> 양수
//열거형과 switch문
//열거형 상수를 switch의 case에 쓸 수 있다.
switch (i1) {
case START: //Item.START앞의 타입은 생략해도된다.
System.out.println("시작");
break;
case STOP:
System.out.println("정지");
break;
case EXIT:
System.out.println("종료");
break;
}
for(Item item: items) {
System.out.println(item.getItemStr()+" "+item.getSymbol());
}
//왜 enum을 써야할까
//1. 코드의 가독성을 증가
//int status = 1; //무슨 상태를 의미하는거지?
//누가 봐도 성공했다는 상태임
//Status status = Status.SCUCCES;
//2. 타입 안정성 보장
//정해진 값 이외의 다른 값을 넣을 수 없다.
//열거형을 안쓸때
//int color = 99999;//문법적으로 틀린게 아니라 에러는 안남
//단 설정한 색의 범주가 아님
//열겨형일때
//Color color = Color.RED;
//color 타입만 들어올 수 있음
}
}
//추상메서드를 가진다고 해서 추상클래스가 되는 것은 아니다
//enum자체는 추상메서드를 정의할 수 가 있고, 상수들이
//그 메서드를 구형을 해야한다.
public enum Transportaion {
BUS(100) {
@Override
int totalFare(int distance) {
return distance*fare;
}
},
TRAIN(150) {
@Override
int totalFare(int distance) {
return distance*fare;
}
},
SHIP(200) {
@Override
int totalFare(int distance) {
return distance*fare;
}
},
AIRPLANE(250) {
@Override
int totalFare(int distance) {
return distance*fare;
}
};
int fare;
private Transportaion (int fare){
this.fare = fare;
}
//추상메서드를 정의하면
//직접 구현을 해야한다면 오류가 난다
abstract int totalFare(int distance);
}
public class TransportMain {
public static void main(String[] args) {
//각 운송수단별 100을 갔을 때 금액
//name : xxx, 100km - fare : xxx
//name : xxx, 100km - fare : xxx
//name : xxx, 100km - fare : xxx
//name : xxx, 100km - fare : xxx
Transportaion[] trans = Transportaion.values();
for(Transportaion t : trans ) {
System.out.println("name : "+ t.name() + ", 100km - fare : "+t.totalFare(100));
}
}
}
1.
요일 열고형 만들기
Weekday라는 열거형을 정의하고,
요일이름을 상수로 넣는다.
main메서드에서 오늘 요일이 SUNDAY면 "쉬는날입니다"출력
그 외에는 "출근하는 날입니다"출력
2.
Operation열거형을 정의하고
추상메서드 apply(int x, iny)를 갖고 있다
PLUS,MINUS,MULTI,DIV상수를 가지고 있다
main 메서드에서 모든 연산을 수행하여 출력하세요
3.
OrderStatus 열거형을 만들고
ORDERD,SHIPPED,DELIVERED 상수를 정의한다
온라인 쇼핑몰의 주문상태를 관리하는 시스템
상태에 따라 다음 상태로 바뀌면 됨
각 상태에서 next()메서드를 호출하면 다음 상태로 전환되도록 구현하기
OREDERED -> SHIPPED
SHIPPED-> DELIVERED
DELIVERED -> "완료 상태이며 상태 전환 불가"
=> 상태가 바뀔때마다 현재상태 출력