코딩항해기

[과제/JAVA] 학생부 프로그램 함수화 (+풀이 0701) 본문

problem solving/과제&실습 코딩

[과제/JAVA] 학생부 프로그램 함수화 (+풀이 0701)

miniBcake 2024. 6. 30. 17:02

 

 

기존 실습 때 진행했던 학생부 프로그램 코드를 메소드를 활용한 방식으로 디벨롭 시켜보자.

240701 풀이 추가

 

 

[실습][JAVA] 출석부 프로그램 만들기 (+풀이비교 0628추가)

배열에 대해 공부하기 위해 출석부 프로그램 만들기 실습을 진행하였다.(풀이 비교 추가함 2024.06.28.)[문제]학생부 프로그램 만들기 요구사항최대 5명까지 저장할 수 있는 학생부가 있습니다.학

minibcake.tistory.com

 

코드는 실습때 작성한 코드 말고, 풀이 때 작성한 코드로 진행할 예정이다.

 

[풀이 코드]

더보기
package class06;

import java.util.Scanner;

public class StudentMethodVer {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.println("학생부 프로그램");
		
		String[] datas = new String[5];
		int cnt = 0;

		while (true) {
			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("0. 프로그램 종료");
			System.out.println("==============");
			System.out.print("메뉴 입력 >> ");
			int menu = sc.nextInt();
			if (menu == 0) {
				break;
			} 
			
			else if (menu == 1) {
				if(cnt >= datas.length) {//저장할 수 있는 최대로 이미 저장이 되어있는 경우라면
					System.out.println("더 이상 데이터를 저장할 수 없습니다!");
					continue;
				}

				String name;
				while(true) {
					System.out.print("저장하고 싶은 학생의 이름을 입력해주세요 >> ");
					name = sc.next();
					
					System.out.print("정말 "+name+"(으)로 하시겠습니까? (Y/N) >> ");
					String answer = sc.next();
					if(answer.equals("Y")) {//제대로 입력했다면
						
						boolean flag = false;//학생부에 name이 없는 상태
						for(int i = 0; i< cnt; i++) {
							if(name.equals(datas[i])) {
								flag = true;
							}
						}
						if(!flag) {//!이미저장되어있다면
							break;
						}
					}
				}
				datas[cnt]=name;
				cnt++;
				System.out.println(name + "이(가) 저장되었습니다.");
			} //else if (menu == 1)
			
			else if (menu == 2) {
				if(cnt <= 0) { //보여줄 데이터가 없다면 == 저장된 데이터가 없음
					System.out.println("보여줄 학생 데이터가 없습니다.");
					continue;
				}
				
				System.out.println("**학생목록**");
				for(int i = 0; i<cnt; i++) {
					System.out.println((i+1)+"번 학생 : "+datas[i]);
				}
				System.out.println("**********");
			} //else if (menu == 2)
			
			else if (menu == 3) {// 이름으로 검색
				
				System.out.print("검색어 입력 >> ");
				String searchContent = sc.next(); //searchKeyword도 많이 사용함
				
				System.out.println("===================");
				boolean flag = false;
				for(int i = 0; i<cnt; i++) {
					if(datas[i].contains(searchContent)) {
						System.out.println(datas[i]);
						flag = true;
					}
				}
				//검색 결과가 없다면, 없다고 알려주기
				if(!flag) {//만약에 검색결과가 없다면
					System.out.println("검색결과가 없습니다.");
				}
				
				System.out.println("===================");
				
			} //else if (menu == 3)
			
			else if (menu == 4) {
				if(cnt<=0) {
					System.out.println("검색할 학생 데이터가 없습니다!");
					continue;
				}
				
				int num;
				while(true) {
					System.out.print("검색할 학생의 번호 입력 >> ");
					num = sc.nextInt();
					if(1<=num && num<=cnt) { 
						break;
					}
					System.out.println("올바른 번호를 입력해주세요!");
				}
				
				System.out.println(num + "번 학생의 이름은" + datas[num-1] + "입니다!");
			}//else if (menu == 4)
			
			else if (menu == 5) { // 이름변경
				if(cnt<=0) {
					System.out.println("검색할 학생 데이터가 없습니다!");
					continue;
				}
				
				int num;
				while(true) {
					System.out.print("변경할 학생의 번호 입력 >> ");
					num = sc.nextInt();
					if(1<=num && num<=cnt) { 
						break;
					}
					System.out.println("올바른 번호를 입력해주세요!");
				}
				
				System.out.println(num+"번 학생의 이름은 "+datas[num-1]+"입니다.");
				
				String name;
				while(true) {
					System.out.print("변경할 이름을 입력해주세요 >> ");
					//이미 있는 이름과 변경 전 이름과 동일할 때 경우 멘트를 분리해주면 좋다
					name = sc.next();
					
					System.out.print("정말 "+name+"(으)로 하시겠습니까? (Y/N) >> ");
					String answer = sc.next();
					
					if(answer.equals("Y")) {//제대로 입력했다면
						
						boolean flag = false;//학생부에 name이 없는 상태
						for(int i = 0; i< cnt; i++) {
							if(name.equals(datas[i])) {
								flag = true;
								
								if(name.equals(datas[num-1])) {//내 이전이름이면
									//이전이름이라 안됨
									System.out.println("변경 전 이름과 동일하여 변경이 불가합니다.");
								}
								else {//사용중인이름이라 안됨
									System.out.println("이미 존재하는 이름입니다.");
								}
							}
						}
						
						if(!flag) {//!이미저장되어있다면
							break;
						}
					}
				}
				datas[num-1]=name;
			} 
			
			else { // 유효성 검사
				System.out.println("제대로 입력해주세요~~");
			}

		}
	}//main

}//class

 

