본문 바로가기
Backend/JAVA

[JAVA] 학과 프로그램 #5 - 강의 수강 기능 추가(+파일)

by 그적 2020. 10. 3.

여러 개의 클래스 프로그램
"새로운 기능을 추가하기 위해 클래스가 추가되는 경우"

기존에 검색 기능을 추가할 때는 메서드만 추가하면 되었었다. 하지만 'Lecture'이라는 기능을 추가하기 위해서는 학생이 수강하는 수업을 학과에서 관리해야 하기 때문에 'Lecture' 데이터를 가지고 있는 클래스를 추가해야 한다. 혹은 팀 기능을 추가하기 위해서 새로운 클래스를 만들어야 할 수도 있다.

 

 

(수강 정보 처리 기능)
 - 과목 정보 입력
 - 학생의 수강 정보 입력

 

(수강 정보 검색 기능)
 - 과목을 수강하는 학생
 - 학생이 수강하는 과목
 - 해당 요일에 수업이 있는 학생

 

// Lecture 클래스

class Lecture(){
	ArrayList <Lecture> registeredList = new ArrayList<>();
	void read(Scanner s, Department department){
		String code;
		Lecture lecture;
		while(true){
		   code = s.next();
		   if(code.equals("0"))	  break;
		   lecture = department.findLecture(code);
		   registeredList.add(lecture);
		}
	}
}

 


객체 간 연관관계 검색
- 학생이 수강하는 과목들 정보 (학생 -> 과목 접근)
- 과목을 수강하는 학생들 정보 (과목 -> 학생 접근)

하지만 이때 과목을 수강하는 학생들의 정보를 가지고 있지 않다. 따라서 학생들 한 명씩 과목을 수강하는지 확인해야 한다. ① lecture 클래스에서 findLecture() 메서드를 통해 과목이 존재하는지 확인하고, ② student 클래스에서 containsLecture() 메서드를 통해 해당 과목을 수강하는지 확인할 것이다.

 

 

// Lecture 클래스

package hw4_lecture;

import java.util.ArrayList;
import java.util.Scanner;

public class Lecture {
	
	String code;
	String title;
	int year;
	String date;
	String time;
	
	Lecture(String code){
		this.code = code;
	}
	
	public boolean matches(String kwd) {
	// TODO Auto-generated method stub
		if(code.contentEquals(kwd))
			return true;
		if(title.contains(kwd))
			return true;
		if(kwd.contentEquals(""+year))
			return true;
		if(kwd.contentEquals(date))
			return true;
		if(kwd.contentEquals(time))
			return true;
		return false;
	}
	
	void read(Scanner s) {
		title = s.next();
		year = s.nextInt();
		date = s.next();
		time = s.next();
	}
	
	void print() {
		System.out.printf("[%s] %s %d년 %s /%s\n",
				code, title, year, date, time);
	}
	
}

 

// Department 클래스

package hw4_lecture;

import java.util.ArrayList;
import java.util.Scanner;

public class Department {
	Scanner s = new Scanner(System.in);

	ArrayList<Student> studentList = new ArrayList<>();
	ArrayList<Lecture> lectureList = new ArrayList<>();
	
	void run() {

		readAllLecture();
		readAllStudent();

		menu();
	}
	
	void menu() {
		int menu;
		while(true) {
			System.out.print("\n\n대분류 (1) 학생		(2) 과목			(3) 연관검색	");
			System.out.print("(0) 종료	");
			System.out.print(">> 입력 : ");
			menu = s.nextInt();
			
			switch(menu) {
			case 1: menuStudent(); break;
			case 2: menuLecture(); break;
			case 3: menuSearch(); break;
			default: System.exit(0); break;
			}
		}
	}
	
	void menuStudent() {
		int menu;
			System.out.print("\n학생세부 메뉴 (1) 학생 전체 출력	(2) 멀티 키워드 검색  ");
			System.out.print("(0) 이전	");
			System.out.print(">> 입력 : ");
			menu = s.nextInt();
			
			switch(menu) {
			case 1: printAllStudent(); break;
			case 2: searchStudent(); break;
			default : break;
		}		
	}
	
	void menuLecture() {
		int menu;
			System.out.print("과목세부 메뉴	(1) 과목 전체 출력 	(2) 키워드 검색	  ");
			System.out.print("(0) 이전	");
			System.out.print(">> 입력 : ");
			menu = s.nextInt();
			
			switch(menu) {
			case 1: printAllLecture(); break;
			case 2: searchLecture("강의"); break;
			default : break;
		}		
	}
	
	void menuSearch() {
		int menu;
			System.out.print("연관검색 메뉴 (1) 과목별 수강생		(2) 요일별 수강생  ");
			System.out.print("         (3) 타학년 과목 수강생 수");
			System.out.print("(0) 이전");
			System.out.print(">> 입력 : ");
			menu = s.nextInt();
			
			switch(menu) {
			case 1: searchLecture("수강생"); break;
			case 2: searchDay();
			case 3: differentGrade();
			default : break;
		}		
	}
	
