Java

성적 관리 프로그램 (HashMap 이용)

충 민 2022. 7. 10. 22:17

 

 

배열을 이용하여 만들어 본 성적 관리 프로그램을 HashMap을 이용하여 만들어보았다. 

클래스 다이어그램은 아래와 같다

<그림 1>
<그림 2>

Main Class

import java.util.HashMap;
import java.util.Scanner;
//OO
public class Main {
	// 로그인
	private Login login;
	private Login teacherLogin;

	
	// 데이터 클래스
	private HashMap<Integer,ClassInfo> hashClass;
	
	// 데이터 관리 클래스
	private StudentforAdmin sMode;//학생모드
	private Teacher tMode;//선생님모드
	private AllStudentforTeacher all;//선생님모드에서 전체학생관리
	private ClassStudentforTeacher clas;//선생님모드에서 반학생관리
	private  EachStudentforTeacher stu;//선생님모드에서 한 학생관리
	
	
	// constructor
	public Main() {
		
		// 로그인
		login = new Login();
		// 교사(관리자)의 아이디
		teacherLogin = new Login("admin",1234);
		
		// 데이터 클래스 객체 생성
		hashClass = new HashMap<>();
		
		// 학생 모드 객체 생성
		sMode = new StudentforAdmin(hashClass);
		// 교사 모드 참조변수만 생성
		tMode = null;
		
		// 교사 모드 객체 생성
		
		// 전체 단위
		all = new AllStudentforTeacher(hashClass);
		// 반 단위
		clas = new ClassStudentforTeacher(hashClass);
		// 학생 단위
		stu = new EachStudentforTeacher(hashClass);
	}
	
	
	// main method
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		// 입력받는 숫자
		int num;
		
		// Main 객체 생성
		Main my = new Main();
		

		System.out.println("학생 성적 처리 프로그램");
		
		// 전체 프로그램 무한루트
		while(true) {
			System.out.println("로그인 해주세요.");
			// 로그인 후 관리 모드 설정
			// true => 학생   false => 교사 (관리자)
			
			// 학생
			if(my.login(sc)) {
				// sMode
				System.out.println("학생 로그인에 성공했습니다.");
				System.out.println("학생 정보를 출력합니다.");
				
				// 로그인 시 입력받은 학번 으로 학생 검색 후 학생 점수 출력
				my.sMode.searchOneStu(my.login.getPw());
				my.sMode.printOneStu();
			}
			// 교사
			else {
				// tMode
				System.out.println("교사 로그인에 성공했습니다.");
				while(true) {
					System.out.println("관리 단위를 입력해주세요.");
					System.out.println("1.전체 2.반 3.학생 0.로그아웃");
					num=sc.nextInt();

					// 전체 단위 관리
					if(num == 1) {my.tMode = my.all;}
					// 반 단위 관리
					else if(num == 2) {my.tMode = my.clas;}
					// 학생 단위 관리
					else if(num == 3) {my.tMode = my.stu;}
					// 로그아웃
					else if(num == 0) {
						System.out.println("로그아웃 합니다.");
						break;
					}
					// 잘못된 입력
					else {
						System.out.println("잘못된 입력입니다.");
						continue;
					}

					
					// 동작할 기능 선택
					while(true) {
						System.out.println("동작할 기능을 선택하세요.");
						System.out.println("1.등록 2.검색 0.뒤로가기");
						num = sc.nextInt();

						// 등록
						if(num == 1) {my.tMode.register(sc);}
						// 검색
						else if(num == 2) {
							// 검색을 통해 인덱스 번호 찾기
							my.tMode.search(sc);

							// 검색된 것을 출력/수정/삭제
							while(true) {
								System.out.println("검색 후 이어갈 기능을 선택하세요.");
								System.out.println("1.출력 2.수정 3.삭제 0.뒤로가기");
								num = sc.nextInt();
								
								// 출력
								if(num == 1) {my.tMode.print(sc);}
								// 수정
								else if(num == 2) {my.tMode.modify(sc);}
								// 삭제
								else if(num == 3) {my.tMode.remove();}
								// 뒤로가기
								else if(num == 0) {System.out.println("기능 선택 페이지로 이동합니다.\n");}
								// 잘못된 입력
								else {
									System.out.println("잘못된 입력입니다.");
									continue;
								}
								break;
							}
							if(num==0) continue;
						}
						// 뒤로가기
						else if(num == 0) {
							System.out.println("처음 화면을 이동합니다.\n");
							break;
						}
						// 잘못된 입력
						else {
							System.out.println("잘못된 입력입니다.");
							continue;
						}
					}
				}
			}
		}
	}
	
	
	
	// method
	
	
	// login
	public boolean login(Scanner sc) {

		while(true) {
			System.out.println("아이디와 비밀번호를 입력해주세요.");
			this.login.setIdPw(sc.next(), sc.nextInt());

			// 교사
			if(login.getId().equals(teacherLogin.getId()) && login.getPw() == teacherLogin.getPw()) {
				return false;
			}
			// 학생
			else {
				// 이름 학번을 데이터에서 비교
				if(this.sMode.searchOneStu(login.getPw()) && this.sMode.getOnestu().getStudentName().equals(login.getId())) {
					return true;
				}
			}
			// 로그인 실패 시
			System.out.println("로그인에 실패했습니다.");
		}
	}

	
}

