📝관련 실습: 상속과 다형성 (MovieTest.java)
import java.util.Scanner;
public class MovieTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
MovieManager mm = MovieManager.getInstance();
int sel;
do{
System.out.print("1. 영화등록\n2. 전체조회\n3. 제목으로 검색\n4. 일반영화 조회\n5. 시리즈영화 조회\n6. 평균상영 시간\n0. 종료\n>>> ");
sel = sc.nextInt();
sc.nextLine();
if(sel == 1) {
System.out.println("1. 일반 영화\n2. 시리즈 영화");
sel = sc.nextInt();
if(sel == 1) {
System.out.println("관리번호를 입력하세요.");
int id = sc.nextInt();
sc.nextLine();
System.out.println("영화 제목을 입력하세요.");
String title = sc.nextLine();
System.out.println("영화 감독을 입력하세요.");
String director = sc.nextLine();
System.out.println("영화 장르를 입력하세요.");
String genre = sc.nextLine();
System.out.println("영화 상영시간을 입력하세요.");
int runningTime = sc.nextInt();
Movie movie = new Movie(id,title,director,genre,runningTime);
mm.add(movie);
} else if(sel == 2) {
System.out.println("관리번호를 입력하세요.");
int id = sc.nextInt();
sc.nextLine();
System.out.println("영화 제목을 입력하세요.");
String title = sc.nextLine();
System.out.println("영화 감독을 입력하세요.");
String director = sc.nextLine();
System.out.println("영화 장르를 입력하세요.");
String genre = sc.nextLine();
System.out.println("영화 상영시간을 입력하세요.");
int runningTime = sc.nextInt();
System.out.println("시리즈 넘버를 입력하세요");
int seriesNum = sc.nextInt();
sc.nextLine();
System.out.println("에피소드를 입력하세요");
String episode = sc.nextLine();
SeriesMovie movie = new SeriesMovie(id, title, director, genre, runningTime, seriesNum,episode);
mm.add(movie);
}
}
else if(sel == 2) {
Movie[] movies =mm.getList();
for(Movie m : movies) {
System.out.println(m);
}
}
else if(sel == 3) {
System.out.println("영화 제목을 입력해주세요");
String title = sc.nextLine();
Movie[] movies = mm.searchByTitle(title);
for(Movie m : movies) {
System.out.println(m);
}
}
else if(sel == 4) {
Movie[] movies = mm.getMovies();
for(Movie m: movies) {
System.out.println(m);
}
}
else if(sel == 5) {
Movie[] movies = mm.getSeriesMovies();
for(Movie m: movies) {
System.out.println(m);
}
}
else if(sel == 6) {
System.out.println(mm.getRunningTimeAvg());
}
} while(sel != 0);
} //main
}//end class
ArrayIndexOutOfBoundsException 가 발생하였다. 'title'로 조회할 땐 정상적으로 작동하지만 '2'로 조회할 땐 오류가 떴다.
else if(sel == 3) {
System.out.println("영화 제목을 입력해주세요");
String title = sc.nextLine();
for(int i=0; i<mm.getSize(); i++) {
Movie[] movies = mm.searchByTitle(title);
System.out.println(movies[i]);
}
}
for문 안의 코드들이 원인이었다. 영화 리스트 안의 목록들을 다 훑어서 입력된 제목(키워드)이 포함된 영화를 찾아낸다는 생각에 저렇게 작성한 것 같다. 하지만 이 로직은 이미 MovieManager 클래스에서 적용되어 코드가 작성되었다.
여기서 오류가 난 이유를 풀어 설명하자면, 숫자 '2'로만 검색할 때는 mm.searchByTitle(title) 의 반환값인 배열의 크기가 1 즉, 리턴값 Movie[ ]는 1개의 영화만을 원소로 가진다. 따라서 인덱스가 0이면 끝나는데 for(int i=0; i<mm.getSize(); i++) 으로 인해 인덱스가 0, 1까지 도는 것이다. 즉, for문 안에 mm.getSize() 로 인해서 원래의 배열 크기(초기 등록 상태의 Movie[ ]의 크기)인 2미만으로 for문이 돌게 되고, 인덱스가 0까지만 있는 배열에서 인덱스 1인 원소를 찾았기 때문에 ArrayIndexOutOfBoundsException 가 발생한 것이다. 따라서 'title'로 검색할 때는 초기 등록 상태인 Movie[ ]의 크기와 똑같은 리턴값을 출력하기 때문에 정상 작동되었던 것이다. 아래와 같이 코드를 수정하면 정상 작동한다.
else if(sel == 3) {
System.out.println("영화 제목을 입력해주세요");
String title = sc.nextLine();
Movie[] movies = mm.searchByTitle(title);
for(Movie m : movies) {
System.out.println(m);
}
}