javaboiii의 JAVA/JAVA 예제

JAVA - [제어문] 학생부 프로그램

javaboiii 2024. 6. 28. 23:03

JAVA

 

요구사항

"학생부 프로그램"
사용자의 첫번째 요구사항
 1. 최대 5명까지 저장할 수 있는 학생부가 있습니다
 2. 학생부 프로그램을 작성해주세요
----------------------------------------------
C : 학생추가(동명이인 X)
R : 학생부를 전체출력 / 학생 이름으로 검색 >>selectAll
R : 1번 학생 이름 출력 >> selectOne, getOne
	※ 같은 R이여도 All이 있고, One이 있다
U : 학생의 이름 변경

(D : 학생 삭제 >> 배열에서는 삭제가 불가능
(그래서 D를 하는 모든 프로그램에서는 배열을 사용하지 않음))
-------------------------------------------------

 

프로그램에서 모든 요구사항은 CRUD로 귀결된다.

데이터
create 생성 	회원가입	게시글 작성 상품 구매
read 출력 	로그인		게시글 검색 
update 변경	프로필사진변경	글 변경 상품 구매
delete 삭제	회원탈퇴	글 삭제

 

CRUD는 비즈니스 매서드, 비즈니스 로직, 핵심 로직, 핵심 관심 이라고도 말한다.

 

 

개발자는 제작할 때

1. 샘플 데이터 확보

ex) 학생이 존재한다고 가정하고,

 

2. R(selectAll)부터 제작

====>> 임의의 데이터를 생성해 놓고, 잘 출력이 되는지 확인한다.

 

유효성 검사는 더 넓은 범위로, 꼼꼼하게 --

(사용자의 입력마다 하면 좋음)

 


 

import java.util.Scanner;

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

        datas[0] = "티모"; 
        datas[1] = "아리";
        datas[2] = "모르가나";	
        int cnt = 3;
        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) {
            // 학생추가
            else if(menu==2) {
            // 학생부 전체출력
            }
            else if(menu==3) {
            // 이름으로 검색 
            }
            else if(menu==4) { 
            // 번호로 검색
            }
            else if(menu==5) {
            // 이름변경
            }
            else { // 유효성 검사
            System.out.println("제대로 입력해주세요~~");
            }
		}
	}
}

 

 


 

 

학생부 전체 출력

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==1) {
	// 학생추가
	if(cnt >= datas.length) { // 학생 5명보다 더 추가한다면
		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;

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

			if(!flag) {
				break;
			}
		}
	}

	datas[cnt]=name; // 학생 추가
	cnt++; // 총학생수 증가

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

 

중복 검사 알고리즘

플래그(flag) 알고리즘

>> 어떤 기능을 할지 말지 결정할 때 유용하다

 

 

 

 

 

 

 

사용자 이름입력

사용자가 의도한 이름이라면

if(저장하려는 이름이 이미 존재한다면)

위로 다시 돌아가기

 

 

저장

 

 


 

이름으로 검색

본인이 쓴 코드

나는 정말 "이름"을 검색했다.

 

 

else if(menu==3) { // 이름으로 검색
	// 검색어를 입력 >>
	// 이 검색어가 맞습니까? 는 하지 않음 => 사용자가 하는 입력이 데이터에 변화를 주지않기 때문
	System.out.println("검색어 입력 >>");
	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; // 검색 결과를 찾은 상태
		}
	// 된다면, 출력
	// 없다면, 출력 X
	}
	// 검색결과가 없다면, 없다고 알려주기
	// 1. 검색결과가 없다는 출력은 한번만! 수행하기 때문에 반복문 바깥에 있어야됨
	// 2. 검색결과가 없다는 사실은 검색을 다 -- 해봐야할 수 있음
	// ===>> flag 로직 대표적인 케이스 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	if(!flag) { // 검색 결과가 없다면
		System.out.println("검색결과가 없습니다");
	}
	System.out.println("===============");
}

출력 결과

 


 

번호로 검색

본인이 쓴 코드

 

계속 콘솔에 의존하며 코드를 쓴다

좋지 않은 습관

 

else if(menu==4) { // 번호로 검색 => PK로 검색 == selectOne(getOne)
	// Primary Key : "데이터를 '식별'"할 수 있게 해주는 값
	// ex) 주민번호, 학번, ...
	// 사용자가 지정하는 것이 아니라, 프로그램에서 부여하는 값
	// 현재 학생부 프로그램에서는 '번호' == PK

	// 경계값 검사
	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]+" 입니다.");
	// 사용자가 입력한 번호에 해당하는 학생의 이름은
	// datas[num-1] 입니다.
}

 

 


 

이름 변경

UPDATE == SelectOne + Create ===================

 

UPDATE 처리할 대상 데이터가 특정 되어있어야됨

ex) 프로필 사진 변경, 닉네임 변경, ....

 

이름을 변경할 학생의 번호 입력 >>

PK로 데이터를 특정한 후 UPDATE를 진행해야된다

 

이름을 변경할 학생의 이름을 입력 >> 라고 쓰면 

선례, 시장 조사를 안한 케이스다

 

EX)

비밀번호 변경
abcd

새로운 비밀번호 입력
abcd >> xx

1. 내가 이미 있는 이름으로 변경을 시도했을 때,
2. 내가 나의 이전이름으로 (같은 이름으로) 변경을 시도했을 때,

구분이 필요함


=======================================================

 

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("올바른 번호를 입력해주세요!~~");
	}
	// PK로 대상을 특정짓는다는 부분이 selectOne와 닮을수밖에 없다!!!!!


	// 사용자가 A를 변경하고싶어한다.
	System.out.println(num+"번 학생의 이름은 "+datas[num-1]+" 입니다.");


	// B로 이름을 변경
	// 정말 변경할지 확인
	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;
					//if(num-1 == i) { //내 이전 이름이면
					//이전이름이라 안됨
					//}
					//else {
						//이미 사용중인 이름
					//}
				System.out.println(name+"은(는) 이미 존재하는 이름입니다...");
				}
			}


			if(!flag) {
				break;
			}

		}
	}
	// 새로운 데이터를 입력한다는 점에서 CREATE와 닮았다!~~


	// A 자리에 B 데이터 저장
	datas[num-1]=name;

}

 

 

본인은 이름으로 검색해서 변경하는 코드를 썼다....

 


 

경계값 검사란

조건식에 들어가있는 변수들이

경계에 닿아있는 숫자들이여도

해당 조건식이 유효한지 확인하는 것

 

 

'javaboiii의 JAVA > JAVA 예제' 카테고리의 다른 글

JAVA - [함수] 학생부 프로그램 함수화  (0) 2024.07.01
JAVA - 함수 예제  (0) 2024.07.01
JAVA - 이중for문(중첩 반복문) 예제  (0) 2024.06.27
JAVA - 반복문 예제  (0) 2024.06.26
JAVA - 조건문 예제  (0) 2024.06.26