The Debugging Chronicles : "코드의 미학"

학생부 첫번째- CRUD, Flag 알고리즘, PK , 경계값 검사, 본문

JAVA/자바 수업 내용

학생부 첫번째- CRUD, Flag 알고리즘, PK , 경계값 검사,

sweetseonah1004 2024. 7. 29. 16:00
package class01;

import java.util.Scanner;

// 프로그램

// 요구사항
// 프로그램에서 모든 요구사항은 CRUD로 귀결됩니다.
// 데이터
// create 생성 회원가입
// read   출력  게시글 검색
// update 변경   프로필사진 변경 글변경
// delete 삭제   회원탈퇴 글삭제

// 상품 구매 >> 사용자가 해당 상품을 구매했다는 사실이 기록
//		   >> 이 상품의 판매량이 증가

//CRUD, 비즈니스 메서드, 비즈니스 로직, 핵심 로직, 핵심 관심

// "학생부 프로그램"
//사용자의 첫번쨰 요사사항
// 1.최대 5명까지 저장할 수 있는 학생부가 있습니다.
// 2. 학생부 프로그램을 작성해세요
// 개발자와의 1차 요구사항 회의를 통해
// C: 학생을 추가 (동명이인 없다)
// R: 학생부를 전체출력/학생이름으로 검색   >>> selectAll, getAll
// R: 1번 학생 이름출력 				>>> selectone,getOne
//		 ** 같은 R여도 All 이 있고,one이 있다
// U: 학생의 이름 변경
//(그래서 D를 하는 프로그램에서는 배열을 스지 않는다)
//-------------------
// 개발자는 제작할 때
//1. 샘플 데이터를 확보
//		ex)학생이 존재한다고 가정하고,
// R(selectAll)부터 제잘
//===>임의의 데이터를 생성해놓고, 잘 출력이 되는지 확인
//(3. c부터 제작을해서, 생성한 데이터 공간에 다른 데이터가 잘 추가되는지 확인)

//내가 이름을 추가할때,
//만약 이름이 이미 저장되어있다면,
//다시 이름을 입력받도록

//1.flag알고리즘(로직)	
//>>	어떤 

public class Test01 {
	public static void main(String[] args) {
		
		
	     String[] datas = new String[5];
	      Scanner sc=new Scanner(System.in);
	      System.out.println("학생부 프로그램");
	      
	      datas[0] = "티모";
	      int cnt =1; //현제 저장된 학생수
	      
	      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) {
	            System.out.println("프로그램이 종료됩니다.");
	            break;
	         }
	         else if(menu==1) {// 학생추가
	        	 
	        	if(cnt >= datas.length) {	// 저장할 수 있는 최대로 이미 저장이 되어있는 경우라면
	        		System.out.println("더 이상 데이터를 저장할수 없습니다");
	        		continue;
	        	}
	        	 
	        	// 정말____으로 하시겠습니까?
	        	String name;
	        	while(true) {
		        	 System.out.println("저장하고 싶은 학생의 이름을 입력해주세요"); // 사용자 이름입력
		        	 name = sc.next();
		        	 	
		        	 System.out.println("정말" +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])) {//저장하려는 이름이 이미 존재한다면
		        	 				
		        	 				// 사용자가 입력한 name값이
		        	 				// 학생부 데이터와 일치합니까?
		        	 				
		        	 				// 학생부에 name이 있는 상태
		        	 				flag=true;
		        	 				System.out.println(name + "은(는) 이미 존재하는 이름입니다."
		        	 						);
		        	 			}
		        	 		}
		        	 		
		        	 		if(!flag) { // 만약 저장되어있지 않다면 == !(학생부에 저장되어 있다면)
		        	 			break;
		        	 		}
		        	 	}
	        	}