데이터 클래스

-StudentInfo

import java.util.HashMap;

//학생정보클래스
 class StudentInfo {

	private String studentName;//이름
	private int studentNum;//학번
	private Score score;
	public StudentInfo() {
		studentName = new String();
		studentNum = 0;
		score = new Score();
	}
	public StudentInfo(String name,int studentNum,Score score) {
		studentName = new String(name);
		this.studentNum = studentNum;
		this.score = new Score();
		this.score = score;
	}
	public void printInfo() {
		System.out.println("이름: "+this.getStudentName());
		System.out.println("학번: "+this.getStudentNum());
		System.out.println("점수:"+this.getScore().getAvg());
	}
	public void printNameNum() {
		System.out.println("이름: "+this.getStudentName());
		System.out.println("학번: "+this.getStudentNum());
	}
	public void setInfo(String name, Score score, int num) {
		this.score=score;
		this.studentName=name;
		this.studentNum=num;
	}
	//getter/ setter
	public String getStudentName() {return studentName;}
	public void setStudentName(String studentName) {this.studentName=studentName;}
	
	public int getStudentNum() {return studentNum;}
	public void setStudentNum(int studentNum) {
		this.studentNum=studentNum;
	}
	public Score getScore() {return score;}
	public void setScore(Score score) {
		this.score=score;
	}
	public void setScore(int kor, int eng, int mat) {
		this.score.setKor(kor);
		this.score.setEng(eng);
		this.score.setMat(mat);
		this.score.setSumAvg();
	}
	

	
}

-ClassInfo

import java.util.HashMap;
//oO
 class ClassInfo {

	private int classNum;
	private HashMap<Integer,StudentInfo> hash;

	public ClassInfo() {
		classNum = 0;
		hash= new HashMap<>();
	}
	public ClassInfo(int classNum) {
		this.classNum = classNum;
		this.hash= new HashMap<>();
	}
	
	

	public int getClassNum() {
		return classNum;
	}
	public void setClassNum(int classNum) {
		this.classNum = classNum;
		hash = new HashMap<>();
	}
	public HashMap<Integer,StudentInfo> getHash() {
		return hash;
	}

	public HashMap<Integer,StudentInfo> getMapStudent() {return hash;}
}

-ScoreInfo

import java.util.Scanner;

//0o
public class Score {

	 
		private int kor;
		private int eng;
		private int mat;
		private int sum;
		private int avg;
		
		public Score() {
		
			kor = 0;
			eng = 0;
			mat = 0;
			sum = 0;
			avg = 0;
		}
		public Score( int kor, int eng, int mat) {
		
			this.kor =  kor;
			this.eng =  eng;
			this.mat =  mat;
			this.setSumAvg();
		}
		public void setScore(int kor, int eng,int mat) {
			this.kor =  kor;
			this.eng =  eng;
			this.mat =  mat;
			this.setSumAvg();
		}
	
		public void scScore(Scanner sc) {
			System.out.println("점수를 입력합니다.");
			System.out.print("국어 : ");
			setKor(sc.nextInt());
			System.out.print("영어 : ");
			setEng(sc.nextInt());
			System.out.print("수학 : ");
			setMat(sc.nextInt());
		}
		public void setSumAvg() {
			sum = kor+eng+mat;
			avg = sum/3;
		}
		public void printScore() {
			System.out.println("국어점수: "+kor);
			System.out.println("영어점수: "+eng);
			System.out.println("수학점수: "+mat);
			System.out.println("총 점수: "+sum);
			System.out.println("평균점수: "+avg);
		}
		public int getKor() {
			return kor;
		}
		public void setKor(int kor) {
			this.kor = kor;
		}
		public int getEng() {
			return eng;
		}
		public void setEng(int eng) {
			this.eng = eng;
		}
		public int getMat() {
			return mat;
		}
		public void setMat(int mat) {
			this.mat = mat;
		}
		public int getTotal() {
			return sum;
		}
		
