JAVA 프로젝트 (2) : 학점산출 프로그램

찌니·2022년 1월 16일
0

JAVA

목록 보기
2/2

- 학점 산출 프로그램

-- Pakage와 class 정리

1) grade
-BasicEvaluation

// 일반 과목 학점 정책 클래스
public class BasicEvaluation implements GradeEvaluation {

	@Override
	public String getGrade(int point) {
		String grade;
	
	if(point >= 90 && point <=100)
		grade = "A";
	else if(point >=80)
		grade = "B";
	else if(point >= 70)
		grade = "C";
	else if(point >= 55)
		grade = "D";
	else
		grade = "F";
	return grade;
  }
}

-GradeEvaluation

// 점수에 따른 학점을 평가하는 방법은 여러가지 있을 수 있음
// 여러 산출 방법 클래스가 구현할 내용을 인터페이스로 정의
public interface GradeEvaluation {
	public String getGrade(int point);
}

// getGrade() 메서드: 점수가 있으면 그 점수에 따른 
-학점을 문자열로 반환
// 필수과목 vs 일반과목  -> 학점 산출

-MajorEvaluation

// 필수 과목 학점 정책 클래스
// 인터페이스를 모두 생성해야 하기 때문에 implements사용
public class MajorEvaluation implements GradeEvaluation {

	@Override
	public String getGrade(int point) {
		String grade;
		if(point >= 95 && point<= 100)
			grade="S";
		else if(point >= 90)
			grade= new String("A");
		else if(point >= 80)
			grade="B";
		else if(point >= 70)
			grade="C";
		else if(point >= 60)
			grade="D";
		else
			grade = "F";
		return grade;
	}
	
}

-PassFailEvaluation

public class PassFailEvaluation implements GradeEvaluation {

	@Override
	public String getGrade(int point) {
		if (point >= 70 && point <= 100) 
			return "P";
		else
		    return "F";
	}

}

2) school
-School

// 학교에서는 학생이 등록을 하고 과목 개설 , 학생이 해당 과목에 수강 신청 함
// 테이스 테이터 직접 생성, 이를 콘솔 창에서 확인

import java.util.ArrayList;

public class School {
	private static School instance = new School();
	
	private static String SHOOL_NAME = "Good School";
	private ArrayList<Student> studentList = new ArrayList<Student>(); // 등록된 학생
	private ArrayList<Subject> subjectList = new ArrayList<Subject>(); // 과목 리스트
	
	private School() {}
	
	public static School getInstance() {
		if(instance == null)
			instance = new School();
		return instance;
	}
	
	public ArrayList<Student> getStudentList(){
		return studentList;
	}

	public void addStudent(Student student) {
		studentList.add(student);
	}
	
	public void addSubject(Subject subject) {
		subjectList.add(subject);
	}
	
	public ArrayList<Subject> getSubjectList(){
		return subjectList;
	}
	
	public void setSubjectList(ArrayList<Subject> subjectList) {
		this.subjectList = subjectList;
	}
	
}

-Score

public class Score {
	// 점수 클래스는 ' 어느 학생의 어느 과목 점수가 몇 점이다'를 구현
	// 속성 -> 학번, 과목, 점수 값
	int studentId; // 학번
	Subject subject; // 과목
	int point; // 점수
	
	public Score(int studentId, Subject subject, int point) {
		super();
		this.studentId = studentId;
		this.subject = subject;
		this.point = point;
	}

	public int getStudentId() {
		return studentId;
	}

	public void setStudentId(int studentId) {
		this.studentId = studentId;
	}

	public Subject getSubject() {
		return subject;
	}

	public void setSubject(Subject subject) {
		this.subject = subject;
	}

	public int getPoint() {
		return point;
	}

	public void setPoint(int point) {
		this.point = point;
	}

	@Override
	public String toString() {
		return "학번 :" +studentId+ "," + subject.getSubjectName() + ":" + point ;
	}
	// 이름 : 학번 : 종점 과목 : 점수
}

-Student

import java.util.ArrayList;

public class Student {
	// 학생 글래스는 이름, 학번, 필수 과목과 자신이 수강하는 과목의 점수 리스트를 속성으로 가짐
	// 점수 리스트는 배열로 관리 -> ArrayList  사용
	private int studentId;   //학번
	private String studentName;  // 이름
	private Subject majorSubject;  //필수 과목
	
	private ArrayList<Score> scoreList = new ArrayList<Score>();
	
	// 학생이 수강한 과목의 점수 리스트, addSubjectScore() 메서드 호출되면 이 리스트에 추가됨
	public Student(int studentId, String studentName, Subject majorSubject) {
		this.studentId = studentId;
		this.studentName = studentName;
		this.majorSubject = majorSubject ;
	}
	
