-- 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; // 필수 과목 학점 산출 정책
}