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 |