	public void addSubjectScore(Score score ) {
		scoreList.add(score);
	}
	
	// getter, setter , Field 생성 
	public int getStudentId() {
		return studentId;
	}

	public void setStudentId(int studentId) {
		this.studentId = studentId;
	}

	public String getStudentName() {
		return studentName;
	}

	public void setStudentName(String studentName) {
		this.studentName = studentName;
	}

	public Subject getMajorSubject() {
		return majorSubject;
	}

	public void setMajorSubject(Subject majorSubject) {
		this.majorSubject = majorSubject;
	}

	public ArrayList<Score> getScoreList() {
		return scoreList;
	}

	public void setScoreList(ArrayList<Score> scoreList) {
		this.scoreList = scoreList;
	}

}

-Subject

import java.util.ArrayList;

import utils.Define; // 과목 전반에서 사용하는 상수 클래스

public class Subject {
	// 과목의 속성을 생각해보면
	// 과목 이름, 과목 고유 번호, 그리고 수강 신청한 학생 리스트
	private String subjectName; // 과목 이름
	private int subjectId; // 과목 고유 번호
	private int gradeType;  // 학점 평가 정책
	
	// 학생의 정보를 가져오는 것
	// 이 과목을 수강 신청한 학생 리스트
	// register() 메서드를 호출하면 이 리스트에 추가됨
	private ArrayList<Student> studentList = new ArrayList<Student>();

	public Subject(String subjectName, int subjectId) {
		this.subjectName = subjectName;
		this.subjectId = subjectId;
		this.gradeType = Define.AB_TYPE;  // 학점 평가 정책은 기본으로 A,B 방식 사용
	}

	public String getSubjectName() {
		return subjectName;
	}

	public void setSubjectName(String subjectName) {
		this.subjectName = subjectName;
	}

	public int getSubjectId() {
		return subjectId;
	}

	public void setSubjectId(int subjectId) {
		this.subjectId = subjectId;
	}
	
	public ArrayList<Student> getStudentList() { //학생 정보를 리스트로 불러옴
		return studentList ;
	}
	
	public int getGradeType() {
		return gradeType;
	}

	public void setGradeType(int gradeType) {
		this.gradeType = gradeType;
	}
	
	// 수강신청 메서드
	public void register(Student student) {
		studentList.add(student);
	}
}

3) school.report
-GenerateGradeReport

import java.util.ArrayList;



import grade.BasicEvaluation;
import grade.GradeEvaluation;
import grade.MajorEvaluation;
import school.School;
import school.Score;
import school.Student;
import school.Subject;
import utils.Define;

public class GenerateGradeReport {
// 리포트 프로그램은 매우 많은 양을 차지
		School school = School.getInstance();
		public static final String TITLE = " 수강생 학점 \t\t\n";
		public static final String HEADER = " 이름 | 학번 | 필수과목 | 점수";
		public static final String LINE = " -------------------------------\n";
		private static final Subject subject = null; 
		
		private StringBuffer buffer = new StringBuffer();
		
		public String getReport() {
			ArrayList<Subject> subjectList = school.getSubjectList();
			
			for(Subject subject : subjectList) {
				makeHeader(subject);
				makeBody(subject);
				makeFooter();
			}
			return buffer.toString(); // String으로 반환
	}

		private void makeHeader(Subject subject) {
			buffer.append(GenerateGradeReport.LINE);
			buffer.append("\t" + subject.getSubjectName());
			buffer.append(GenerateGradeReport.TITLE);
			buffer.append(GenerateGradeReport.HEADER);
			buffer.append(GenerateGradeReport.LINE);
		}

