재밌고 어려운 IT를 이해해보자~!

학생부 프로그램 제작 본문

코리아IT핀테크과정

학생부 프로그램 제작

언제나즐거운IT 2023. 11. 25. 18:53

프로그램 

프로그램의 정의는 다음처럼 되어있다.

1. 어떠한 일의 진행 계획이나 순서.
2. 어떤 문제를 해결하기 위해 컴퓨터에 자료 처리 방법과 순서를 기술한 일련의 명령문의 집합체

 

비슷한 말로는 sw, 어플리케이션,앱 등이 있고 항상 고객의 needs 에 따라서 제작하는 것이 중요하다.

우리는 명령어를 통해 고객이 쓰기 좋은 학생부 프로그램을 제작 해 볼것이다.

 

제작하기에 앞서 명령어를 바로 치는것이 아닌 설계단계를 꼭 거쳐야한다.

고객의 사용하는 주요기능

 

CRUD

Create, Read, Update, Delete를 뜻하며 

데이터를 다루는 주요 비지니스 메서드, 핵심 로직, 관심 이다.

 

학생부 프로그램의 설계를 진행해보자.

 

[1] 설계 : 학생부 CRUD 생각해보기 => LP 로직 프로세스
C : 학생 추가
R : 학생 전체 정보 불러오기 / 특정 학생 1명 정보 불러오기(==검색,탐색) / 1등 정보 출력하기
U : 학생 점수 정보 변경하기
D : 학생 삭제

[2] 설계 : 데이터 정의 => ERD 데이터 설계
학생부에 저장되는 데이터란? => 학생 "점수" 데이터
int가 편하니까, 학생 점수(정수) 데이터를 다뤄보자!

[3] 설계 : 전체 사용자의 흐름 생각해보기 => UF 사용자 흐름
① 프로그램이 언제 종료되는가?
입장 >> 사용자가 "나가기" 기능을 수행하기전에는 절대 프로그램을 종료시키면 안됨!
② 기능의 개수가 몇개일까? >> CRUD 체크하기. 

1. 학생 추가하기
2. 학생 전체 정보 불러오기

3. 특정 학생 1명 검색해서 정보 불러오기

4. 1등 정보 불러오기
5. 학생 점수 정보 변경하기
6. 학생 정보 삭제하기
7. 프로그램 종료

CRUD 6개 + 나가기 총 7개 !!!!!

 

프로그램 제작 전 생각하기

1번 학생 추가하기를 만들기 전에 생각하고 구상을 먼저 해보자. 

 

1번 학생을 추가합니다.
학생 점수 입력 >> 150
점수는 0~100점까지 입력 가능합니다.
확인 후 다시 입력해주세요!

1번 학생을 추가합니다.
학생 점수 입력 >> -30
점수는 0~100점까지 입력 가능합니다.
확인 후 다시 입력해주세요!

 

1번 학생을 추가합니다.
학생 점수 입력 >> abc#@#!

점수는 0~100점까지 입력 가능합니다.

확인 후 다시 입력해주세요!


1번 학생을 추가합니다.

학생 점수 입력 >> 제대로입력
1번 학생 추가완료!

 

항상 고객은 실수를 할 수 있고 그에대한 예외처리를 잘 생각해줘야한다.

고객이 개발자가 원하지 않는 행동을 한다고해서 프로그램이 멈추거나 죽거나하는 이상이 생기면 안된다.

개발자가 원하는 정보가 들어올 수 있도록 설명을 해주고 기회를 줘야한다.

모든 예외적인 상황을 잘 생각해보자

 

 

[2] 한글 코딩 ★ 
while(true){ // 무한루프
   1번 학생을 추가합니다.
   학생 점수 입력 >> 입력값
   if(입력값이 제대로되었다면){ // 종료조건
      1번 학생 추가완료!
      break;
   }
   else{
   점수는 0~100점까지 입력 가능합니다.
    확인 후 다시 입력해주세요!
   }
}

 

한글로 원하는 코드를 구체적으로 구상해 놓는다면 실제 코드를 짜는 시간은 얼마 걸리지 않는다.

그만큼 한글코딩은 중요하다!

 

[3]코딩

