Backend/문제 풀이

[Java] 학생관리프로그램(displayMenu)

Deeb 2021. 10. 6. 01:25

전체적인 코드 

package edu.kh.collection.model.service;

import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;

import edu.kh.collection.model.vo.Student;

public class StudentManagementService {

	private Scanner sc = new Scanner(System.in);	
	private List<Student> stdList = new ArrayList<Student>();
	
	
   public void displayMenu() { //메뉴 출력
	      
	      int sel = 0;
	      
	      do {
	         
	         System.out.println("======== 학생 관리 프로그램 ========");
	         System.out.println("1. 학생 전체 조회");
	         System.out.println("2. 학생 정보 추가"); // 이름, 나이, 학년
	         System.out.println("3. 학생 정보 수정"); // 이름, 나이, 학년
	         System.out.println("4. 학생 정보 제거");
	         System.out.println("5. 이름 검색");
	         System.out.println("6. 이름, 나이, 학년이 일치하는 학생 인덱스 조회");
	         System.out.println("0. 종료");
	         
	         System.out.print("메뉴 선택 >> ");
	         
	         try {
	            sel = sc.nextInt(); // sel이라는 변수에 입력받기 
	            sc.nextLine(); // 개행문자 제거
	         
	            
	            switch(sel) {
	            case 1 : selectAll(); break;
	            case 2 : addStudent(); break; // 3.예외처리가 여기까지 왔는데 여기는 try-catch문이 있기때문에 예외처리가 가능
	            case 3 : updateStudent(); break;
	            case 4 : deleteStudent(); break;
	            case 5 : searchStudentName(); break;
	            case 6 : selectIndex(); break;
	            case 0 : System.out.println("프로그램 종료"); break;
	            default : System.out.println("메뉴에 있는 번호만 입력해주세요.");
	            
	            }

	            
	         }catch (InputMismatchException e) {
	            System.out.println("정수만 입력해주세요.");
	            sel = -1; // 맨 처음 sel == 0 인경우 바로 종료되는 것을 방지하기 위해 -1 값 넣기
	            sc.nextLine(); // 입력버퍼에 남아있는 잘못 입력한 내용 제거
	         }
	         
	      }while(sel != 0);
	      
	   }
       
       //case문들 추가
}

 

 

CASE 1

1. 학생 전체 조회 메서드 생성

출력 예상 결과

학생 정보가 있을 경우 : 1번 이름 나이 학년 성별 키
학생 정보가 없을 경우 : "입력된 학생 정보가 없습니다."

 private void selectAll() {
	System.out.println("[학생 전체 조회]");
	   
	   // if(stdList == null) -> 컬렉션이 비어있다고 이건 안됨
	   // -> JAVA에서 null은 참조하는 주소가 없음을 의미. (비어 있다x)
	   
	   if(stdList.isEmpty() ) { // stdList가 참조하는게 아무것도 없다면 == 비어있다면
		   System.out.println("입력된 학생 정보가 없습니다. ");
		   
	   } else { //stdList가 비어있지 않다면 
		   
		   //일반 for문
		  for(int i = 0; i<stdList.size(); i++) {
			  
			  // stdList의 i번째 인덱스 요소를 얻어와 Student 참조변수 s에 대입 -> 얕으 ㄴ복사
			  Student s = stdList.get(i);
			  
			  System.out.printf("%d번 %s %d세 %d학년\n", i+1, s.getName(), s.getAge(), s.getGrade() );
			  // i+1 : 0번부터 시작하니깐 +1 해주기
			  // 위에서 얕은복사를 했기 때문에 stdList.get(i).getName() -> s.getName() ==> 코드길이 감소
			  			  
		  }		   
	   }
   }

⭐ boolean isEmpty() 메서드
: 컬렉션이 비어 있으면 true, 아니면 false 반환( 자주쓰임!!!)

 

CASE 2,3 추상화 과정

2,3번 메뉴용 학생 정보 입력 메서드를 따로 만들어서 2,3번 만들때 코드의 중복 막기

