고급JAVA 6강 - ENUM(열거형)

Whatever·2021년 11월 4일
0

고급 JAVA

목록 보기
6/32

상수를 처리할 때 의미까지 부여한 것 : 열거형

enum(열거형)

==> 서로 관련있는 상수들의 집합을 나타낸다.
==> 클래스처럼 보이게 하는 상수
==> 열거형은 class처럼 독립된 java파일에 만들 수 있고, 하나의 java파일에 클래스와 같이 만들 수 있고,
class 안에 내부 클래스처럼 만들 수 있다.

  • 열거형의 속성 및 메서드
    1) name() ==> 열거형 상수의 이름을 문자열로 반환한다.
    2) ordinal() ==> 열거형 상수가 정의된 순서값(index값)을 반환한다.(0부터 시작)
    3) valueOf("열거형상수명") ==> 지정된 열거형에서 '열거형상수명'과 일치하는 열거형 상수를 반환한다.
    4) 열거형이름.상수명 ==> valueOf("상수명")메서드와 같다.
  • 열거형 선언하기
    방법1)
    enum 열거형이름 { 상수명1, 상수명2, 상수명3, ... }방법2)
    enum 열거형이름 {
    상수명1(값들...), //값들 한 개 이상 지정할 수 있다. 그럴 때는 나머지 상수도 값의 개수, 타입이 모두 같아야 한다.
    상수명2(값들...),
    상수명3(값들...),
    ...
    상수명n(값들...); '값들'이 저장될 변수들 선언한다.
    '값들'의 개수만큼의 변수를 선언한다.
    private 자료형이름 변수명1;
    ...
  • 열거형의 생성자를 만든다.
  • 열거형의 생성자는 '열거형상수'에 '값들'을 셋팅하는 역할을 수행한다.
  • 열거형의 생성자는 묵시적으로 'private'이다.
    '변수명'은 '값들'과 개수가 같고, 각각의 '값들'과 자료형이 맞아야 한다.
    private 열거형이름(자료형이름 변수명, ...){ // 위의 값들의 개수랑 맞춰야 함.
    위에 선언된 변수들을 매개변수를 이용해서 초기화한다.
    ...
    }
    구성된 '값들'을 외부에서 불러올 수 있도록 getter메서드를 작성한다.
    public 자료형이름 get변수명1(){
    return 변수명;
    }
      

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;
}

}

0개의 댓글