팀 프로젝트 2일차 나누어진 역할에 맡아서 팀원들과 기능을 구현하는 시간을 가졌다.
프로젝트의 필수 요구 사항 부분이 모두 갖춰져서 추가 요구 사항 중 하나인 수강생의 상태를 추가하는 부분을 만들어 보았다.
// 상태 종류 추가
while (true) {
System.out.print("상태 종류를 선택하세요: 1) Green, 2) Red, 3) Yellow");
int color = sc.nextInt();
if (color == 1) {
student.setColors("Green");
break;
} else if (color == 2) {
student.setColors("Red");
break;
} else if (color == 3) {
student.setColors("Yellow");
} else {
System.out.println("잘못된 입력입니다.");
}
}
수강생의 상태를 추가해주기 위해서 while
문을 통해서 반복적으로 이용되도록 하고 if
문을 통해서 사용자가 입력한 숫자에 의해서 원하는 상태가 추가되도록 기능을 구현하였다.
Student Class
public class Student {
private String colors;
public void setColors(String colors) {
this.colors = colors;
}
public String getColors() {
return colors;
}
Student 클래스에서 상태colors
를 가져다 쓰기 위해서 상태 객체를 만들어주고 getter
와 setter
를 이용해주었다.
git hub
https://github.com/taehyeokNam/studentManagement/commit/82791062eecc8dc2e4ff8840ed6ab6fc78f819e5
수강생의 등록된 정보 중 (고유 번호,이름,상태,등록한 과목)
이 조회되는 기능을 구현하는 요구 사항을 수행해 보았다.
// 수강생 목록 조회
private static void inquireStudent() {
System.out.println("\n수강생 목록을 조회합니다...");
// 기능 구현
for (Student student : studentStore) {
System.out.println("ID: " + student.getStudentId() + " 이름: " + student.getStudentName());
System.out.println("이름: " + student.getStudentName());
System.out.println("상태: " + student.getColors());
System.out.println("선택한 과목명 :" + student.getStudentSubjectArr().toString());
}
System.out.println("\n수강생 목록 조회 성공!");
}
for each
문을 활용하여 수강생이 등록된 리스트를 순회하면서 학생에 상태를 조회하는 기능이 수행되도록 하였다.
과목명을 조회할 때 주소값이 아닌 과목명이 출력되도록 하기 위해서 .toString()
을 이용하였지만, 과목명이 아닌 주소값이 출력되는 문제가 발생하였다.
public String toString() {
return subjectName + "(" + subjectType + ")";
}
해결 방법은 Subject
클래스에 문자열 타입에 toString()
메서드를 추가해 주는 것이였다!!
git hub
https://github.com/taehyeokNam/studentManagement/commit/20867e7a0b98ea883a027c98e95a34edbd5dab27
수강생의 정보중 고유번호를 조회하여 (이름, 과목명) 을 수정하는 기능을 구현하는 과정을 진행하였다.
private static void updateSubjects(Student student, String subjectType) { // 두개의 객체를 받아서 실행
List<Subject> subjects = subjectType.equals(SUBJECT_TYPE_MANDATORY) ? getMandatorySubjects() : getChoiceSubjects();
//subjectType이 SUBJECT_TYPE_MANDATORY 와 같으면 필수 과목 아니면 선택과목을 리스트에 저장
List<Subject> currentSubjects = student.getStudentSubjectArr(); // 학생이 선택한 과목을 리스트에 저장
List<Subject> updatedSubject = new ArrayList<>();
System.out.println("현재 선택된 과목: " + currentSubjects);
System.out.println(subjectType + " 과목 목록:");
for (int i = 0; i < subjects.size(); i++) { // subjects 리스트를 순회하고 번호 1부터 출력
System.out.println((i + 1) + ". " + subjects.get(i).getSubjectName());
}
for (Subject subject : currentSubjects) {
if (subjectType.equals(SUBJECT_TYPE_MANDATORY) && !subject.getSubjectType().equals(SUBJECT_TYPE_MANDATORY)) {
updatedSubject.add(subject);
} else if (subjectType.equals(SUBJECT_TYPE_CHOICE) && !subject.getSubjectType().equals(SUBJECT_TYPE_CHOICE)) {
updatedSubject.add(subject);
}
}
currentSubjects.clear();
for (Subject newUpdatedsubject : updatedSubject) {
currentSubjects.add(newUpdatedsubject);
}
먼저 과목의 타입이 필수과목이냐 아니냐를 .equals
와 ?:
을 이용하여 과목의 타입을 나누어서 리스트에 저장되도록 하였다. 그리고 for
문을 이용해서 리스트를 순회하도록 하고 다시 for each
문에서 기존에 등록하였던 과목 목록과 새롭게 수정해서 등록한 과목이 모두 같을때 라는 조건 (기존 과목은 삭제하고 새롭게 등록한 과목만 추가)하는 조건을 만들어서 리스트에 추가되도록 기능을 구현하였다.
git hub
https://github.com/taehyeokNam/studentManagement/commit/f3918b5d76fb086c55a3a7a3f582aefa6d4fa88b
private static void editStudentInformation() {
System.out.println("수정할 수강생 고유 번호를 입력해주세요");
String studentUniqueNumber = sc.next();
Student student = (Student) studentInformation.get(studentUniqueNumber);
if (student == null) {
System.out.println("해당 고유 번호의 수강생이 존재하지 않습니다.");
return;
}
boolean editing = true;
while (editing) {
System.out.println("수정할 항목을 선택하세요:");
System.out.println("1. 이름");
System.out.println("2. 상태");
System.out.println("3. 필수과목");
System.out.println("4. 선택과목");
System.out.println("5. 수정을 완료하고 종료");
int choice = sc.nextInt();
sc.nextLine(); // consume the newline
switch (choice) {
case 1:
System.out.print("새로운 이름을 입력하세요: ");
String newName = sc.nextLine();
student.setStudentName(newName);
System.out.println("이름이 성공적으로 수정되었습니다.");
break;
case 2:
updateStatus(student);
break;
case 3:
updateSubjects(student, SUBJECT_TYPE_MANDATORY, true);
break;
case 4:
updateSubjects(student, SUBJECT_TYPE_CHOICE, false);
break;
case 5:
editing = false;
System.out.println("수정이 완료되었습니다.");
break;
default:
System.out.println("잘못된 입력입니다. 다시 선택해주세요.");
}
}
}
private static void updateStatus(Student student) {
while (true) {
System.out.print("새로운 상태를 선택하세요 (1: Green, 2: Red, 3: Yellow, 종료: 0): ");
int statusChoice = sc.nextInt();
sc.nextLine(); // consume the newline
if (statusChoice == 0) {
break;
} else {
switch (statusChoice) {
case 1:
student.setColors("Green");
System.out.println("상태가 Green으로 변경되었습니다.");
break;
case 2:
student.setColors("Red");
System.out.println("상태가 Red로 변경되었습니다.");
break;
case 3:
student.setColors("Yellow");
System.out.println("상태가 Yellow로 변경되었습니다.");
break;
default:
System.out.println("잘못된 입력입니다. 다시 선택해주세요.");
}
}
}
}
private static void updateSubjects(Student student, String subjectType, boolean isMandatory) {
List<Subject> subjects = isMandatory ? getMandatorySubjects() : getChoiceSubjects();
List<Subject> currentSubjects = student.getStudentSubjectArr();
System.out.println("현재 선택된 과목: " + currentSubjects);
System.out.println(subjectType + " 과목 목록:");
for (int i = 0; i < subjects.size(); i++) {
System.out.println((i + 1) + ". " + subjects.get(i).getSubjectName());
}
// 필수 과목들을 삭제하고 입력을 받기 위해 기존 필수 과목 제거
if (isMandatory) {
Iterator<Subject> iterator = currentSubjects.iterator(); // currentSubjects 리스트에서 Iterator를 생성한다. Iterator는 리스트를 순회하며 요소를 접근함
while (iterator.hasNext()) { // Iterator의 hasNext() 메서드를 호출하여 리스트에 다음 요소가 있는지 확인합니다. 있으면 true를 반환, 없으면 false를 반환함.
Subject subject = iterator.next(); //Iterator의 next() 메서드를 호출하여 현재 요소를 가져온다.
if (subject.getSubjectType().equals(SUBJECT_TYPE_MANDATORY)) { // Type에 SUBJECT_TYPE_MANDATORY 갔은게 있으면 true
iterator.remove(); // 해당 과목을 제거
}
}
} else {
Iterator<Subject> iterator = currentSubjects.iterator();
while (iterator.hasNext()) {
Subject subject = iterator.next();
if (subject.getSubjectType().equals(SUBJECT_TYPE_CHOICE)) {
iterator.remove();
}
}
}
while (true) {
System.out.print("추가할 과목 번호를 입력하세요 (종료: 0): ");
int subjectChoice = sc.nextInt();
if (subjectChoice > 0 && subjectChoice <= subjects.size()) { // 번호가 0보다 크고과목에 수 보다 작거나 같은지 확인
Subject selectedSubject = subjects.get(subjectChoice - 1); // 번호에서 -1을 해야 해당 과목이 지정 됨 List index 는 0번부터 시작
if (!currentSubjects.contains(selectedSubject)) { // 선택한 과목이 똑같은게 없는지 확인 없으면 ture
currentSubjects.add(selectedSubject); // 선택한 과목 넣어주기
System.out.println(selectedSubject.getSubjectName() + " 과목이 추가되었습니다.");
} else {
System.out.println("이미 선택된 과목입니다."); // 이미 선택한 과목이면 다시 질문
}
} else if (subjectChoice == 0) { // 0번이면 반복문 종료
break;
} else {
System.out.println("잘못된 입력입니다."); // 숫가 아닌 다른걸 입력하거나 해당 과목번호 외에 번호를 입력할때 나옴
}
}
System.out.println(subjectType + " 과목이 성공적으로 수정되었습니다."); // 수정이 완료되면 나옴
}
팀원분은 currentSubjects 리스트에서 Iterator
를 생성한다. Iterator
는 리스트를 순회하며 요소를 접근하고 Iterator
의 hasNext()
메서드를 호출하여 리스트에 다음 요소가 있는지 확인한다. 만약 있으면 true를 반환, 없으면 false를 반환하도록 한다. iterator.remove();
로 해당 과목을 삭제하도록 한다. if (!currentSubjects.contains(selectedSubject))
을 통해 선택한 과목이 없으면 true를 반환하여 선택한 과목이 추가되는 기능을 구현해준다.
내가 작성한 코드는 for
문이 너무 반복적으로 사용되어서 보기에 가독성이 함께 작업하는 팀원분께 더 좋아보여서 상의 끝에 팀원분에 코드를 선택하도록 결정하였다.