📝관련 실습: 상속과 다형성 (MovieManager.java)
import java.util.Arrays;
/*영화리스트를 배열로 관리하는 클래스*/
public class MovieManager {
private static int MAX_SIZE ;
private Movie[] movieList;
private int size;
private static MovieManager instance = new MovieManager();
public int getSize() {
return this.size;
}
private MovieManager() {
this.MAX_SIZE = 100;
this.size = 0;
this.movieList = new Movie[MAX_SIZE];
}
public static MovieManager getInstance() {
return instance;
}
public void add(Movie movie) {
movieList[size++] = movie;
}
public Movie[] getList() {
Movie[] tmp = new Movie[size];
for(int i =0; i < size; i++) {
tmp[i] = movieList[i];
}
return tmp;
}
public Movie[] getMovies() {
int cnt=0;
for(int i=0; i <size; i++) {
if(!(movieList[i] instanceof SeriesMovie)) {
cnt++;
}
}
int idx=0;
Movie[] tmp = new Movie[cnt];
for(int i =0; i < size; i++) {
if(!(movieList[i] instanceof SeriesMovie)) {
tmp[idx++] = movieList[i];
}
}
return tmp;
}
public SeriesMovie[] getSeriesMovies() {
int cnt=0;
for(int i=0; i <size; i++) {
if(movieList[i] instanceof SeriesMovie) {
cnt++;
}
}
int idx=0;
SeriesMovie[] tmp = new SeriesMovie[cnt];
for(int i =0; i < size; i++) {
if(movieList[i] instanceof SeriesMovie) {
tmp[idx++] = (SeriesMovie)movieList[i];
}
}
return tmp;
}
public Movie[] searchByTitle(String title) {
int cnt=0;
for(int i=0; i <size; i++) {
if(movieList[i].getTitle().contains(title)) {
cnt++;
}
}
Movie[] tmp = new Movie[cnt];
int idx = 0;
for(int i=0; i<size; i++) {
if(movieList[i].getTitle().contains(title)) {
tmp[idx++] = movieList[i];
}
}
return tmp;
}
public double getRunningTimeAvg() {
int sum=0;
for(int i =0; i< size; i++) {
sum += movieList[i].getRunningTime();
}
return sum/(double)(size);
}
}
강제 타입 변환(Casting)은 부모 타입을 자식 타입으로 변환하는 것을 말한다. 그렇다고 해서 모든 부모 타입을 자식 클래스 타입으로 강제 변환할 수 있는 것은 아니다. 자식 타입이 부모 타입으로 자동 변환한 후, 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.
자식 타입이 부모 타입으로 자동 변환하면, 부모 타입에 선언된 필드와 메소드만 사용 가능하다는 제약 사항이 따른다. 만약 자식 타입에 선언된 필드와 메소드를 꼭 사용해야 한다면 강제 타입 변환을 해서 다시 자식 타입으로 변환한 다음 자식 타입의 필드와 메소드를 사용하면 된다.
이 때 instanceof 연산자가 필요하다. 강제 타입 변환은 자식 타입이 부모 타입으로 변환되어 있는 상태에서만 가능하기 때문에 부모 타입의 변수가 부모 객체를 참조할 경우 자식 타입으로 변환할 수 없다. 따라서 부모 변수가 참조하는 객체가 부모 객체인지 자식 객체인지 확인할 수 있는 instanceof 연산자가 필요하다.
instanceof 연산자의 좌항은 객체가 오고, 우항은 타입이 오는데, 좌항의 객체가 우항의 인스턴스이면 (즉, 우항의 타입으로 객체가 생성되었다면) true를 산출하고, 그렇지 않으면 false를 산출한다.
boolean result = movieList[i] instanceof SeriesMovie