private Student inputStudent() throws InputMismatchException{ // 1. addStudent() 로 예외를 던져버린다. 
	//메서드 수행 중 예외 발생 시 ex) 나이에 십칠세라고 입력된 경우
	// 별도의 처리 구문(try- catch)가 없을 경우
	// 호출한 메서드로 예외를 던진다. (throws)-- throws는 안써도 되어있지만 명시적(쓰여있다는걸 보여주기위해)_으로 적어줌
  
	System.out.print("이름 : ");
	String name = sc.next();
	   
	System.out.print("나이 : ");
	int age = sc.nextInt();
	   
	System.out.print("학년 : ");
	int grade = sc.nextInt();
	   
	   
	//입력 받은 값을 이용해 Student 객체를 생성 및 초기화한 후 해당 객체의 주소를 반환
	return new Student(name, age, grade);
	//학생객체 생성하는 객체
   }

 

CASE 2

2. 학생 정보 추가 addStudent()

private void addStudent() throws InputMismatchException{ //2. 던지기해서 얘는 호출한데가 displaymenu의 case2 까지 예외가 던져졌다 
	System.out.println("[학생 정보 추가]");
	// 이름, 나이, 학년을 입력 받아 stdList에 추가
	   
	// 입력 받은 값으로 생성한 학생 객체를 반환 받아 stdList에 추가
	//stdList는 list니깐 추가하고싶으면 add
	stdList.add( inputStudent()); // 학생 객체 반환 
}

 

CASE 3

3. 학생 정보 수정

문제 푸는 방법

더보기

이름, 나이, 학년을 입력 받아 특정 index에 있는 학생 정보를 수정
학생 정보가 있는지 먼저 확인 후 수정하기 해당 인덱스에 값이 존재하는가
인덱스 번호를 입력 받아야 한다. 
   
문제를 푸는 방법
1. 인덱스 번호 입력 받기
2. 해당 인덱스가 stdList에 있는지 검사
     2-1) 비어있는지 2-2) 음수 입력 확인 2-3) 입력된 인덱스가 stdList범위 내에 있는지 확인

3-1. 인덱스가 있을 경우 학생 정보를 입력 받아 수정
 3-2. 인덱스가 없을 경우 "index가 존재하지 않음" 구문 출력

private void updateStudent() throws InputMismatchException{
// 1) 인덱스 번호 입력 받기
	System.out.print("수정할 학생의 인덱스 번호 입력 : ");
	int inputIndex1 = sc.nextInt();
	sc.nextLine(); // 입력 버퍼에서 개행 문자 제거
	// 2) 해당 인덱스가 stdList에 있는지 검사
		
	// 2-1) 비어있는지 확인
	if(stdList.isEmpty() ) { //학생 정보가 없다면
	   System.out.println("입력된 학생 정보가 없습니다.");
		   
	} else { // 중첩if로 위의 조건은 만족한 상태에서 재조건
		   
		// 2-2) 음수 입력 확인
		if(inputIndex1 < 0) {
			System.out.println("음수는 입력할 수 없습니다.");
		}else {
				
			// 2-3) 입력된 인덱스가 stdList 범위 내에 있는지 확인
			if( inputIndex1 < stdList.size() ) {
					
				// 3-1) 인덱스가 있을 경우 학생 정보를 입력 받아 수정
				stdList.set(inputIndex1,  inputStudent());
											// -> Student 객체 주소 반환
				
                }else {
					
					// 3-2) 인덱스가 없을 경우 "index가 존재하지 않음" 구문 출력
					System.out.println("index가 존재하지 않음");
				}
		}
	}	
}

 

CASE 4

4. 학생 정보 제거

출력 예상 결과

학생 정보가 있을 경우 : 1번 이름 나이 학년 성별 키
학생 정보가 없을 경우 : "입력된 학생 정보가 없습니다."