[기능분석]

메소드로 분리하기 위해 기능 단위로 파트를 나누어보았다.

//>>>>> (시작) 기능 / 반환값

////////// (종료)

더보기
package class06;

import java.util.Scanner;

public class StudentMethodVer {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.println("학생부 프로그램");
		
		String[] datas = new String[5];
		int cnt = 0;

		while (true) {
			//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> menu출력 / void
			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("0. 프로그램 종료");
			System.out.println("==============");
			////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> menu입력 받아 /menu
			System.out.print("메뉴 입력 >> ");
			int menu = sc.nextInt();
			////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			if (menu == 0) {
				break;
			} 
			
			else if (menu == 1) {
				//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 학생이 다 차있는지 확인 /boolean
				if(cnt >= datas.length) {//저장할 수 있는 최대로 이미 저장이 되어있는 경우라면
					System.out.println("더 이상 데이터를 저장할 수 없습니다!");
					continue;
				}
				///////////////////////////////////////////////////////////////////////////////////////////////////////////

				//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>이름을 입력받아 저장하는 (저장기능을 빼면 /name)
				String name;
				while(true) {
					System.out.print("저장하고 싶은 학생의 이름을 입력해주세요 >> ");
					name = sc.next();
					
					System.out.print("정말 "+name+"(으)로 하시겠습니까? (Y/N) >> ");
					String answer = sc.next();
					if(answer.equals("Y")) {//제대로 입력했다면
						
						//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>학생부에 이름이 있는지 확인 /boolean
						boolean flag = false;//학생부에 name이 없는 상태
						for(int i = 0; i< cnt; i++) {
							if(name.equals(datas[i])) {
								flag = true;
							}
						}
						/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
						if(!flag) {//!이미저장되어있다면
							break;
						}
					}
				}
				datas[cnt]=name;
				cnt++;
				System.out.println(name + "이(가) 저장되었습니다.");
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			} //else if (menu == 1)
			
			else if (menu == 2) {
				//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>학생부가 비어있는지 확인 /boolean
				if(cnt <= 0) { //보여줄 데이터가 없다면 == 저장된 데이터가 없음
					System.out.println("보여줄 학생 데이터가 없습니다.");
					continue;
				}
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////
				
				//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>학생 전체 출력 /void
				System.out.println("**학생목록**");
				for(int i = 0; i<cnt; i++) {
					System.out.println((i+1)+"번 학생 : "+datas[i]);
				}
				System.out.println("**********");
				////////////////////////////////////////////////////////////////////////////////////////////////////////////////
			} //else if (menu == 2)
			
