DEV/└ JAVA EX

영화관 '코드박스' 예약 시스템 1

devvnn 2022. 1. 6. 21:11
문제

 

영화관 '코드박스'에서 좌석 예약 시스템을 개발해달라는 부탁이 왔는데요. 지금까지 배운 객체 지향 프로그래밍 개념을 이용해서 한번 만들어봅시다.

좌석은 A행부터 E행까지 있고, 각 행은 1열부터 9열까지 있습니다.

이번 과제에서는 '영화관(Seat, Theater 클래스)'만 구축하고, 다음 과제에서 '예약'과 '취소' 기능을 구현해봅시다

 

Seat 클래스

 

(1) private String name

예약자 이름을 담습니다.

(2) public String getName()

예약자 이름을 리턴합니다.

(3) public void reserve(String name)

예약자 이름을 설정해줍니다.

(4) public void cancel()

예약자 이름을 없애줍니다. name을 다시 null로 설정하는 것이죠!

(5) public boolean isOccupied()

이미 예약된 자리인지 불린값을 리턴해줍니다.

(6) public boolean match(String checkName)

checkName이라는 이름으로 예약된 자리인지 확인하고, 불린값을 리턴해줍니다.


Theater 클래스

 

(1) private Seat[][] seats;

전체 좌석을 표현하는 2차원 Seat 배열입니다.

(2) private int rowCount, colCount;

전체 좌석의 행(row)과 열(col)의 수를 담는 변수입니다.

(3) public Theater(int rowCount, int colCount)

Theater 클래스의 생성자입니다. 파라미터로 받은 열과 행의 수에 해당하는 2차원 배열을 만들고, Seat 클래스의 인스턴스들로 배열을 채워줍니다. 모든 Seat 인스턴스는 서로 달라야 합니다. 총 rowCount * colCount개의 인스턴스가 필요하겠죠?

또, 파라미터로 받은 변수들의 값을 각각 동일한 이름의 내부 인스턴스 변수에 넣어줍니다. 예를 들어서 rowCount는 this.rowCount에 넣어줘야 하겠죠?

(4) public void printSeatMatrix()

좌석 정보를 출력하는 메소드입니다. 템플릿으로 제공된 완성된 메소드입니다.


출력값

 

    1  2  3  4  5  6  7  8  9
A: [ ][ ][ ][ ][ ][ ][ ][ ][ ]
B: [ ][ ][ ][ ][ ][ ][ ][ ][ ]
C: [ ][ ][ ][ ][ ][ ][ ][ ][ ]
D: [ ][ ][ ][ ][ ][ ][ ][ ][ ]
E: [ ][ ][ ][ ][ ][ ][ ][ ][ ]
 

 

 

풀이 및 답
Seat 클래스

 

public class Seat {
    // 예약자 이름
    private String name;
    
    // 예약자 이름 리턴
    public String getName() {
        return name;
    }
    
    // 예약자 이름 설정
    public void reserve(String name) {
        this.name=name;
    }
    
    // 예약자 이름 삭제
    // name을 다시 null로 설정
    public void cancel() {
        this.name=null;
    }
    
    // 이미 예약된 자리인지 불린값을 리턴
    public boolean isOccupied() {
        return name != null;
    }
    
    // checkName이라는 이름으로 예약된 자리인지 확인하고, 불린값을 리턴
     public boolean match(String checkName) {
         return name.equals(checkName);
     }
}
 

Theater 클래스

 

public class Theater {
    // 전체 좌석을 표현하는 2차원 Seat 배열
    // null값으로 채워져있음
    private Seat[][] seats;
    
    // 전체 좌석의 행(row)과 열(col)의 수를 담는 변수
    private int rowCount, colCount;
    
    // Theater 클래스의 생성자
    // 파라미터로 받은 열과 행의 수에 해당하는 2차원 배열을 만들고, Seat 클래스의 인스턴스들로 배열을 채워줍니다. 
    // 모든 Seat 인스턴스는 서로 달라야 합니다. 총 rowCount * colCount개의 인스턴스가 필요
    // 파라미터로 받은 변수들의 값을 각각 동일한 이름의 내부 인스턴스 변수에 넣어줍니다. 
    // 예를 들어서 rowCount는 this.rowCount에 넣어줘야 하겠죠?
    public Theater(int rowCount, int colCount) {
    // Theater 생성자로 생성된 Theater 인스턴스의 인스턴스 변수 행, 열에 생성자에서 받은 파라미터 값을 채우고
    // 그 크기만큼 이중 for문으로 seats의 모든 칸을 Seat 인스턴스로 채우기
        
        // 알파벳은 26개밖에 없기 때문에 이를 대비하는 코드 작성
        if(rowCount > 26) {
            rowCount = 26; // number of alphabets
        }
        
        // 좌석 배열 생성
        seats = new Seat[rowCount][colCount];

        // 2차원 배열을 탐색하는 과정은 2중 for문 사용
        for(int i=0; i<rowCount; i++) {
            for(int j=0; j<colCount; j++) {
                // 인스턴스 생성
                seats [i][j] = new Seat();
            }
        }
        
        this.rowCount = rowCount;
        this.colCount = colCount;
        
    }
    
    // 좌석 정보를 출력하는 메소드
    public void printSeatMatrix() {
        System.out.print("  ");
        for (int i = 1; i <= 9; i++) {
            System.out.print("  " + i);
        }
        System.out.println();

        for (int i = 0; i < rowCount; i++) {
            System.out.print((char) ('A' + i) + ": ");
            for (int j = 0; j < colCount; j++) {
                Seat s = seats[i][j];
                if (s.isOccupied()) {
                    System.out.print("[O]");
                } else {
                    System.out.print("[ ]");
                }
            }
            System.out.println();
        }
    }
}
 

Main 클래스
public class Main {
    public static void main(String[] args) {
        Theater t = new Theater(5, 9);
        t.printSeatMatrix();
    }
}