코딩을 하다보면 특정 데이터를 한 자료구조 내에서 Search할 일이 상당히 자주있다. 나는 데이터크기가 그렇게 크지 않으면 그냥 순회하는 식으로 해결해왔는데, 그걸 선호하지 않는 팀원분들이 과반이었다.. 그래서 그냥 리스트나 배열로 해결하자는 내 의견대신, Map을 기초 자료구조로 써서 빌드업 해왔는데, 상당히 많이 배워가고 있다.
오늘도 비슷한 일이 있었는데,
(결론만 얘기하면) 기존에 짜놓은 로직으로는 스코어 객체에 접근할 때 순회하는 방식으로만 접근가능했어서, 사진엔 나오지않지만 이미 같은 for문을 위에서 썼기에, 단순 Search만을 위해서 굳이 반복문을 한번 더 돌려야하는게 찝찝하지만.. 일단 팀원분들께 컨펌 받으려고 공유를 했다.
어? 그러면 갈아엎죠?
(아니 그냥 내꺼 쓰면 안되나 잘 구현되는데ㅠㅠ)그렇게 시작되었다 나의 코드갈아엎기
while (true) {
subjectName = sc.next();
boolean isOpenSubject = false;
boolean isSetSubject = false;
for (Subject subject : CampManagementApplication.getSubjectStore()) {
if (subject.getSubjectName().equals(subjectName)) { //입력한 과목이 개강한 강의일 경우
isOpenSubject = true;
if (student.getSubjectScores().containsKey(subject)) { // 입력한 과목이 해당 학생이 수강중인 강의일 경우
isSetSubject = true;
}
}
}
if (isOpenSubject) {//존재하지 않는 강의면 아래로 진입불가
if (isSetSubject) { //존재하는 강의지만, 신청하지 않은 강의이면 아래로 진입불가
for (Map.Entry<Subject, List<Score>> entry : student.getSubjectScores().entrySet()) { //해당 과목 시험을 10회 다 치뤘는지 확인하러 스코어 객체에있는 회차 부르러 가는 코드
Subject subject = entry.getKey();
if (subject.getSubjectName().equals(subjectName)) {
List<Score> scores = entry.getValue();
if (scores.size() == 10) {
System.out.println("이미 시험을 10회차 치른 과목입니다.");
return; // setScore 메소드 자체를 빠져나옴
}
}
}
break;
} else {
System.out.println("미수강 강의입니다. 입력을 다시 확인해주세요.");
}
} else {
System.out.println("존재하지 않는 과목입니다. 입력을 다시 확인해주세요.");
}
}
while (true) {
//과목번호를 통해 과목 입력받기.
while (true) {
System.out.println("과목번호를 입력하세요");
try { //숫자만 받도록 예외처리
subjectNumber = sc.nextInt();
if (subjectNumber < 1 || subjectNumber > 9) System.out.println("잘못된 입력입니다. 범위 내 값을 입력해주세요(1~9)");
else break;
} catch (InputMismatchException e) {
System.out.println("입력오류: 숫자만 입력해주세요.");
sc.next();
}
}
enterdSubject = subjectStore.get(subjectNumber - 1);
//수강한 과목인지 확인
if (student.getSubjectScores().containsKey(enterdSubject)) {
if (student.getSubjectScores().get(enterdSubject).size() == 10) { //이미 10회를 치른 시험인지 확인
System.out.println("이미 10회 시험을 치른 과목입니다.");
return; //메소드 종료
} else {
// 해당 과목 시험 회차 입력하기
(놀랍게도 before는 아직 회차입력 구간 진입도 못했다)
Score score = new Score(subjectScore, subjectRound);
for (Subject subject : CampManagementApplication.getSubjectStore()) {
if (subject.getSubjectName().equals(subjectName)) { //입력한 과목이 개강한 강의일 경우
if (student.getSubjectScores().containsKey(subject)) { // 입력한 과목이 해당 학생이 수강중인 강의일 경우
student.getSubjectScores().get(subject).add(score);
}
}
}
Score score = new Score(subjectScore, subjectRound);
student.getSubjectScores().get(enterdSubject).add(score);
팀원분들중에 잘하는 분들이 많이 계셔서 지식적으로도 배우고 있지만, 마인드적인 부분을 많이 배우고있다. 좀더 나은 방법이 있을것 같음에도 구현을 위주로 코딩하는 나와 달리, 어떻게든 더 효율적인 코드흐름(로직)을 끝끝내 찾아서 코딩소스를 개선하는 모습이 정말 방망이 깎는 노인들같아보였다. 코딩 장인정신이랄까? 그런 순간들이 모여서 실력이 오르는 것이기에 나도 그런 노력을 꼭 해야겠다고 생각했다.