	void differentGrade() {		
		for(Lecture lec: lectureList) {
			lec.print();
			int count = 0;
			for(Student st: studentList) {
				if(st.containsLecture(lec)){
					if((st.year) != (lec.year)) {
						System.out.print(st.name+" ");
						count++;
					}
				}
			}
			System.out.println("("+count+")");
			System.out.println();
			}
	}
	
	
	void searchDay() {
		String kwd;
		while(true) {
			System.out.println("=========요일별 학생 검색(end 입력 시 끝)=========");
			System.out.print(">> 요일 : ");
			kwd = s.next();
			
			if(kwd.contentEquals("end"))
				break;
			System.out.printf("%s요일 수강생 : ", kwd);
			
			if(kwd.contentEquals("월") || kwd.contentEquals("화") || kwd.contentEquals("수")
					|| kwd.contentEquals("목") || kwd.contentEquals("금")) {
				for(Student st: studentList) {
					for(Lecture lec: existLecture(kwd)) {
						if(st.containsLecture(lec))
							System.out.print(st.name+" ");
					}
				}
			}
			System.out.println();
		}
		
	}
	
	void searchLecture(String what) {
		String kwd;
		
		while(true) {
			kwd = s.nextLine();
			System.out.println("=========과목 검색(end 입력 시 끝)=========");
			System.out.print("과목 키워드 검색 : ");
			kwd = s.next();
		
			if(kwd.contentEquals("end"))
				break;
			
			ArrayList<Lecture> lecture = new ArrayList<>();
			lecture = existLecture(kwd);
			if(lecture.size() == 0)
				break;
			
			if(what.contentEquals("과목")) {
				for(Lecture lec: lecture)
					lec.print();
			}
			if(what.contentEquals("수강생")) {
				for(Lecture lec: lecture) {
					lec.print();
					for(Student st: studentList) {
						if(st.containsLecture(lec))
							st.print();
					}
					System.out.println();
				}
			}
		}
	}
	
	void searchStudent() {
		String kwd;
		s.nextLine();
		String[] kwdArr;
		while(true) {
			System.out.print("입력 (end 입력시 이전 화면) >> ");
			kwd = s.nextLine();
			
			if(kwd.contentEquals("end")) break;
			
			kwdArr = kwd.split(" ");
			for(Student st: studentList) {
				if(st.matches(kwdArr)) st.print();
			}
		}
	}

	public ArrayList<Lecture> existLecture(String kwd) {		
		ArrayList<Lecture> existLecture = new ArrayList<>();
		
		for(Lecture lec: lectureList)
			if(lec.matches(kwd))
				existLecture.add(lec);		

		return existLecture;
	}	
	
	void readAllStudent() {
		int id = 0;
		while(true) {
			id = s.nextInt();
			if(id == 0) break;
			
			Student st = new Student(id);
			st.read(s, this);
			studentList.add(st);		
		}
	}
	
	void printAllStudent() {
		for(Student st: studentList) {
			st.print();
			st.print_lecture();
		}
		
	}
	
	void readAllLecture() {
		String code = null;
		while(true) {
			code = s.next();
			if(code.contentEquals("end")) break;
			
			Lecture lec = new Lecture(code);
			lec.read(s);
			lectureList.add(lec);		
		}
	}
	
	void printAllLecture() {
		for(Lecture lec: lectureList) {
			lec.print();
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Department m = new Department();
		m.run();
	}


}

 

// Student 클래스

package hw4_lecture;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class Student {
	int id;
	String name;
	String phone;
	int year;
	ArrayList<Lecture> registeredList = new ArrayList<>();
	
	public Student(int id2) {
		id = id2;
	}
	
	public boolean matches(String kwd) {
		if(name.contains(kwd)) return true;
		if(kwd.length()>3 && (id+"").contains(kwd)) return true;
		if(kwd.length()>3 && phone.contains(kwd)) return true;
		if((year+"").contentEquals(kwd)) return true;
		return false;
	}

	public boolean matches(String[] kwdArr) {
		for(String kwd: kwdArr) {
			if(name.contains(kwd)) return true;
			if(kwd.length()>3 && (id+"").contains(kwd)) return true;
			if(kwd.length()>3 && phone.contains(kwd)) return true;
			if((year+"").contentEquals(kwd)) return true;
			for(Lecture lec: registeredList) {
				if(containsLecture(lec)) return true;
			}
		}
		return false;
	}

	public boolean containsLecture(Lecture lecture) {
		// TODO Auto-generated method stub
		for(Lecture lec : registeredList) {
			if(lec.equals(lecture))
				return true;
		}
		return false;
	}	
	
	void read(Scanner s, Department department) {
		//id = s.nextInt();
		name = s.next();
		phone = s.next();
		year = s.nextInt();
		
		String code = null;
		ArrayList<Lecture> lec = null;
		
		while(true) {
			code = s.next();
			if(code.contentEquals("0")) break;
			lec = department.existLecture(code);
			if(lec.size() == 0) {
				System.out.printf("%s는 없는 과목 코드입니다.", code);
				System.out.println();
				continue;
			}
			registeredList.addAll(lec);
		}
	}
	
	void print() {
		System.out.printf("%d %s %s %d년\n", id, name, phone, year);
	}
	void print_lecture() {
		for(Lecture lec: registeredList) {
			System.out.print("\t");
			lec.print();
		}
		System.out.println();
	}
}

댓글