JAVA_함수 만들기_#1_학생부 프로그램_★ 설계 : LP UF ERD ★
[ 학생부 프로그램 만들기 with 함수 ]
>> 설계 : LP EF ERD
< LP >
: 사용자가 어떤 기능을 사용할지 == CURD (비즈니스 메소드 / 핵심로직 / 핵심관심)
- C : 학생추가
- R : 학생목록출력, 학생 1명 검색
- U : 학생 정보 변경
- D : 학생삭제
- 프로그램 종료
< UF >
: 사용자가 어떤 순서로 프로그램을 이용하는지, 화면에 대한 모든 구성과 구성요소
1. 추가
2. 목록출력
3. 검색
4. 변경
5. 삭제
0. 종료
< ERD >
: 프로그램에서 활용하는 데이터에 대한 모든 정의 >> DB를 배우고 더 자세히 설명
- int[] 학생 점수 데이터, 최대 3명까지 저장 가능
* 유효성 검사
: 사용자가 "입력"이라는 행위를 한다면, 무조건 잘못된 사용법으로 입력할 수도 있기 때문에 검사해줘야 함
* 기능 추가(or 변경)
ex1) "1등 출력"이라는 기능 추가
ex2) "목록 출력" >> "50점 이상 학생만 출력"으로 기능 변경
[ 모듈화 ]
== 컴포넌트화, 캡슐화, 리팩토링, 패키징, 함수화, 메소드화,...
# 모듈
- 단독 수행할 수 있는 코드 묶음
- 독자적인 기능이 존재하는 코드
# 기존 학생부 프로그램은,
전체 코드중에 단 한줄이라도 문제가 생기면 동작이 불가능했음
== 결합도가 높은 코드
== 응집도가 낮은 코드
# 오늘 만들 프로그램은,
각 기능들을 각각의 함수로 묶어서 별도로 관리할 예정.
함수 1개가 코드 수정중이더라도 전체 프로그램은 사용가능
== 결합도가 낮은 코드
== 응집도가 높은 코드
▶ 원래 존재하던 기능을 "함수화" 시키는 것 == 모듈화
[ 함수 작성 방법 ]
1. 메소드 시그니처 파악
2. 함수 유형 선언
3. 함수 3요소(input, output, 기능) 고려
→ 함수를 먼저 작성하는 방식은 main()에서 활용되는 것까지 고려해야 하기 때문에
설계했던 함수 3요소에도 변화가 생길 수 있음 → 지양;;
→ 웬만하면 main()에서 먼저 만들고 함수 만들기!
# 학생부 프로그램_ver0.1
package freefree;
import java.util.Random;
import java.util.Scanner;
public class Student01 {
// [1] 샘플 추가
// main()에서 배열과, index를 받아와야하므로 매개변수 생성
public static void sample(int[] stuArr, int index) {
// 점수 랜덤으로 받기위해 Random()매소드 선언
Random rand = new Random();
// 0~100범위에서 값하나를 받아 배열에 대입,stuArr[0]
stuArr[index] = rand.nextInt(101);
System.out.println((index + 1) + "번학생 점수 : " + stuArr[index] + "점");
System.out.println((index + 1) + "번학생 추가완료!");
// ① 빨간밑줄 ▷ 인자로 데려와야하는 변수
// ② main()에서도 적용이 되었는지 확인
// : main()측의 index는 변경되지 못함! --> call by value
// ③ return으로 변경? VS main()에서 직접 변경?
// : index값의 변화가 ++로 고정이어서(단순해서) 직접 변경 O
}
// [1] 학생추가
public static void insertStu(int[] stuArr, int index, Scanner scan) {
//
while (true) {
System.out.println((index + 1) + "번 학생 점수 입력 : ");
int score = scan.nextInt();
if (score <= 100 && score >= 0) {
stuArr[index] = score;
break;
}
}
}
//[1-1] 학생추가유효검사
public static boolean checkInsert(int[] stuArr, int index) {
//if(T) : 학생수가 배열의 수 이상이면
if(index >= stuArr.length) {
System.out.println("학생부가 가득찼어요ㅠㅠ");
//false 리턴 , 메소드 종료! , 아래 소스코드는 읽히지 않음
return false; //
}
//if(F) : true 리턴 , 메소드 종료!
return true; //
}
public static void main(String[] args) {
// 학생의 정보를 사용자에게 받아오기 위해 Scanner선언
Scanner sc = new Scanner(System.in);
// 학생 3명을 받을 수 있다고 가정
int[] stuArr = new int[3];
// 현재 저장된 학생을 알기위해 index 변수선언
int index = 0;
// stuArr:저장공간을 알려주는 주소를 넘겨줌
// index:값을 메소드에게 전달
// index++은 연산자 우선순위 때문에 대입 후 실행
// sample(stuArr,index++); //index==0 메소드 전달
// sample(stuArr,index++); //index==1 메소드 전달
// 몇번 반복할지 모르니 while문 사용(조건은 항상 true-->실행)
while (true) {
System.out.println();
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.print("입력 >> ");
// 프로그램 몇번을 선택할지 사용자에게 받아오는 변수선언
int action = sc.nextInt();
System.out.println();
// [0]
// 종료 번호를 입력하면 프로그램이 끝나니 break를 입력
// 죵료는 while문을 끝내야하므로 그냥 둠
if (action == 0) {
System.out.println("프로그램 종료.");
break;
}
//샘플
// else if(action == 1) {
// System.out.println("학생 추가.");
// sample(stuArr, index++);
// }
//[1] 학생추가
else if (action == 1) {
//if조건이 true라면 continue
//continue아래 코드 실행 X --> while문 처음부터 다시 실행
if(!checkInsert(stuArr, index)) {
continue;
}
//if조건이 false라면 아래 학생 추가 메소드 실행
insertStu(stuArr, index++, sc); //main()에서 ++해줘야 함
}
}
}
}
# 학생부 프로그램_ver0.2
package practice;
import java.util.Random;
import java.util.Scanner;
public class Practice03 {
public static boolean maxStu(int index, int stuArr[]) {
if(index >= stuArr.length) {
System.out.println("학생부가 가득 찼습니다.");
return false;
}
return true;
}
public static void stuAdd(int index, int stuArr[]) {
stuArr[index] = new Random().nextInt(101);
System.out.println(index+1 + "번 학생 점수 : " + stuArr[index]);
}
public static void printInfo(int index, int stuArr[]) {
for (int i = 0; i < index; i++) {
System.out.println(i);
if(stuArr[i] != 0) {
System.out.println(i+1 + "번 학생 점수 : " + stuArr[i]);
}
}
}
public static void search(Scanner sc, int index, int stuArr[]) {
System.out.println("몇 번 학생을 검색하시겠어요?");
int num = sc.nextInt();
if(num>0 && num<=index && stuArr[num-1] != 0) {
System.out.println(num + "번 학생 점수 : " + stuArr[num-1]);
}
else {
System.out.println("찾는 학생이 없습니다.");
}
}
public static void update(Scanner sc, int index, int stuArr[]) {
System.out.println("몇 번 학생의 점수를 변경하시겠어요?");
int num = sc.nextInt();
if(num>0 && num<=index && stuArr[num-1] != 0) {
stuArr[num-1] = new Random().nextInt(101);
System.out.println(num + "번 학생 점수 : " + stuArr[num-1]);
}
else {
System.out.println("찾는 학생이 없습니다.");
}
}
public static void delete(Scanner sc, int index, int stuArr[]) {
System.out.println("몇 번 학생을 삭제하시겠어요?");
int num = sc.nextInt();
if(num>0 && num<=index && stuArr[num-1] != 0) {
stuArr[num-1] = 0;
System.out.println(num + "번 학생 삭제!");
}
else {
System.out.println("찾는 학생이 없습니다.");
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] stuArr = new int[3];
int index = 0;
int action = 0;
while(true) {
System.out.println();
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.print("입력 >> ");
action = sc.nextInt();
if(action == 0) {
System.out.println("프로그램 종료");
break;
}
else if(action == 1) {
if(!maxStu(index, stuArr)) {
continue;
}
stuAdd(index++, stuArr); //메소드 사용후 ++
}
else if(action == 2) {
printInfo(index, stuArr);
}
else if(action == 3) {
search(sc, index, stuArr);
}
else if(action == 4) {
update(sc, index, stuArr);
}
else if(action == 5) {
delete(sc, index, stuArr);
}
else {
System.out.println("잘못입력. 다시입력.");
}
}
}
}
# 학생부 프로그램_ver0.3
package practice;
import java.util.Random;
import java.util.Scanner;
public class Practice03_Student {
public static boolean maxStu(int index, int stuArr[]) {
if (index >= stuArr.length) {
System.out.println("학생부가 가득 찼습니다.");
return false;
}
return true;
}
public static void stuAdd(int index, int stuArr[]) {
stuArr[index] = new Random().nextInt(100) + 1;
System.out.println(index + 1 + "번 학생 점수 : " + stuArr[index]);
}
public static void printInfo(int index, int stuArr[]) {
for (int i = 0; i < index; i++) {
if (stuArr[i] != 0) {
System.out.println(i + 1 + "번 학생 점수 : " + stuArr[i]);
}
}
}
public static void search(Scanner sc, int index, int stuArr[]) {
System.out.println("몇 번 학생을 검색하시겠어요?");
stuCheck(index, stuArr, "search");
}
public static void update(Scanner sc, int index, int stuArr[]) {
System.out.println("몇 번 학생의 점수를 변경하시겠어요?");
stuCheck(index, stuArr, "update");
}
public static void delete(Scanner sc, int index, int stuArr[]) {
System.out.println("몇 번 학생을 삭제하시겠어요?");
stuCheck(index, stuArr, "delete");
}
public static void stuCheck(int index, int stuArr[], String type) {
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
if (num > 0 && num <= index && stuArr[num - 1] != 0) {
if (type.equals("search")) {
System.out.println(num + "번 학생 점수 : " + stuArr[num - 1]);
} else if (type.equals("update")) {
stuArr[num - 1] = new Random().nextInt(100) + 1;
System.out.println(num + "번 학생 점수 : " + stuArr[num - 1]);
} else if (type.equals("delete")) {
stuArr[num - 1] = 0;
System.out.println(num + "번 학생 삭제!");
} else {
System.out.println("type의 변수가 잘못됨");
}
} else {
System.out.println("찾는 학생이 없습니다.");
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] stuArr = new int[3];
int index = 0;
int action = 0;
while (true) {
System.out.println();
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.print("입력 >> ");
action = sc.nextInt();
if (action == 0) {
System.out.println("프로그램 종료");
break;
} else if (action == 1) {
if (!maxStu(index, stuArr)) {
continue;
}
stuAdd(index++, stuArr); // 메소드 사용후 ++
} else if (action == 2) {
printInfo(index, stuArr);
} else if (action == 3) {
search(sc, index, stuArr);
} else if (action == 4) {
update(sc, index, stuArr);
} else if (action == 5) {
delete(sc, index, stuArr);
} else {
System.out.println("잘못입력. 다시입력.");
}
}
}
}