private void deleteStudent() {
	System.out.println("[학생 정보 제거]");
	
	// 인덱스 번호를 입력 받아 해당 인덱스 학생 정보를 삭제
	System.out.println("삭제할 학생 인덱스 번호 입력 : ");
	int inputIndex = sc.nextInt();
	sc.nextLine();
	   
	//3과 같은 내용으로 진행하지만 다른 조건 생각해보기
	if( !stdList.isEmpty()	) { //stdList가 비어있지 않다면
		if( inputIndex >=0) { // 입력 받은 index가 0 또는 양수( 정상범위)
			if(inputIndex < stdList.size()) { // 존재하는 index인 경우
				stdList.remove(inputIndex);
				System.out.println("삭제 되었습니다.");
				   
			 } else { // 존재하지 않는 index
				 System.out.println("Index가 존재하지 않는다.");
		`	}
			   
			   
		}else {//음수
			   System.out.println("음수는 입력할 수 없습니다."); }

	   } else { //stdList가 비어있다면
		   System.out.println("입력된 학생 정보가 없습니다.");
	}
}

 

CASE 5

5. 학생 이름 검색

출력 예상 결과

이름을 입력 받아 일치하는 학생의 인덱스 번호, 학생 정보를 출력
없으면 "존재하지 않는 학생입니다" 출력

private void searchStudentName() {
	// 1) 이름 입력
	System.out.println("검색할 학생 이름 입력 : ");
	String inputName = sc.next(); //한글이름은 띄어쓰기가 없으니 next만 해도 되지만 이름에 띄어쓰기 들어가는 경우 nextLine
	sc.nextLine();
	   
	// 2-1) stdList가 비어있는지 검사
	if(	!stdList.isEmpty()	) { // stdList가 비어있지 않다면
    
		boolean flag = true; //검색 결과 존재 여부에 대한 신호
		  
        // 2-2) 입력 받은 학생이 stdList에 있는지 검사	   	
		for(int i =0; i<stdList.size(); i++) {
			   
          // 3-1) 있으면 인덱스 + 학생정보 출력
          if( inputName.equals ( stdList.get(i).getName() ) ) {
              System.out.println("인덱스 번호 : " +i);
              System.out.println("조회 시 출력 번호: "+ (i+1));
			  System.out.println(stdList.get(i)); //자동으로 toString() 메서드 호출
				  
			// break; 를 쓰지 않는이유 : 이름이다 보니 동명이인이 있을 수 있기 때문
				flag = false;
			  } //else 문으로 3-2를 쓰면 맞을때까지 검색한 후 나오기 때문에 boolean flag사용 
		 }
         
         
		 //for 문이 끝난 후 flag를 검사하는 if문
		 // 3-2) 없으면 "존재하지 않는 학생입니다"
		   if(flag) { //for문 반복 후에도 flag == true인 경우 == 검색 결과 x
			   System.out.println("존재하지 않는 학생입니다.");
		   }   
		   
	   } else {
		   System.out.println("입력된 학생 정보가 없습니다.");
	   }
	   
   } //flag를 바깥으로 빼면 전체 if문의 else문인 입력된 학생정보 없습니다가 같이 출력된다. (에러)

 

CASE 6

6. 이름, 나이, 학년

 private void selectIndex(){
	System.out.println("[이름, 나이, 학년이 일치하는 학생 인덱스 조회]");
	   
	 // 1) 이름, 나이, 학년을 입력 받기
	   Student std = inputStudent(); //입력받은걸 std에 참조
	   std.getName();	   //입력받은걸 꺼내기
	   std.getAge();
	   
	// 2) stdList에서 세개 모두 일치하는 학생의 인덱스를 출력
	   boolean flag = true;
	   
	   for(int i =0; i<stdList.size(); i++) {
		   // 현재 접근한 stdList의  내부 객체를 s변수로 참조
		   Student s = stdList.get(i); //현재 참조중인 index번호를 s에 저장한다. 
		   
		//이름, 나이 , 학년이 일치하는 경우
		if( s.getName().equals( std.getName()) &&
			 s.getAge() == std.getAge() &&	
			 s.getGrade() == std.getGrade() ) {
			  
			 System.out.println("인덱스 번호 : " + i);
			  
			  flag = false;
		  }
	   } // for end
	   
	   if(flag) {
		   System.out.println("일치하는 학생이 존재하지 않습니다.");
	   }
}

 

CASE 7

7. 이름, 나이, 학년이 일치하는 학생 인덱스 조회 Ver2 

private void selectIndex2() {
	System.out.println();

	//1) 이름, 나이, 학년 입력
	Student std = inputStudent();
	   
	// 2) Object.equals() 메서드 -> 오버라이딩
//	   Student에서 진행
//	   테스트 
//	   System.out.println(std.equals( new Student("홍길동", 15, 2)) );
	 
	// 3) List. indexOf(Object o) 메서드 
	// -> 리스트에서 매개변수 o와 같은 객체가 존재하는 index를 반환, 없으면 -1 반환
	   
	//같은 객체임을 확인하는 equals() 오버라이딩 필수
	   
//	  System.out.println(stdList.indexOf(std));
	  //stdList에 std와 같은 값을 가진 객체의 인덱스 출력
	   
	   if( stdList.indexOf(std) != -1) {
		   System.out.println("인덱스 번호 : "+ stdList.indexOf(std));
	   } else {
		   System.out.println("일치하는 학생이 존재하지 않습니다.");
	   }
   }
반응형