		private void makeBody(Subject subject) {
			ArrayList<Student> studentList = subject.getStudentList();
			
			for(int i = 0; i< studentList.size(); i++) {
				Student student = studentList.get(i);
				buffer.append(student.getStudentName());
				buffer.append("|");
				buffer.append(student.getStudentId());
				buffer.append("|");
				buffer.append(student.getMajorSubject().getSubjectName() + "\t");
				buffer.append("|");
				
				getScoreGrade(student, subject.getSubjectId()); // 학생별 수강 과목 학점 계산
				
				buffer.append("\n");
				buffer.append(LINE);
			}
		}
		public void getScoreGrade(Student student, int subjectId) {
			ArrayList<Score> scoreList = student.getScoreList();
			int majorId = student.getMajorSubject().getSubjectId();
			
			//리포트 생성하는 코드의 학점 평가 정책 인스턴스 배열에  PassFailEvaluation 인스턴스 추가
			//정책이 PF인 경우 getGrade() 메서드 호출
			GradeEvaluation[ ] gradeEvaluation = {new BasicEvaluation(), new MajorEvaluation()}; 
			// 학점 평가 클래스
			
			for (int i = 0; i < scoreList.size(); i++) {
				Score score = scoreList.get(i);
				if(score.getSubject().getSubjectId() == subjectId) { // 학점 산출할 과목
					String grade;
					//if(subject.getGradeType()==Define.PF_TYPE) { //pass/fail 방식
					//	grade = gradeEvaluation[Define.PF_TYPE].getGrade(score.getPoint());
					if(score.getSubject().getSubjectId() == majorId) // 필수 과목
						grade = gradeEvaluation[Define.SAB_TYPE].getGrade(score.getPoint());
					else // 일반 과목일 경우
						grade = gradeEvaluation[Define.AB_TYPE].getGrade(score.getPoint());
					
					buffer.append(score.getPoint());
					buffer.append(":");
					buffer.append(grade);
					buffer.append("|");
					}
				}
			}
		public void makeFooter() {
			buffer.append("\n");	
		}
}

4) test
-TestMain

import school.School;
import school.Score;
import school.Student;
import school.Subject;
import school.report.GenerateGradeReport;
import utils.Define;

// 학생, 과목, 점수 등을 각각 생성하고 리포트 클래스를 생성하여 성적과 학점 출력	
public class TestMain {
	School goodSchool = School.getInstance();
	Subject korean;
	Subject math;
	//Subject dance;
	
	
	GenerateGradeReport gradeReport = new GenerateGradeReport();
	
	public static void main(String [] args) {
		TestMain test = new TestMain();
		
		test.createSubject();
		test.createStudent();
		
		String report = test.gradeReport.getReport(); // 성적 결과 생성
		System.out.println(report);
	}
	public void createSubject() {  // 테스트 과목 생성
		korean = new Subject("국어", Define.KOREAN);
		math = new Subject("수학", Define.MATH);
		//dance =new Subject("방송 댄스", Define.DANCE );
		
		//dance.setGradeType(Define.PF_TYPE);
		
		goodSchool.addSubject(korean);
		goodSchool.addSubject(math);
		//goodSchool.addSubject(dance);
		
	}

	public void createStudent() { // 테스트 학생 생성
		Student student1 = new Student(181213, "옥택연", korean);
		Student student2 = new Student(181518, "장우영", math);
		Student student3 = new Student(171230, "황찬성", korean);
		Student student4 = new Student(171255, "이준호", korean);
		Student student5 = new Student(171590, "이준수", math);
		
		// goodSchool에 학생 추가
		goodSchool.addStudent(student1);
		goodSchool.addStudent(student2);
		goodSchool.addStudent(student3);
		goodSchool.addStudent(student4);
		goodSchool.addStudent(student5);
		
		// 국어 과목을 수강하는 학생 등록
		korean.register(student1);
		korean.register(student2);
		korean.register(student3);
		korean.register(student4);
		korean.register(student5);
		
		//수학 과목을 수강하는 학생 등록
		math.register(student1);
		math.register(student2);
		math.register(student3);
		math.register(student4);
		math.register(student5);
		
		// dance 과목을 수강하는 학생 등록
		//dance.register(student1);
		//dance.register(student2);
		//dance.register(student3);
		
		// 각 학생의 과목 점수 추가
		addScoreForStudent(student1, korean, 95);
		addScoreForStudent(student1, math, 56);
		//addScoreForStudent(student1,dance, 95);
		
		addScoreForStudent(student2, korean, 95);
		addScoreForStudent(student2, math, 95);
		//addScoreForStudent(student2, dance, 85);
		
		
		addScoreForStudent(student3, korean, 100);
		addScoreForStudent(student3, math, 88);
		//addScoreForStudent(student3, dance, 55);
		
		addScoreForStudent(student4, korean, 89);
		addScoreForStudent(student4, math, 95);
		
		addScoreForStudent(student5, korean, 85);
		addScoreForStudent(student5, math, 56);
	}
	
	// 과목별 점수를 추가하는 메서드
	public void addScoreForStudent(Student student, Subject subject, int point) {
		Score score = new Score(student.getStudentId(), subject, point);
		student.addSubjectScore(score);
	}
}

5) utils
-Define

public class Define {
	// 프로그램 전반에서 사용하는 상수 값 정의
	// public static final로 상수 선언
	public static final int KOREAN = 1001;  // 국어
	public static final int MATH = 2001;  // 수학
	
	
	public static final int AB_TYPE = 0;  // 일반 과목 학점 산출 정책
	public static final int SAB_TYPE = 1;  // 필수 과목 학점 산출 정책
}

0개의 댓글