Hayden's Archive

[자바/Java] 상영 영화 관리 프로그램 본문

Study/Java & Kotlin

[자바/Java] 상영 영화 관리 프로그램

_hayden 2020. 4. 16. 23:48

- 도서관 사서 프로그램 ( 관련 포스팅 : https://hayden-archive.tistory.com/62 )과 유사하지만 인터페이스를 추가하여 클래스가 인터페이스를 구현하도록 하고 CRUD에서 D 기능을 추가하였으며 또 MovieMgrImpl 클래스에 싱글톤을 적용했다.

- equals() 함수 뿐만 아니라 contains() 함수를 사용하여 영화 제목이 완전히 일치하지 않더라도 키워드가 포함된다면 검색에서 걸릴 수 있도록 하였다.

- 배열을 2개 만들어 담을 뿐만 아니라 System.arraycopy() 기능을 활용하여 배열을 간편하게 카피하였다.

package com.vo;

public class Movie {
	private String title;
	private String director;
	private int grade;
	private String genre;
	private String summary;
	
	public Movie(){}
	
	public Movie(String title, String director, int grade, String genre) {
		super();
		this.title = title;
		this.director = director;
		this.grade = grade;
		this.genre = genre;
	}
	
	public Movie(String title, String director, int grade, String genre, String summary) {
		super();
		this.title = title;
		this.director = director;
		this.grade = grade;
		this.genre = genre;
		this.summary = summary;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getDirector() {
		return director;
	}

	public void setDirector(String director) {
		this.director = director;
	}

	public int getGrade() {
		return grade;
	}

	public void setGrade(int grade) {
		this.grade = grade;
	}

	public String getGenre() {
		return genre;
	}

	public void setGenre(String genre) {
		this.genre = genre;
	}

	public String getSummary() {
		return summary;
	}

	public void setSummary(String summary) {
		this.summary = summary;
	}

	@Override
	public String toString() {
		return "title=" + title + ", director=" + director + ", grade=" + grade + ", genre=" + genre
				+ ", summary=" + summary +"\n";
	}
		
	
}
package com.service;

import com.vo.Movie;

public interface MovieMgr {
	void add(Movie m);
	Movie[] search();
	Movie[] search(String title);
	Movie[] searchDirector(String name);
	Movie[] searchGenre(String genre);
	void delete(String title);
	int getSize();
}
package com.service;

import java.util.Arrays;

import com.vo.Movie;
public class MovieMgrImpl implements MovieMgr {
	private Movie[ ] movies = new Movie[100];
	private int index;
	private static MovieMgrImpl mgr = new MovieMgrImpl();
	private MovieMgrImpl() {}
	public static MovieMgrImpl getInstance() {
		return mgr;
	}
	//싱글톤...MovieMgr을 mgr이름으로 객체 생성...getInstance로 생성한 객체를 받아온다.
	
	//영화 정보 추가하기
	public void add(Movie m) {
		movies[index++] = m;
	}
	
	// 영화 정보 모두 검색하기
	public Movie[] search() {
		Movie[] ms = new Movie[index];
		for(int i = 0; i < index; i++) {
			if(movies[i] != null) {
				ms[i] = movies[i];
			}
		}
		return ms;
	}
	
	// 영화 제목으로 영화 찾기
	// equals()가 아닌 contains()로 키워드가 포함되면 검색에 걸림
	public Movie[] search(String title) {
		int i = 0; int count = 0;
		Movie[] ms = new Movie[index];
		for(Movie m : movies) {
			if(m == null) continue;
			else if(m.getTitle().contains(title)) {
				ms[i++] = m;
				count++;
			}
		}
		
		//null 값을 추리기 위해서 다시 for문을 동작시킴.
		Movie[] ms2 = new Movie[count];
		if(count > 0) System.arraycopy(ms, 0, ms2, 0, count);
		return ms2;
	}

	// 감독명으로 영화 찾기
	public Movie[] searchDirector(String name) {
		int size = 0;
		for(int i = 0; i < index; i++) {
			if(movies[i] == null) continue;
			else if(movies[i].getDirector().equals(name)) size++; //2
		}
		Movie[] ms = new Movie[size];
		for(int i = 0; i < index; i++) {
			if(movies[i].getDirector().equals(name)) {
				ms[--size] = movies[i];
				//뒤에서부터 하나씩 넣어주는 것. ms[1], ms[0]
			}
		}
		return ms;
	}

	// 장르로 영화 찾기
	public Movie[] searchGenre(String genre) {
		int count = 0; int i = 0;
		Movie[] ms = new Movie[index];
		for(Movie m : movies) {
			if(m == null) continue;
			else if(m.getGenre().equals(genre)) {
				ms[i++] = m;
				count++;
			}
		}
		Movie[] ms2 = new Movie[count];
		for(int j = 0; j < count; j++) {
			ms2[j] = ms[j];
		}
		return ms2;
	}

	// 이름으로 영화 정보 삭제하기
	public void delete(String title) {
		int count = 0;
		for(Movie m : movies) {
			if(m == null) continue;
			else if(m.getTitle().equals(title)) count++;
		}
		Movie[] ms = new Movie[index-count];
		int idx = 0;
		for(Movie m : movies) {
			if(m == null) continue;
			else if(m.getTitle().equals(title)) continue;
			else ms[idx++] = m;
		}
		System.out.println(Arrays.toString(ms));
	}
	
	// 배열의 길이
	public int getSize() {
		return index;
	}
}
package com.test;

import java.util.Arrays;
import java.util.Scanner;

import com.service.MovieMgrImpl;
import com.vo.Movie;

public class MovieTest {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("<<영화 관리 프로그램>>");
		//getInstance()로 MovieMgr 객체 받아옴..
		MovieMgrImpl mvManager = MovieMgrImpl.getInstance();
		
		boolean flag = true;
		while(flag) {
			System.out.println("1. 영화 정보 입력");
			System.out.println("2. 영화 정보 전체 검색");
			System.out.println("3. 영화명 검색");
			System.out.println("4. 영화 감독별 검색");
			System.out.println("5. 영화 장르별 검색");
			System.out.println("6. 영화 정보 삭제");
			System.out.println("0. 종료");
			
			int selectNum = sc.nextInt();
			switch(selectNum) {
			case 1:
				System.out.print("영화 명을 입력해주세요 : ");
				String mvName = sc.next();
				System.out.print("감독 명을 입력해주세요 : ");
				String mvDir = sc.next();
				System.out.print("등급을 입력해주세요 : ");
				int mvGr = sc.nextInt();
				System.out.print("장르를 입력해주세요 : ");
				String mvGre = sc.next();
				System.out.print("요약을 입력해주세요 : ");
				String mvSumm = sc.next();
				mvManager.add(new Movie(mvName, mvDir, mvGr, mvGre, mvSumm));
				System.out.println("성공적으로 추가되었습니다.");
				break;
			case 2:
				System.out.println(Arrays.toString(mvManager.search()));
				break;
			case 3:
				System.out.println("찾고자하는 제목을 입력하세요 : ");
				mvName = sc.next();
				System.out.println(Arrays.toString(mvManager.search(mvName)));
				break;
			case 4:
				System.out.println("찾고자하는 감독을 입력하세요 : ");
				mvName = sc.next();
				System.out.println(Arrays.toString(mvManager.searchDirector(mvName)));
				break;
			case 5:
				System.out.print("찾고자하는 장르를 입력하세요 : ");
				sc.nextLine();
				mvGre = sc.next();
				System.out.println(Arrays.toString(mvManager.searchGenre(mvGre)));
				break;
			case 6:
				System.out.print("삭제하고자하는 제목을 입력하세요 : ");
				mvName = sc.next();
				mvManager.delete(mvName);
				System.out.println("삭제완료");
				break;
			case 0:
				flag=false;
				break;
			}			
		}
	}

}