else if (action == 1) {
    while (true) {
                        System.out.println((index + 1) + "번 학생을 추가합니다.");
                        System.out.println("학생 점수 입력 >>");
                        int score = sc.nextInt();

                        // 유효성 검사
                        // :사용자의 거의 모든 입력값에 대하여 수행하는값
                        // 목적 == 에러 최소화
                        if ((score >= 0) && (score <= 100)) {
                            student[index++] = score;
                            System.out.println(index + "번 학생 추가완료!");
                            System.out.println();
                            break;
                        } else {
                            System.err.println("점수는 0~100까지 입력 가능합니다.");
                            System.err.println("다시 입력해주세요!");
                        }
                    }
}

코딩을 다 한 후에 예외처리나 추가를 해야할 것을 생각하고 수정한다.

 

학생 배열이 전부 입력되어 꽉차있는가 ?
맞다면 -> 해당프로그램은 5명까지 지원하고 있습니다. 관리자에게 문의해주세요

아니라면 계속진행

 

 

1번 최종적으로 다음과 같은 코드가 된다.

else if (action == 1) {

				System.out.println();

				if (student.length <= index) {
					System.err.println("해당 프로그램은 " + student.length + "명까지 지원하고있습니다.");
					System.err.println("관리자에게 문의해주세요");
					System.out.println("");

					// 반복문을 멈추고싶지는않은데,
					// 한스텝 쉬고싶을때
					continue;
					// 해당 반복문의 처음으로 즉시이동
					// break는 반복문을 멈춰버리는것
					// ->while 문의 가장 처음으로 돌아간다!!!!!!!!!
				}

				while (true) {
					System.out.println((index + 1) + "번 학생을 추가합니다.");
					System.out.println("학생 점수 입력 >>");
					int score = sc.nextInt();

					// 유효성 검사
					// :사용자의 거의 모든 입력값에 대하여 수행하는값
					// 목적 == 에러 최소화
					if ((score >= 0) && (score <= 100)) {
						student[index++] = score;
						System.out.println(index + "번 학생 추가완료!");
						System.out.println();
						break;
					} else {
						System.err.println("점수는 0~100까지 입력 가능합니다.");
						System.err.println("다시 입력해주세요!");
					}
				}
			}

 

전체 프로그램을 작성해보자!

 

package class01;

import java.util.Arrays;
import java.util.Scanner;


