영화_시리즈 영화 상속 실습3

호떡·2022년 7월 27일
0

📝관련 실습: 상속과 다형성 (MovieManager.java)

  • instanceof

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

instanceof

강제 타입 변환(Casting)은 부모 타입을 자식 타입으로 변환하는 것을 말한다. 그렇다고 해서 모든 부모 타입을 자식 클래스 타입으로 강제 변환할 수 있는 것은 아니다. 자식 타입이 부모 타입으로 자동 변환한 후, 다시 자식 타입으로 변환할 때 강제 타입 변환을 사용할 수 있다.
자식 타입이 부모 타입으로 자동 변환하면, 부모 타입에 선언된 필드와 메소드만 사용 가능하다는 제약 사항이 따른다. 만약 자식 타입에 선언된 필드와 메소드를 꼭 사용해야 한다면 강제 타입 변환을 해서 다시 자식 타입으로 변환한 다음 자식 타입의 필드와 메소드를 사용하면 된다.
이 때 instanceof 연산자가 필요하다. 강제 타입 변환은 자식 타입이 부모 타입으로 변환되어 있는 상태에서만 가능하기 때문에 부모 타입의 변수가 부모 객체를 참조할 경우 자식 타입으로 변환할 수 없다. 따라서 부모 변수가 참조하는 객체가 부모 객체인지 자식 객체인지 확인할 수 있는 instanceof 연산자가 필요하다.

instanceof 연산자의 좌항은 객체가 오고, 우항은 타입이 오는데, 좌항의 객체가 우항의 인스턴스이면 (즉, 우항의 타입으로 객체가 생성되었다면) true를 산출하고, 그렇지 않으면 false를 산출한다.

boolean result = movieList[i] instanceof SeriesMovie

0개의 댓글