		public int getAvg() {
			return avg;
		}
		
		

	
	
}

데이터 관리 클래스

-Admin

import java.util.HashMap;
import java.util.Scanner;
import java.util.Iterator;

//데이터 관리클래스
public abstract class Admin {
	protected HashMap<Integer, ClassInfo> hashClass;

	// 검색된 student를 저장할 변수
		protected StudentInfo stuInfo;
		// 검색된 class를 저장할 변수
		protected ClassInfo claInfo;
		// class Key 값을 위한 카운트
		protected int classCnt;

	public Admin(HashMap<Integer,ClassInfo> hashClass) {

		this.hashClass = hashClass;
	}
	public boolean searchOneStu(int studentNum) {
		for(int i = 0;i<hashClass.size();i++) {
			claInfo = hashClass.get(i);//검색된 클래스에 저장할변수 = 
			//학번에 맞는 학생이 이반에 있다면 
			if(claInfo.getMapStudent().containsKey(studentNum)) {
				stuInfo = claInfo.getMapStudent().get(studentNum);
				return true;
			}
		}
		return false;
	}
	// 한 학생의 정보 출력
		public void printOneStu() {
			stuInfo.printInfo();
		}
		
		// 한 학생 클래스 getter
		public StudentInfo getOnestu() {
			return stuInfo;
		}
}

-Teacher

import java.util.HashMap;
import java.util.Scanner;
//0o
//관리클래스 교사버전
public abstract class Teacher extends Admin{

	public Teacher(HashMap<Integer,ClassInfo> hashClass) {
		super(hashClass);
	}
	
	//추상메서드
	
	//등록
	public abstract void register(Scanner sc);
	//검색
	public abstract void search(Scanner sc);
	//수정
	public abstract void modify(Scanner sc);
	//삭제
	public abstract void remove();
	//출력
	public abstract void print(Scanner sc);

	
	
	//상속받은메서드
	//한학생의 정보출력
	//한학생의 정보검색
	//한학생클래스 getter
}

-AllStudentforTeacher

import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;

//전체학생관리클래스O
public class AllStudentforTeacher extends Teacher {

	
	public AllStudentforTeacher(HashMap<Integer, ClassInfo> hashClass) {
		super(hashClass);
	}
	@Override
	public  void register(Scanner sc) {
		System.out.println("다른단위로 해주세요");
	}
	
	//검색
	@Override
	public  void search(Scanner sc) {
		System.out.println("다른단위로 해주세요");
	}
	//수정
	@Override
	public  void modify(Scanner sc) {
		System.out.println("다른단위로 해주세요");
	}
	//삭제
	@Override
	public  void remove() {
		System.out.println("다른단위로 해주세요");
	}
	//출력
	@Override
	public  void print(Scanner sc) {
		System.out.println("클래스를 출력합니다.");
	
		for(int i=0;i<hashClass.size();i++) {
		claInfo = hashClass.get(i);
		
		for(Integer intt:claInfo.getMapStudent().keySet()) {
			stuInfo = claInfo.getMapStudent().get(intt);
			stuInfo.printInfo();
		}
		}
	}
	
	
    
}

-ClassStudentforTeacher

import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;

//반학생 관리 클래스 for teacherO
public  class ClassStudentforTeacher extends Teacher{


	public ClassStudentforTeacher(HashMap<Integer,ClassInfo> hashClass) {
		super(hashClass);
	}
	@Override
	public  void register(Scanner sc) {
		
		hashClass.put(classCnt, new ClassInfo(hashClass.size()));
		System.out.println(hashClass.size()-1+"반 등록 완료");
		classCnt ++;
	}
	