			else if (menu == 3) {// 이름으로 검색
				
				//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>입력받기 /searchContent
				System.out.print("검색어 입력 >> ");
				String searchContent = sc.next(); //searchKeyword도 많이 사용함
				//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				
				//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>검색결과 출력 /void
				System.out.println("===================");
				//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>검색결과 출력+검색결과 있는지 확인 /boolean
				boolean flag = false;
				for(int i = 0; i<cnt; i++) {
					if(datas[i].contains(searchContent)) {
						System.out.println(datas[i]);
						flag = true;
					}
				}
				/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				//검색 결과가 없다면, 없다고 알려주기
				if(!flag) {//만약에 검색결과가 없다면
					System.out.println("검색결과가 없습니다.");
				}
				
				System.out.println("===================");
				////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				
			} //else if (menu == 3)
			
			else if (menu == 4) {
				//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>학생부가 비었는지 확인 /boolean
				if(cnt<=0) {
					System.out.println("검색할 학생 데이터가 없습니다!");
					continue;
				}
				////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				
				//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>번호 입력받아 검증 /num
				int num;
				while(true) {
					System.out.print("검색할 학생의 번호 입력 >> ");
					num = sc.nextInt();
					//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>저장된 범위인지 확인/boolean
					if(1<=num && num<=cnt) { 
						break;
					}
					System.out.println("올바른 번호를 입력해주세요!");
					////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				}
				////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				
				//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>출력하기 /void
				System.out.println(num + "번 학생의 이름은" + datas[num-1] + "입니다!");
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////
			}//else if (menu == 4)
			
			else if (menu == 5) { // 이름변경
				//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>학생부가 비었는지 확인 /boolean
				if(cnt<=0) {
					System.out.println("검색할 학생 데이터가 없습니다!");
					continue;
				}
				////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				
				//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>번호 입력받고 범위검증+결과출력 /void
				int num;
				while(true) {
					System.out.print("변경할 학생의 번호 입력 >> ");
					num = sc.nextInt();
					//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>저장된 범위인지 확인/boolean
					if(1<=num && num<=cnt) { 
						break;
					}
					System.out.println("올바른 번호를 입력해주세요!");
					////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				}
				
				System.out.println(num+"번 학생의 이름은 "+datas[num-1]+"입니다.");
				////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				
				//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>이름을 받아 저장함 (저장을 빼면 name)
				String name;
				while(true) {
					System.out.print("변경할 이름을 입력해주세요 >> ");
					//이미 있는 이름과 변경 전 이름과 동일할 때 경우 멘트를 분리해주면 좋다
					name = sc.next();
					
					System.out.print("정말 "+name+"(으)로 하시겠습니까? (Y/N) >> ");
					String answer = sc.next();
					
					if(answer.equals("Y")) {//제대로 입력했다면
						
						//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>학생부에 이름이 있는지 확인하고/boolean 변경전이름과 같은지 아닌지 확인
						boolean flag = false;//학생부에 name이 없는 상태
						for(int i = 0; i< cnt; i++) {
							if(name.equals(datas[i])) {
								flag = true;
								
								//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>변경전이름과 같은지 아닌지 출력 / void
								if(name.equals(datas[num-1])) {//내 이전이름이면
									//이전이름이라 안됨
									System.out.println("변경 전 이름과 동일하여 변경이 불가합니다.");
								}
								else {//사용중인이름이라 안됨
									System.out.println("이미 존재하는 이름입니다.");
								}
								////////////////////////////////////////////////////////////////////////////////////////////////////////////////
							}
						}
						////////////////////////////////////////////////////////////////////////////////////////////////////////////////
						
						if(!flag) {//!이미저장되어있다면
							break;
						}
					}
				}
				datas[num-1]=name;
				/////////////////////////////////////////////////////////////////////////////////////////////////////////////
			} 
			
			else { // 유효성 검사
				System.out.println("제대로 입력해주세요~~");
			}

		}
	}//main

}//class

 

[메소드 적용된 코드]

package class06;

import java.util.Scanner;