public class Test01 {
	public static void main(String[] args) {
		// 변수 선언하기
		// 여러명의 학생 점수 데이터를 저장할 예정
		// 몇개인지 정확하지 않아서 배열은 원래 사용 XXX
		// 그래서! 우리는! 학생의 최대 명수를 고정하고 사용!
		// 학생 최대 5명까지 저장가능한 프로그램 ☆
		int[] student = new int[5];
		int index = 0; // 현재 저장된 학생의 명수
		// 프로그램을 만들때에는 R->C
		// 출력이 잘 되는지 확인하기 위해, "샘플데이터가" 필요!

		Scanner sc = new Scanner(System.in);
		// 사용자의 입력을 받아들이는 클래스(객체)
		// 2명의 학생정보를 임의로 추가하겠습니다.
		// student[index++]=67;
		// student[index++]=39;

		// 프로그램이 몇번 동작하는지 정확히 모름!
		while (true) { // 무한루프와
			System.out.println("================");
			System.out.println(" ★학생부 프로그램★");
			System.out.println("================");
			System.out.println(" 1. 학생 추가하기");
			System.out.println(" 2. 학생 전체 정보 불러오기");
			System.out.println(" 3. 특정 학생 1명 검색해서 정보 불러오기");
			System.out.println(" 4. 1등 정보 불러오기");
			System.out.println(" 5. 학생 점수 정보 변경하기");
			System.out.println(" 6. 학생 정보 삭제하기");
			System.out.println(" 7. 프로그램 종료");
			System.out.println("================");
			System.out.println("번호입력>> ");
			int action = sc.nextInt();

			if (action == 7) { // 종료조건
				System.out.println("학생부 푸로그램을 종료합니다...");
				break;
			}

			else if (action == 1) {

				System.out.println();

				if (student.length <= index) {
					System.err.println("해당 프로그램은 " + student.length + "명까지 지원하고있습니다.");
					System.err.println("관리자에게 문의해주세요");
					System.out.println("");

					// 반복문을 멈추고싶지는않은데,
					// 한스텝 쉬고싶을때
					continue;
					// 해당 반복문의 처음으로 즉시이동
					// break는 반복문을 멈춰버리는것
					// ->while 문의 가장 처음으로 돌아간다!!!!!!!!!
				}

				while (true) {
					System.out.println((index + 1) + "번 학생을 추가합니다.");
					System.out.println("학생 점수 입력 >>");
					int score = sc.nextInt();

					// 유효성 검사
					// :사용자의 거의 모든 입력값에 대하여 수행하는값
					// 목적 == 에러 최소화
					if ((score >= 0) && (score <= 100)) {
						student[index++] = score;
						System.out.println(index + "번 학생 추가완료!");
						System.out.println();
						break;
					} else {
						System.err.println("점수는 0~100까지 입력 가능합니다.");
						System.err.println("다시 입력해주세요!");
					}
				}
			}

			else if (action == 2) { // 전체 출력
				if (index <= 0) { // 혹시모를 -일수있기 때문에 이렇게 쓰는게 더좋다 == 보다
					System.err.println("입력된 학생의 정보가 없습니다!!!!");
				} else {
					System.out.println("전체 출력");
					// 처음부터 존재하는 학생만큼 출력하기
					// 범위가 존재 => for문
					for (int i = 0; i < index; i++) {
						System.out.println((i + 1) + "번 학생의 점수는 " + student[i] + "점입니다.");
					}
					System.out.println();
				}
			}

			else if (action == 3) { // 학생 검색
				// 1) 학생의 번호를 사용자가 입력
				// 2) 해당 번호의 학생 점수 정보가 출력
				if (index <= 0) {
					System.err.println("입력된 학생의 정보가 없습니다!!!!");
				} else {
					System.out.println("검색할 학생 번호 입력 >>");
					int stuNum = sc.nextInt();
					if (stuNum < 1 || index < stuNum) { // 사용자가 잘못된 입력을 했다면 == 범위 외 입력
						System.err.println("해당 번호를 가진 학생은 존재하지 않습니다.");
						System.err.println("확인 후 다시 이용해주세요....");
					} else {
						System.out.println(stuNum + "번 학생은" + student[stuNum - 1] + "점 입니다.");
					}

					System.out.println();
				}
			}

			else if (action == 4) {

				if (index <= 0) {
					System.err.println("입력된 학생의 정보가 없습니다!!!!");
				} else {

					int maxIndex = 0;
					for (int i = 1; i < index; i++) {
						if (student[maxIndex] < student[i]) {
							maxIndex = i;
						}
					}
					System.out.println();
					System.out.println("입력된 학생중에서 1등학생의 번호와 점수는 ! ! ! ");
					System.out.println("1등학생 번호 : " + (maxIndex + 1) + "번" + "\n1등학생 점수 : " + student[maxIndex] + "점");

				}
				System.out.println();
			}

			else if (action == 5) {

				if (index == 0) {
					System.err.println("변경할 학생 데이터가 하나도 없습니다.");
					System.err.println("학생 부터 추가해 주세요");
					continue;
				}

				System.out.println("점수 변경할 학생의 번호를 입력하세요 >>");
				int stuNum = sc.nextInt();

				if (stuNum <= index && stuNum > 0) {
					System.out.println(stuNum + "번은 현재" + student[stuNum - 1] + "점 입니다.");

					while (true) {
						System.out.println("새로운 점수를 입력해주세요");
						int score = sc.nextInt();
						if (score != student[stuNum - 1] && score >= 0 && score <= 100) {
							student[stuNum - 1] = score;
							System.out.println(stuNum + "번은 " + student[stuNum - 1] + "점으로 변경되었습니다!");
							break;
						} else if (score == student[stuNum - 1]) {
							System.out.println("기존값과 동일한 점수를 입력하셨습니다." );
							System.out.println("점수를 그대로 유지할까요?? 맞으면  y 아니면 n 입력");
							String ans = sc.next();
							if (ans.equals("y")) {
								System.out.println("y를 선택했습니다. 기존 점수 유지");
								break;
							} else if (ans.equals("n")) {
								System.out.println("n을 입력했습니다. 점수를 다시 입력하세요");
							} else {
								System.out.println("잘못입력");
							}
						} else {
							System.err.println("점수가 이상하다 재입력!!!!!!");
						}
					}
				} else {
					System.err.println("해당 학생은 없습니다~");
					continue;
				}
			}

			else if (action == 6) { // 정보 삭제

				// 배열은 추가,삭제가 안됨
				// 배열 자체를 추가하거나 삭제할수없음
				// 지금은, 마지막 학생 제거로 한다.
				System.out.println();

				if (index <= 0) {
					System.err.println("제거할 정보가 없습니다...");
					System.out.println();
					continue;
				}

				System.out.println(index + "번 학생 정보를 제거합니다...");
				index--;
				System.out.println("제거 완료!");
				System.err.println();
			}

		}
	}
}

 

