JAVA/JAVA_복습문제

JAVA_함수 만들기_#1_학생부 프로그램_★ 설계 : LP UF ERD ★

onivv 2023. 11. 28. 23:39

[ 학생부 프로그램 만들기 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("잘못입력. 다시입력.");
			}
		}
	}
}