	//검색
	@Override
	public  void search(Scanner sc) {
		int classNum;
		int i;
		while(true) {
			System.out.println("검색할 class 번호를 입력하세요.");
			classNum = sc.nextInt();
			
			if(hashClass.containsKey(classNum)) {
				claInfo = hashClass.get(classNum);
			}
			
			else {
				System.out.println("해당 반은 없습니다.");
			}
		}
	}
	//수정
	@Override
	public  void modify(Scanner sc) {
		Score score = new Score();
		System.out.println("class내의 모든학생점수를 수정합니다");
		/*while(iteratorClass.hasNext()) {
			score.setScore(sc.nextInt(),sc.nextInt(),sc.nextInt());
			stuInfo.setScore(score);
		}*/
		for(Integer intt : claInfo.getMapStudent().keySet()) {
			stuInfo = claInfo.getMapStudent().get(intt);
			
			System.out.println(stuInfo.getStudentName());
			
			score.scScore(sc);
			stuInfo.setScore(score);
			System.out.println();
			
		}
	}
	//삭제
	@Override
	public  void remove() {
		//Key값을 이용해 삭제 
		claInfo.getMapStudent().remove(claInfo.getClassNum());
		System.out.println("삭제했습니다");
	}
	//출력
	@Override
	public  void print(Scanner sc) {
		while(true) {
		System.out.println("클래스를 출력합니다.");
		System.out.println("1.전체 2.이름 / 학번");
		int num = sc.nextInt();
		
		//모든학생정보출력
		if(num==1) {
			
			for(Integer intt:claInfo.getMapStudent().keySet()) {
				stuInfo = claInfo.getMapStudent().get(intt);
				stuInfo.printInfo();
			}
			
		}
		else if(num == 2) {
			
			for(Integer intt:claInfo.getMapStudent().keySet()) {
				stuInfo = claInfo.getMapStudent().get(intt);
				stuInfo.printNameNum();
			}
		}
		else {
			System.out.println("잘못된 입력입니다");
			continue;
		}
		break;
	}
	
	}
    
	
}

-EachStudentforTeacher

import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;
//O
public class EachStudentforTeacher extends Teacher {
	public EachStudentforTeacher(HashMap<Integer, ClassInfo> hashClass) {
		super(hashClass);
	}
	@Override
	public  void register(Scanner sc) {
		
			int classNum;
			int i;
			while(true) {
				System.out.println("검색할 class 번호를 입력하세요.");
				classNum = sc.nextInt();
					if(hashClass.containsKey(classNum)) {
						
					}
					else {
						System.out.println("해당 반은 없습니다.");
						continue;
					}
				
				break;
			}
			System.out.println("등록할 학생정보 입력");
			Score score = new Score();
			String name = new String();
			int num;
			System.out.print("이름을 입력하세요:");
			name = sc.next();
			System.out.print("학번을 입력하세요:");
			num = sc.nextInt();
			System.out.print("점수를 입력하세요:");
			score.setScore(sc.nextInt(), sc.nextInt(), sc.nextInt());
			
			//등록하기
			claInfo.getMapStudent().get(num).setInfo(name,score,num);
			
		
	}
	
	//검색
	@Override
	public  void search(Scanner sc) {
		while(true) {
		System.out.println("검색할 학생의 학번을 입력해주세요");
		if(searchOneStu(sc.nextInt()))break;
		else {
			System.out.println("다시");
			continue;
		}
		}
	}
	//수정
	@Override
	public  void modify(Scanner sc) {
		System.out.println("다시등록합니다");
		Score score = new Score();
		System.out.println(stuInfo.getStudentName()+"학생의 점수를 수정합니다");
		score.scScore(sc);
		stuInfo.setScore(score);
	}
	//삭제
	@Override
	public  void remove() {
		//학번으로 삭제
		claInfo.getMapStudent().remove(stuInfo.getStudentNum());
		System.out.println("삭제되었습니다");
	}
	//출력
	@Override
	public  void print(Scanner sc) {
	     printOneStu();
	}


}

-StudentforAdmin

// 학생데이터 관리클래스o
import java.util.HashMap;


public class StudentforAdmin extends Admin{



	public StudentforAdmin(HashMap<Integer, ClassInfo> hashClass) {
		super(hashClass);
	}



}

-Login

//0
public class Login {
	
	String id;
	int pw;
	public Login() {
		id = new String();
		pw=0;
	}
	public Login(String id, int pw) {
		this.id = id;
		this.pw = pw;
	}
	
	//getter/ setter
	public String getId() {return id;}
	public void setId (String id) {this.id = id;}
	public int getPw() {return pw;}
	public void setPw(int pw) {this.pw = pw;}
	public void setIdPw(String id, int pw) {
		this.id = id;
		this.pw=pw;
	}
	public Login getIdPw() {
		return this;
	}
}