상수를 처리할 때 의미까지 부여한 것 : 열거형
==> 서로 관련있는 상수들의 집합을 나타낸다.
==> 클래스처럼 보이게 하는 상수
==> 열거형은 class처럼 독립된 java파일에 만들 수 있고, 하나의 java파일에 클래스와 같이 만들 수 있고,
class 안에 내부 클래스처럼 만들 수 있다.
public class EnumTest {
public enum Color { RED, GREEN, BLUE }
public enum Count { ONE, TWO, THREE }
public enum Season{
봄("3월부터 5월까지"), // 상수명(값들...) 형식의 선언
여름("6월부터 8월까지"),
가을("9월부터 11월까지"),
겨울("12월부터 2월까지");
// 값이 저장될 변수 선언
private String span;
// 생성자
Season(String months){ //private Season(String months){}와 같다.
span = months; // 변수에 값을 초기화하는 작업을 수행한다.
}
//getter 생성
public String getSpan() {
return span;
}
}
public static void main(String[] args) {
/*
System.out.println("Red : " + ConstTest.RED);
System.out.println("Three : " + ConstTest.THREE);
if(ConstTest.RED == ConstTest.TWO) { //논리적으로 설명하기 어려움(색깔과 숫자를 비교)
- 에러발생 여지가 있는 코딩
System.out.println("....");
}else {
System.out.println("####");
}
*/
Color mycol = Color.valueOf("GREEN");
//열거형 변수 mycol에 GREEN 값을 저장, Color.GREEN 와 같다.
Count mycnt = Count.ONE; // Count.valueOf("ONE")와 같다.
System.out.println("mycol : " + mycol.name());
System.out.println("mycnt : " + mycnt.name());
System.out.println("mycol ordinal : " + mycol.ordinal());
System.out.println("mycnt ordinal : " + mycnt.ordinal());
//서로 다른 열거형끼리의 비교는 불가능하다.
//if(Color.RED == Count.TWO) { //에러발생
//System.out.println("...");
}
if(mycol == Color.BLUE) {
System.out.println("같다.");
}else {
System.out.println("같지 않다.");
}
System.out.println("--------------------------------------");
Season ss = Season.valueOf("봄");
System.out.println("name : " + ss.name());
System.out.println("ordinal : " + ss.ordinal());
System.out.println("span : " + ss.getSpan());
System.out.println();
//열거형명.values() ==> 모든 상수들을 가져와 배열로 반환한다.
for(Season time : Season.values()){ //변수.name == 변수
System.out.println(time.name() + " == " + time
+ " ==> " + time.getSpan());
}
System.out.println();
for(Color col : Color.values()) {
System.out.println(col + " ==> " + col.ordinal());
}
}
}
과제 - 호텔관리
public class Hotel {
Scanner sc;
//전체객실관리 Map
HashMap<Integer, Room> hotelMap;
//생성자 - 객실 201-209 / 301-309 / 401-409
public Hotel() {
sc = new Scanner(System.in);
hotelMap = new HashMap<Integer, Room>();
//객실초기화 (Map에 객실저장) - 방번호, 방종류 초기화
for(int i = 2; i <= 4; i++) {
int num = 100 * i + 1;
for(int j = 1; j <= 9; j++) {
if(i == 2) {
hotelMap.put(num, new Room(num,"싱글룸","-"));
num++;
}
if(i == 3) {
hotelMap.put(num, new Room(num,"더블룸","-"));
num++;
}
if(i == 4) {
hotelMap.put(num, new Room(num,"스위트룸","-"));
num++;
}
}
}
//선생님 답 - 객실 초기화
/*
for(int i = 2; i <= 4; i++){
String roomType = null;
switch(i){
case 2: roomType = "싱글룸"; break;
case 3: roomType = "더블룸"; break;
case 4: roomType = "스위트룸"; break;
}
for(int j = 1; j <= 9; j++){
int roomNum = i * 100 + j;
Room r = new Room(roomNum, roomType); // Room객체 생성
hotelMap.put(roomNum
}
}
*/
}
public static void main(String[] args) {
Hotel hotel = new Hotel();
hotel.start();
//알아내기
// Set hotelSet = hotel.hotelMap.keySet();
// for(Object key : hotelSet) {
// System.out.println(key + " " );
// System.out.println(hotel.hotelMap.get(key).getRoomType());
// System.out.println(hotel.hotelMap.get(key).getGuestName());
//
// }
}
//실행하는 메서드
public void start() {
System.out.println("******************************************");
System.out.println(" 호텔문을 열었습니다. 어서오십시요.");
System.out.println("******************************************");
while(true) {
int input = displayMenu();
switch(input) {
case 1: checkIn(); break;
case 2: checkOut(); break;
case 3: roomCheck(); break;
case 4:
System.out.println("******************************************");
System.out.println(" 호텔문을 닫았습니다.");
System.out.println("******************************************");
return;
}
}
}
private int displayMenu() {
System.out.println("------------------------------------------------");
System.out.println(" 어떤 업무를 하시겠습니까? ");
System.out.println("1. 체크인 2. 체크아웃 3. 객실상태 4. 업무종료");
System.out.println("------------------------------------------------");
System.out.print("선택 >> ");
return sc.nextInt();
}
private void checkIn() {
sc.nextLine();
System.out.println("----------------------------------------------");
System.out.println(" 체크인 작업");
System.out.println("----------------------------------------------");
System.out.println("* 201~209 : 싱글룸");
System.out.println("* 301~309 : 더블룸");
System.out.println("* 401~409 : 스위트룸");
System.out.println("----------------------------------------------");
System.out.print("방 번호 입력 >> ");
int roomNo = sc.nextInt();
//존재하지 않는 방번호일 때
if(!hotelMap.containsKey(roomNo)) {
System.out.println(roomNo + "호 객실은 존재하지 않습니다.");
return;
}
//이미 방이 체크인 상태일 때
if(!hotelMap.get(roomNo).getGuestName().equals("-")) {
System.out.println(roomNo + "호 객실은 이미 손님이 있습니다.");
return;
}
sc.nextLine();
System.out.print("이름 입력 >> ");
String name = sc.nextLine();
//객실 이름변경
hotelMap.get(roomNo).setGuestName(name);
//Map에 저장
hotelMap.put(roomNo, hotelMap.get(roomNo));
System.out.println("체크인이 완료되었습니다.");
}
private void checkOut() {
sc.nextLine();
System.out.println("----------------------------------------------");
System.out.println(" 체크아웃 작업");
System.out.println("----------------------------------------------");
System.out.println("체크아웃 할 방 번호를 입력하세요.");
System.out.print("방 번호 입력 >> ");
int roomNo = sc.nextInt();
//존재하지 않는 방번호일 때
if(!hotelMap.containsKey(roomNo)) {
System.out.println(roomNo + "호 객실은 존재하지 않습니다.");
return;
}
String name = hotelMap.get(roomNo).getGuestName();
//체크인한 사람이 없을 때
if(name.equals("-")) {
System.out.println(roomNo + "호 객실에는 체크인한 사람이 없습니다.");
return;
}
//객실 이름 변경
hotelMap.get(roomNo).setGuestName("-");
//Map에 저장
hotelMap.put(roomNo, hotelMap.get(roomNo));
System.out.println(roomNo + "호 객실의 " + name + "님 체크아웃을 완료하였습니다.");
}
private void roomCheck() {
sc.nextLine();
System.out.println("----------------------------------------------");
System.out.println(" 현재 객실 상태");
System.out.println("----------------------------------------------");
System.out.println("방 번호 방 종류 투숙객 이름");
System.out.println("----------------------------------------------");
//Map을 Set으로 변경
Set<Integer> hotelSet = hotelMap.keySet();
//Set을 ArrayList로 변경
ArrayList<Integer> roomList = new ArrayList<>(hotelSet);
//위의 식을 간단하게
//ArrayList<Integer> roomList = new ArrayList<>(hotelMap.keySet());
//오름차순 정렬
Collections.sort(roomList);
for(int roomNo : roomList) {
System.out.println(roomNo + "\t"
+ hotelMap.get(roomNo).getRoomType() + "\t" + hotelMap.get(roomNo).getGuestName());
}
System.out.println("----------------------------------------------");
//map을 리스트로 바꿔서 오름차순 정렬
}
}
class Room {
private int roomNo; //방번호
private String roomType; //방종류
private String guestName; //투숙객 이름
//생성자
public Room(int roomNo, String roomType, String guestName) {
this.roomNo = roomNo;
this.roomType = roomType;
this.guestName = guestName;
}
//getter, setter
public int getRoomNo() {
return roomNo;
}
public void setRoomNo(int roomNo) {
this.roomNo = roomNo;
}
public String getRoomType() {
return roomType;
}
public void setRoomType(String roomType) {
this.roomType = roomType;
}
public String getGuestName() {
return guestName;
}
public void setGuestName(String guestName) {
this.guestName = guestName;
}
}