public class StudentMethodVer {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		StudentMethodVer st = new StudentMethodVer();

		System.out.println("학생부 프로그램");
		
		String[] datas = new String[5];
		int cnt = 0;
		
		while (true) {
			int menu = st.insertMenu();
			if (menu == 0) {
				break;
			} 
			
			else if (menu == 1) {
				//T:저장가능 F:저장불가
				if(!st.checkStuFull(cnt, datas)) {
					continue;
				}
				
				st.insertName("저장", cnt, datas, 0); //num<1이라면 checkundo 변경전이름동일은 줄력되지 않음
			} //else if (menu == 1)
			
			else if (menu == 2) {
				//T:학생부에 값이 있음 //F:학생부에 값이 없음
				if(!st.checkStuNull(cnt)) {
					continue;
				}
				
				st.selectAll(cnt, datas);
			} //else if (menu == 2)
			
			else if (menu == 3) {// 이름으로 검색
				st.searchName(cnt, datas, st.insertSearchCont());				
			} //else if (menu == 3)
			
			else if (menu == 4) {// 번호로 검색
				//T:학생부에 값이 있음 //F:학생부에 값이 없음
				if(!st.checkStuNull(cnt)) {
					continue;
				}

				int num = st.searchNum("검색", cnt, datas);
			}//else if (menu == 4)
			
			else if (menu == 5) { // 이름변경
				//T:학생부에 값이 있음 //F:학생부에 값이 없음
				if(!st.checkStuNull(cnt)) {
					continue;
				}
				
				int num = st.searchNum("저장", cnt, datas);
				st.insertName("변경", cnt, datas, num);
			} //else if (menu == 5)
			
			else { // 유효성 검사
				System.out.println("제대로 입력해주세요~~");
			}

		}
	}//main
	//메뉴 선택 입력받기 /menu
	public int insertMenu() {
		Scanner sc = new Scanner(System.in);
		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("0. 프로그램 종료");
		System.out.println("==============");
		System.out.print("메뉴 입력 >> ");
		return sc.nextInt();
	}
	
	//학생 전체 출력 /void
	public void selectAll(int cnt, String[] datas) {
		System.out.println("**학생목록**");
		for(int i = 0; i<cnt; i++) {
			System.out.println((i+1)+"번 학생 : "+datas[i]);
		}
		System.out.println("**********");
	}
	
	//입력받기 /searchContent
	public String insertSearchCont() {
		Scanner sc = new Scanner(System.in);
		System.out.print("검색어 입력 >> ");
		return sc.next(); //searchKeyword도 많이 사용함
	}
	
	//이름으로 검색 출력
	public void searchName(int cnt, String[] datas, String searchContent) {
		System.out.println("===================");
		boolean flag = false;
		for(int i = 0; i<cnt; i++) {
			if(datas[i].contains(searchContent)) {
				System.out.println(datas[i]);
				flag = true;
			}
		}
		if(!flag) {//만약에 검색결과가 없다면
			System.out.println("검색결과가 없습니다.");
		}
		System.out.println("===================");
	}

	
	//학생부가 비었는지 확인 /boolean
	public boolean checkStuNull(int cnt) { //T:학생부에 값이 있음 //F:학생부에 값이 없음
		if(cnt<=0) {
			System.out.println("검색할 학생 데이터가 없습니다!");
			return false; //continue
		}
		return true;
	}
	
	//학생부가 전부 찼는지 확인
	public boolean checkStuFull(int cnt, String[] datas) {//T:저장가능 F:저장불가
		if(cnt >= datas.length) {//저장할 수 있는 최대로 이미 저장이 되어있는 경우라면
			System.out.println("더 이상 데이터를 저장할 수 없습니다!");
			return false; //continue
		}
		return true;
	}
	
	//저장된 범위인지 확인/boolean
	public boolean checkStuRange(int cnt, int num) { //T:범위안의 값 F:범위밖의 값
		if(1<=num && num<=cnt) { 
			return true;
		}
		System.out.println("올바른 번호를 입력해주세요!");
		return false;
	}
	
	//번호 입력받고 범위검증+결과출력 /num
	public int searchNum(String division, int cnt, String[] datas) {//division => 검색/저장
		Scanner sc = new Scanner(System.in);
		int num;
		while(true) {
			System.out.print(division+"할 학생의 번호 입력 >> ");
			num = sc.nextInt();
			//public boolean checkStuRange(int cnt, int num) { //T:범위안의 값 F:범위밖의 값
			if(checkStuRange(cnt, num)) {
				break;
			}
		}
		System.out.println(num+"번 학생의 이름은 "+datas[num-1]+"입니다.");
		return num;
	}
	
	//변경전이름과 같은지 아닌지 출력 /void
	public void checkUndo(String name, String[] datas, int num) {
		if(!(num<1)&&name.equals(datas[num-1])) {//내 이전이름이면
			//이전이름이라 안됨
			System.out.println("변경 전 이름과 동일하여 변경이 불가합니다.");
		}
		else {//사용중인이름이라 안됨
			System.out.println("이미 존재하는 이름입니다.");
		}
	}
	
	//학생부에 이름이 있는지 확인하고/boolean 변경전이름과 같은지 아닌지 확인
	public boolean checkName(int cnt, String name, String[] datas, int num) { //num<1이라면 checkundo 변경전이름동일은 줄력되지 않음
		for(int i = 0; i< cnt; i++) {
			if(name.equals(datas[i])) {
				//변경전이름과 같은지 아닌지 출력 /void
				//checkUndo(String name, String[] datas, int num)
				checkUndo(name, datas, num);
				return true;
			}
		}
		return false;
	}
	
	//이름을 받아 검증 후 저장
	public void insertName(String division, int cnt, String[] datas, int num) {//division => 저장/변경
		Scanner sc = new Scanner(System.in);
		String name;
		while(true) {
			System.out.print(division+"할 이름을 입력해주세요 >> ");
			name = sc.next();
			
			System.out.print("정말 "+name+"(으)로 하시겠습니까? (Y/N) >> ");
			String answer = sc.next();
			
			if(answer.equals("Y")) {//제대로 입력했다면
				if(!checkName(cnt, name, datas, num)) {//!이미저장되어있다면
					break;
				}
			}
		}
		if(division.equals("저장")) {
			datas[cnt]=name;
			cnt++;
		}
		else { //변경
			datas[num-1]=name;
		}
		System.out.println(name+"(으)로 "+division+"되었습니다.");
	}

}//class

 

