✏️ 0507
팀 프로젝트
3시 심화반
팀 프로젝트
- 맡은 역할
- 특정 과목 회차별 등급 조회 (필수) ✔️
- 상태별 수강생 조회 (추가)
팀원분들이 다들 잘하셔서 필수 항목 중에서 가장 늦게 제출했다 큐ㅠ
기존 탬플릿의 이용해서 하다보니 코드 구성을 확인해야 했고 다른 팀원들의 코드가 추가되면서
그에 대한 코드 해석과 변경된 사항을 확인하고 코드를 작성하다 보니 생각보다 오래 걸렸다
그리고 가장 오래 걸린 건 내가 맡은 코드의 로직 구상이었다
처음에 생각나는대로 코드를 써내렸는데 코드가 너무 길어졌다
// 입력한 학생이 존재하지 않을 경우 종료
boolean flag = false; // 학생의 점수가 등록 되었는지 판단
for (Score score : scoreStore){
if (!score.getStudentId().equals(studentId)){
flag = true;
break;
}
} if (!flag) {
System.out.println("해당 학생은 등록되어 있지 않거나 등급(점수)가 등록되어 있지 않습니다\n다시 시도해주세요");
return;
}
처음에는 점수 관련 정보를 저장하는 scoreStore 컬렉션을 가져와서 해당 학생 ID가 존재하는지 확인하고
있으면 true를 반환하고 반복문 종료, 없으면 반복문은 그대로 종료되고 false 값을 반전시켜 sout 코드를 실행시켜
등급 조회 메서드를 종료시키는 코드로 작성했다
코드도 길고 뭔가 깔끔한 느낌이 들지 않아서 폐기하고 비슷한 구현이 있는 다른 팀원의 코드를 보았다
public static Student getStudentByStudentId(String studentId) {
Student student = stu_list.get(studentId);
if (student != null) {
return stu_list.get(studentId);
}
return null;
}
학생 고유의 ID를 받아서 학생 리스트에 검색해서 찾아 반환하는 메서드이다
있으면 학생 ID를 그대로 반환하고 없으면 null 을 반환한다
Student student = StudentManage.getStudentByStudentId(studentId);
if (student == null) {
System.out.println("해당 학생은 등록되어 있지 않거나 등급(점수)가 등록되어 있지 않습니다\n다시 시도해주세요");
return;
}
해당 코드를 이용해서 확 줄여버릴 수 있었다
학생이 신청한 과목을 불러오는 코드가 구현되어 있어서 편하게 사용할 수 있었다
이제 입력값을 받고 그에 대한 데이터를 출력해야 하는데
한꺼번에 하려고 하니 코드가 엉망이 되어서 자꾸 오류가 났다
빨간 글씨는 아닌데
저장된 데이터가 없다고 하거나 선택한 적 없는 과목에 대한 정보가 나오거나
이런 오류가 떠서 그걸 고친다고 오래 걸렸다
// 해당 학생의 고유번호가 포함하는 데이터를 찾아서 추가
List<Score> inquireScoreList = new ArrayList<>();
for (Score score : scoreStore){
if (score.getSubjectId().equals(studentId)){
inquireScoreList.add(score);
}
}
// 기능 구현 (조회할 특정 과목)
System.out.println("조회할 과목을 입력하세요: ");
String inquireSubjectName = sc.next();
System.out.println("회차별 등급을 조회합니다...");
int inquireTestCnt = sc.nextInt();
for (Score score : scoreStore) {
if (score.getStudentId().equals(studentId) && score.getSubjectId().equals(inquireSubjectName)
&& score.getTestCnt() == inquireTestCnt) {
System.out.println("회차: " + score.getTestCnt() + ", 등급: " + score.getScore());
return;
} else {
System.out.println("조회된 결과가 없습니다.");
}
}
해당 학생 ID 에 대한 데이터만 따로 가져와서 그에 대한 값을 뽑아서 출력하고 싶어서 코드를 구성해봤다
아마 미완성 코드이고 그냥 생각나는대로 주르륵 쓰다보니 뭔가 맞지 않은 코드들이 보이긴 한다
score가 아니라 가져온 컬렉션에서 데이터를 가져왔어야 했는데 이상한 곳에서 자꾸 조회하려고 하니까
다른 값이 나오고 없다고 나오고 했던 모양이다
System.out.println("조회할 과목을 입력하세요(ex: Java, 객체지향, Spring ...): ");
String inquireSubjectName = sc.next();
일단 값을 받을 때 과목 이름으로 받도록 변경했고 예시도 추가로 적어놨다
해당 학생의 수강목록의 index 값으로 한번 해보려고 했는데 잘 안되서 다른 방법으로 접근해봤다
public static String findSubjectIdBySubjectName(Student student, String subjectName) {
List<Subject> subjectList = student.getSubjectList();
for (Subject subject : subjectList) {
if (subject.getSubjectName().equals(subjectName)) {
return subject.getSubjectId();
}
}
return null;
}
그리고 받은 과목 이름을 subjectList 에서 일치하는 값의 과목 ID로 바꿔주는 메서드도 하나 만들었다
과목 이름을 받아서 조회하려고 하니 name 이 아닌 id 값으로 리스트에 저장된게 있어서 변경하게 되었다
그리고 조건 중에 필수과목과 선택과목 유형은 점수별 등급이 달라서 과목 유형도 받아와야 했다
public static String subjectNameToType(String subjectName) {
for (SubjectList subject : SubjectList.values()) {
if (subject.name.equals(subjectName)) {
return subject.type;
}
}
return null;
}
해당 코드도 과목이름을 받아와서 해당 유형을 가져와주는 코드로 구현했다
// 특정 과목의 회차별 등급 조회 구현
List<Score> scores = student.getScoresBySubjectId(subjectId);
System.out.println(student.getStudentName() + " 학생의 [" + student.findSubjectBySubjectId(subjectId).getSubjectName() +"] 과목의 회차별 등급");
for (Score score : scores) {
if (score.getTestCnt() == inquireTestCnt && subjectType!= null) {
System.out.println(score.getTestCnt() + " 회차 => 등급: " + score.calculationGrade(subjectType,score.getScore()));
return;
} else {
System.out.println("해당 회차에 대한 점수는 등록되어있지 않습니다");
}
}
그렇게 최종적으로 완성하게 된 등급 조회 코드이다
처음 구상했었던 내용보다는 추가적으로 확인해야할 상황이 많아져서 코드가 길어졌지만
구성하던 대로 코드가 실행되고 잘 조회되는 모습 확인했다🫠
+) 점수별 등급 조회 코드
public static String calculationGrade(String subjectType, int score) {
String grade = "";
switch (subjectType) {
case "MANDATORY":
if (score >= 95) {
grade = "A";
} else if (score >= 90) {
grade = "B";
} else if (score >= 80) {
grade = "C";
} else if (score >= 70) {
grade = "D";
} else if (score >= 60) {
grade = "F";
} else {
grade = "N";
}
break;
case "CHOICE":
if (score >= 90) {
grade = "A";
} else if (score >= 80) {
grade = "B";
} else if (score >= 70) {
grade = "C";
} else if (score >= 60) {
grade = "D";
} else if (score >= 50) {
grade = "F";
} else {
grade = "N";
}
break;
}
return grade;
}
단순하게 switch 문으로 작성해서 등급을 반환했는데 팀원분이 더 간단한 코드를 찾아서 알려주셨다
public String calculateGrade() {
int[] mandatoryRange = {95, 90, 80, 70, 60};
int[] choiceRange = {90, 80, 70, 60, 50};
int[] currentType = Objects.equals(Subject.SUBJECT_TYPE_MANDATORY, subject.getSubjectType())
? mandatoryRange
: choiceRange;
if (score >= currentType[0]) {
return "A";
} else if (score >= currentType[1]) {
return "B";
} else if (score >= currentType[2]) {
return "C";
} else if (score >= currentType[3]) {
return "D";
} else if (score >= currentType[4]) {
return "F";
} else {
return "N";
}
}
팀원분도 다른 분꺼 보고 가져왔다고 하셨는데 진짜 이거 작성하신 분 엄청 멋지다...👍👍👍
나도 이런 코드를 작성할 수 있는 사람이 되고 싶다..!!
회고
구현할 코드를 나눠서 작성하니까 선행되어야 할 코드가 있다는 걸 알았다!
등록이 일단 되어야 뒤에 코드들을 작성해서 검사해볼 수 있었다
없어도 되는걸까?
오늘 안에는 필수항목을 완성하고 싶었는데 다행이었고...
그런데 완성해서 다시 보면 또 수정해야할 것들 산더미 인 것 같다
등급 조회는 내가 작성한 코드보다 훨씬 간단하게 할 수 있을 것 같았는데
뭔가 하다보니 코드가 길어지고 많아져서 어라? 싶었다
아직 코드 구현력과 해석이 안되는 것 같다..ㅜㅜ
기본기가 아직 많이 부족한 것 같다!!
'개발 일지 > TIL' 카테고리의 다른 글
[ #18 ] TIL (0) | 2024.05.09 |
---|---|
[ #17 ] TIL (0) | 2024.05.08 |
[ #15 ] TIL (0) | 2024.05.07 |
[ #14 ] TIL (0) | 2024.05.02 |
[ #13 ] TIL (개인과제 Level 2) (1) | 2024.05.01 |