//	        	 현재 들어갈 위치
	        	 datas[cnt]=name;// 데이터를 배열에 저장하는 기능
	        	 cnt++;
	        	 
	        	 System.out.println("name이 저장되었습니다!");
	            
	         }
	         else if(menu==2) {// 학생부 전체출력
	        	 		
	        	 		// cnt <=0 ** 좋은 코드
	        	 		// 악의적으로 접근하려는 것을 차단
	        	 		// 유효성 검사는 더 넓은 범위로 꼼꼼하게 
	        	 if(cnt <=0) { // 보여줄 데이터가 없다면 == 저장된 데이터가 없음
	        		 System.out.println("보여줄 학생 데이터가 없습니다.");
	        		 continue; //다시 반복문의 처음으로 이동;
	        	 }
	        	 
	        	 
	            // 1번 부터 저장된 학생수 만큼 출력
	        	System.out.println("====학생 목록 ====");
	        	 for(int i = 0; i<cnt; i ++) { // ***i<cnt -> 저장된 수만큼
	        		 System.out.println((i+1)+"번 학생: " + datas[i]);
	        	 }
	        	 System.out.println("=================");
	         }
	         else if(menu==3) {// 이름으로 검색
	        	 
	        	 //검색어를 입력 >>
        	 // 이 검색어가 맞습니까?	xxxx : 	사용자가 하는 입력이 데이터에 변화를 주지 않기 때문에
	        	 System.out.println("검색어 입력 >>>");
	        	 String searchContent = sc.next(); //searchKeyword
	        	 
	        	 boolean flag = false; // 검색결과가 없는 상태로시작
	        	 
//	        	 학생부를 하나하나 확인하면서
	        	 System.out.println("================");
	        	 	for(int i=0; i<cnt ; i++) {
//	        	 학생의 이름안에 검색어가 있나? ===> 티모 == 모xxx티모안에 모가 있니?
	        	 		if(datas[i].contains(searchContent)) {	// 티모안에 모가 있니?
	        	 			System.out.println(datas[i]);
	        	 			flag=true;
	        	 		}
//	        	 있다면, 출력
//	        	 없다면 ,출력a x
	        	 	}
	        	 	
	        	 	if(!flag) { // 검색결과가 없다면
	        	 		System.out.println("검색결과가 없습니다...");
	        	 	}
	        	 	// 검색 결과가 없다면, 없다고 알려주기
	        	 	// 1. 검색 결과가 없다는 출력은 한번만! 수행하기 때무에반복문 바깥에 있어야함
	        	 	// 2.검색 결과가 없다는 사실은 검색을 다! 해봐야알수 있음
	        	 	// ====>flag 로직 대표적인 케이스!
	        	 	System.out.println("================");
	        	 
	        	 
	        	 
	        	 
	            
	         }
	         else if(menu==4) { // 번호로 검색 -> PK로 검색 == selectOne(getOne)
	           
	        	 // PK
	        	 // primary key : "데이터를 '식별'"할 수있게 해주는 값
	        	 // 예) 주민번호, 학번, ...
	        	 // 사용자가 지정하는 것이 아니라,프로그램에서 부여하는 값
	        	 // 현재 학생부 프로그램에서는 '번호' == PK
	        	 
	        	 
//	        	 경계값 검사란?
//
//	        			 조건식에 들어가있는 변수들이
//	        			 경계에 닿아있는 숫자들이어도
//	        			 해당 조건식이 유효한지 확인하는 것
//
//	        			 1<=num && num<=cnt
//
//	        			 cnt --->> 1보다 반드시 크거나 같아야함!
//	        			       cnt가 0일수있어?
//	        			       ㅇㅇ 가능함

	        	 // 경계값 검사
	        	 if(cnt <= 0){// 학생이 한명도 저장되어있지 않면
	        		 System.out.println("검샐할 학생 데이터가 없습니다!");
	        		 continue; // 프로그램 처음으로 돌아가
	        	 }
	        	 
	        	 int num;
	        	 while (true) {
	        		 System.out.println(("검샐할 학생의 번호 입력 >>"));
	        		 num = sc.nextInt();
	        	 // 사용자가 검색하고 싶은 번호를 입력 : 유효성 검사
	        		 if(1<=num && num <= cnt) { // 제대로 입력했다면 // 경계값 검
	        			 break;
	        			 
	        		 }
	        		 System.out.println("올바른 버호를 입력해주세요~!!");
	        		 //제대로 입력하라고 안내문구 출력
	        		 
	        	 }
	        	System.out.println(num +"번 학생의 이름은" + datas[num-1]+ "입니다.");
	        	 //사용자가 입력한 번호에해당하는 학생의 이름은
	        	 //datas[num-1]입니다.
	        	 

	         }
	         else if(menu==5) { // 이름변경
	        	 // UPDATE : update 처리할 대상 데이터가 특징되어있어야함!
	        	 // ex) 프로필 사진 변경, 닉네임 변경
	        	 
//	        	 변경할 학생의 번호 입력 >> oooo
	        	 
	        	 // 선례, 시장 조사를 안한 케이
//	        	 이름을 변경할 학생의 이름 입력 >> xxx
	        	 // 개발자는 잘 카피해야함
	        	 
	        	 // 이름을 변경할 학생의 번호 입력 >> 
	        	 // PK로 데이터를 특정한 후에 UPDATE를 진행해야
	        	 
	        	 if(cnt <= 0 ){// 학생이 한명도 저장되어있지 않면
	        		 System.out.println("검샐할 학생 데이터가 없습니다!");
	        		 continue; // 프로그램 처음으로 돌아가
	        	 }
	        	 int num;
	        	 while (true) {
	        		 System.out.println(("검샐할 학생의 번호 입력 >>"));
	        		 num = sc.nextInt();
	        	 	 if(1<=num && num <= cnt) { // 제대로 입력했다면 // 경계값 검
	        			 break;
	        			 
	        		 }
	        		 System.out.println("올바른 번호를 입력해주세요~!!"); 
	        	 }
	        	 //PK로 대상 특정짓는다는 부분이 selectOne와 닮을 수밖에 없다
	        	 
	        	 // 사용자가 A를 변하고 싶어한다.
	        	 System.out.println(num + "번 학생의 이름은" + datas[num-1]+"입니다");
	        	 
	        	 // B로 이름을 변경
	        	 // 정말 변경할 지 확인
	        	 String name;
		        	while(true) {
			        	 System.out.println("변경할 이름을 입력해주세요. >>"); // 사용자 이름입력
			        	 name = sc.next();
			        	 	
			        	 System.out.println("정말" +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])) {//저장하려는 이름이 이미 존재한다면
			        	 				
			        	 				// 사용자가 입력한 name값이
			        	 				// 학생부 데이터와 일치합니까?
			        	 				
			        	 				// 학생부에 name이 있는 상태
			        	 				flag=true;
			        	 				
//			        	 				if(num-1 == i) { 내 이전 이름이
//			        	 					이전 이름이라 안됨
//			        	 					
//			        	 				}else {
//			        	 					이미 사용중인 이름입니다....
			        	 					
//			        	 				}
			        	 				
			        	 				System.out.println(name + "은(는) 이미 존재하는 이름입니다."
			        	 						);
			        	 			}
			        	 		}
			        	 		
			        	 		if(!flag) { // 만약 저장되어있지 않다면 == !(학생부에 저장되어 있다면)
			        	 			break;
			        	 		}
			        	 	}
		        	}
		        	// 새로운 데이터를 입력한다는 점에서 create와 닮아 있다
		        	
		        	
	        	 // A자리에 B 데이터 저장
		        	datas[num-1]=name;
	        	 
	        	 
	        	 
	        }
	         else { // 유효성 검사
	            System.out.println("제대로 입력해주세요~~");
	         }
		}
		
		
		
		
		
	}
}