[풀이]

(아직 객체를 배우지 않아 static으로 선언됨)

더보기
package class02;

import java.util.Scanner;

public class Test01 {

   public static int sample(String[] datas) {
      // 학생부 배열에 샘플 데이터를 저장해주고,
      // 몇명이 저장되었는지 반환해주는 함수
      datas[0]="티모";
      datas[1]="아리";
      datas[2]="모르가나"; // 배열은 call by reference ▶ 반환 x
      int cnt=3; // 원시타입 ▶ 반환 o
      return cnt;
   }

   public static int printMenu() {
      // 메뉴를 출력해주고,
      // 사용자로부터 메뉴번호로 입력받은 값을 반환해주는 함수
      Scanner sc=new Scanner(System.in);
      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("0. 프로그램 종료");
      System.out.println("===============");
      System.out.print("메뉴 입력 >> ");
      int menu=sc.nextInt();
      return menu;
   }

   public static boolean isFull(int cnt,String[] datas) {
      // 더 이상 학생 데이터를 저장할 수 없을때
      if(cnt >= datas.length) {
         System.out.println("더이상 데이터를 저장할수없습니다!");
         return true;
      }
      return false;
   }
   public static boolean isEmpty(int cnt) {
      // 아직 저장된 학생 데이터가 전혀 없을때
      if(cnt<=0) { 
         System.out.println("저장된 학생 데이터가 없습니다.");
         return true;
      }
      return false;
   }