다음 프로그램을 제작하면서 배웠던 부분들

 

1. Scanner()
Scanner sc = new Scanner(System.in);
사용자의 입력을 받아들이는 클래스(객체)

sc객체를 만들어 .키워드를 사용해 원하는 자료형변수에 사용자의 입력을 저장 할 수 있다.

int action = sc.nextInt(); -> Int형 변수 action에 사용자의 입력을 받음 (Only Int값입력가능)

 

2. break, continue

continue;

반복문을 멈추고싶지는않은데 한스텝 쉬고싶을때 사용한다.
해당 반복문의 처음으로 즉시이동


break

는 반복문을 종료시켜버린다. 

해당 프로그램에서 while루프 안에 while 루프를 break하면 밖의 와일루프 가장 처음으로 이동하게된다.

 

3.

조건을 만족시킬때 인덱스증가를 보통

if ((score >= 0) && (score <= 100)) {
student[index] = score;

index++

}

이렇게 사용하였는데 다음도 같은 코드이다.

if ((score >= 0) && (score <= 100)) {
student[index++] = score;

 

4. 

index가 0일떄 다음을 해라 를 작성할때는 

if (index == 0) {

}

보단 

if (index <= 0) {

}

혹시모를 마이너스까지 허용시켜줌으로써 에러가 덜날 수 있다.

 

5. break label

다중반복문 한번에 종료할 수 있다.

코드를 작성할 때 3중첩 반복문이 되어서 가장 안쪽 반복문에서 메인 반복문으로 한번에 나가고싶었는데

어떻게 해야할지 몰라서 찾아보았다.

원하는 위치에 라벨을 지정해주고 break (라벨명) 을 통해서 라벨을 한 위치로 이동할 수 있다.

public class LabelTest {
	public static void main(String[] args) {
    		A: // 저는 라벨명을 A 로 지정하겠습니다.
		while(true) {
			for(int i=0; i<10; i++) {
				if(i == 5) {
                	System.out.println();
					break A;
				}
				System.out.println(i);
			}
		}
	}
}

다음 반복문을 실행시키면

01234 가 출력된다.

 

6.라인 depth

break문이 오는걸 먼저 쓰면 라인의 깊이가 깊지 않아진다!

while (true) {
	num = scan.nextInt();
	if (num != 0) { 
		if (num >= 0 && num < 10) { 
			// 썸띵 원하는 동작
		}
		else { System.out.println("잘못된 입력입니다."); }
	} else break; 
}
while (true) {
	num = scan.nextInt();
	if (num == 0) break;
	if (num < 0 || num >= 10) { 
		System.out.println("잘못된 입력입니다."); continue;
	}
	//섬띵 원하는 동작
	}

break; continue; 문이 올땐 먼저 그 조건문을 입력해준다면 depth를 많이 줄일 수 잇다!

 

'코리아IT핀테크과정' 카테고리의 다른 글

버블정렬 코드 개선  (0) 2023.11.27
이진 탐색(Binary Search)  (2) 2023.11.26
배열(Array)  (3) 2023.11.23
형변환, 반복문  (0) 2023.11.22
JAVA, Class, 함수, 디버깅표  (0) 2023.11.22
Comments