   public static String inputName(int cnt,String[] datas) {
      // 사용자가 이름을 입력하면 그 이름 값을 반환하는 함수
      Scanner sc=new Scanner(System.in);
      String name;
      while(true) {
         System.out.print("변경할 이름을 입력해주세요. >> ");
         name=sc.next();

         System.out.print("정말 "+name+"(으)로 하시겠습니까? (Y/N) >> ");
         String answer=sc.next();

         if(answer.equals("Y")) {

            boolean flag=false;

            for(int i=0;i<cnt;i++) {
               if(name.equals(datas[i])) {
                  flag=true;
                  System.out.println(name+"은(는) 이미 존재하는 이름입니다...");
               }
            }


            if(!flag) {
               break;
            }

         }
      }
      return name;

   }

   // 학생부 전체 출력 담당하는 기능의 함수
   // input, output 먼저 생각해보기!!!!!!!!!!
   // input : 학생부 데이터, 현재 저장된 학생의 수
   // output : x
   public static void printStudents(String[] datas,int cnt) {
      System.out.println("=== 학생 목록 ===");
      for(int i=0;i<cnt;i++) {
         System.out.println((i+1)+"번 학생 "+datas[i]);
      }
      System.out.println("====================");
   }

   public static boolean isRight(int num,int cnt) {
      if(1<=num && num<=cnt) {
         return true;
      }
      return false;
   }

   // 학생 번호로 검색
   // input : 학생부 데이터, 현재 저장된 학생의 수
   // output : x (대체적으로 출력(select,read,R)기능은 output이 없음)
   public static int selectOne(String[] datas,int cnt) {
      Scanner sc=new Scanner(System.in);
      int num;
      while(true) {
         System.out.print("검색할 번호 입력 >> ");
         num=sc.nextInt();
         if(isRight(num,cnt)) {
            break;
         }
      }      
      System.out.println(num+"번 학생은 "+datas[num-1]+"입니다.");
      return num;
   }

   public static void main(String[] args) {
      String[] datas = new String[5];
      Scanner sc=new Scanner(System.in);
      System.out.println("학생부 프로그램");

      int cnt=sample(datas);

      while(true) {
         int menu=printMenu();
         if(menu==0) {
            System.out.println("프로그램이 종료됩니다.");
            break;
         }
         else if(menu==1) { // 학생추가
            if(isFull(cnt,datas)) {
               continue;
            }
            String name=inputName(cnt, datas);
            datas[cnt]=name;
            cnt++;

            System.out.println(name+"이(가) 저장되었습니다!");

         }
         else if(menu==2) { // 학생부 전체출력
            if(isEmpty(cnt)) { 
               continue;
            }

            printStudents(datas,cnt);
         }
         else if(menu==3) { // 이름으로 검색
            System.out.print("검색어 입력 >> ");
            String searchContent=sc.next(); // searchKeyword

            boolean flag=false; // 검색결과가 없는 상태로 시작

            // 학생부를 하나하나 확인하면서
            System.out.println("===============");
            for(int i=0;i<cnt;i++) {
               if(datas[i].contains(searchContent)) {
                  System.out.println(datas[i]);
                  flag=true; // 검색결과를 찾은 상태
               }
            }

            if(!flag) { // 검색결과가 없다면
               System.out.println("검색결과가 없습니다...");
            }
            System.out.println("===============");


         }
         else if(menu==4) { // 번호로 검색 => PK로 검색 == selectOne(getOne)
            if(isEmpty(cnt)) { 
               continue;
            }

            selectOne(datas,cnt);

         }
         else if(menu==5) { // 이름변경

            if(isEmpty(cnt)) { 
               continue;
            }

            int num=selectOne(datas,cnt);
            datas[num-1]=inputName(cnt, datas);
         }
         else { // 유효성 검사
            System.out.println("제대로 입력해주세요~~");
         }
      }


   }

}

 

[아쉬웠던 부분]

너무 메소드를 남발했던 부분이 있는 것 같다. 중복되는 부분을 메소드로 변경할 것.

그리고 변수명을 지을 때 일반적으로 잘 사용되는 규칙을 따를 것.

(boolean 타입 반환이라면 is나 has로 시작되게끔)

 

그리고 cnt는 원시타입인데 반환을 하지 않아 값이 제대로 반영되지 않고 있었다...!

>>코드를 변경하면 꼼꼼하고 세세하게 테스트해보는 습관을 길러야겠다!