학생부 프로그램 만들기 (이어서)

2024. 7. 3. 10:02·JAVA

며칠 전에도 학생부 프로그램을 만들어보았다.

처음에는 함수를 이용하지 않고, 두번째에는 함수를 이용해서 만들었다.

https://yn98.tistory.com/12

 

JAVA 함수를 이용해서 학생부 프로그램 만들기

아래는 함수를 이용하지 않고 MAIN에다가 전부 입력해서 프로그램을 만들어놓은 예시이다.import java.util.Scanner;public class Test01 { public static void main(String[] args) { String[] datas = new String[5]; Scanner sc=new Sc

yn98.tistory.com

 

이번에는 조금 더 업그레이드 해서 학생부를 학생데이터로 이용해서 만들어보았다. (CRUD)

요구사항은 이렇다.

더보기

<<< CRUD 정의하기>>>
C  학생추가

R 학생 전체 목록 출력 selectAll
학생PK를 검색해서 출력 selectOne
학생이름으로 검색해서 출력 selectAll
1등출력 selectAll
등급으로출력 selectAll

U 재시험을 봐서 성적에 변화가 생긴 경우

샘플데이터 >> 전체출력 >> CREATE 데이터를 추가

                        System.out.println("===== 메 뉴 =====");
			System.out.println("1. 학생추가"); // 학생이름, 점수
			System.out.println("2. 전체목록출력"); 
			System.out.println("3. 번호검색"); // 번호 입력받기
			System.out.println("4. 이름검색"); // 이름 입력받기
			System.out.println("5. 1등출력"); // 1등 출력(동점자 있으면 동점자도 함께 출력)
			System.out.println("6. 등급검색"); // 등급 입력받기
			System.out.println("7. 재시험"); // 7번 입력 시 10점 추가
			System.out.println("0. 프로그램 종료");
			System.out.println("===============");

 

아래는 위에 요구사항에 따라 내가 짜본 코드이다.

package class05;

import java.util.Scanner;

class Student {
	int num;
	String name;
	int score;
	char grade;
	Student(int num,String name){
		this(num,name,0);
	}
	Student(int num,String name,int score){
		this.num=num;
		this.name=name;
		this.score=score;
		this.grade='C';
		if(this.score>=80) {
			this.grade='A';
		}
		else if(this.score>=60) {
			this.grade='B';
		}
	}

	void printInfo() {
		System.out.println(this.num+"번 "+this.name+" "+this.score+"점 "+this.grade+"등급");
	}

	char calculateGrade(int score) {
		if (this.score >= 80) {
			return 'A';
		} else if (this.score >= 60) {
			return 'B';
		} else {
			return 'C';
		}
	}
	void retakeExam() {
		this.score += 10; // 점수 10점 추가
		this.grade = calculateGrade(this.score); // 등급 재계산
	}

}

public class Test01 {

	public static boolean isEmpty(int cnt) {
		if(cnt<=0) {// 아직 저장된 학생 데이터가 전혀 없을때
			System.out.println("데이터가 없습니다!");
			return true;
		}
		return false;
	}
	public static boolean isFull(int cnt,Student[] datas) {
		if(cnt>=datas.length) {// 더 이상 학생 데이터를 저장할 수 없을때
			System.out.println("저장가능한 공간이 없습니다!");
			return true;
		}
		return false;
	}



	public static void main(String[] args) {

		Scanner sc=new Scanner(System.in);

		int PK=1001; // 시스템에서 부여하는 PK값
		int cnt=0; // 현재 배열에 저장된 데이터의 개수
		Student[] datas=new Student[3];
		datas[0]=new Student(PK++,"티모",50);
		cnt++;

		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. 1등출력");
			System.out.println("6. 등급검색");
			System.out.println("7. 재시험");
			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) { // 학생추가

				if(isFull(cnt,datas)) {
					continue;
				}

				String name;
				int score;
				while(true) {
					System.out.print("이름 입력 >> ");
					name=sc.next();
					System.out.print("정말로? (Y/N) >> ");
					String ans=sc.next();
					if(ans.equals("Y")) {
						break;
					}
				}
				while(true) {
					System.out.print("성적 입력 >> ");
					score=sc.nextInt();
					if(0<=score && score<=100) {
						break;
					}
				}
				datas[cnt++]=new Student(PK++,name,score);
			}
			else if(menu==2) { // 전체목록출력

				if(isEmpty(cnt)) {
					continue;
				}

				System.out.println("===============");
				for(int i=0;i<cnt;i++) {
					// datas == 배열 == 학생부
					// datas[i] == 배열의 요소 == 학생
					// datas[i].num == 학생.번호 == 학생의 번호
					datas[i].printInfo();
				}
				System.out.println("===============");

			}
			else if(menu==3) { //번호 검색/
				// pk
				if(isEmpty(cnt)) {
					continue;
				}
				int num;
				while(true) {
					System.out.print("검색할 학생 번호 입력 >> ");
					num = sc.nextInt();
					if(1001<=num && num<2000) {
						break;
					}
				}

				boolean flag = false;
				for(int i=0; i<cnt;i++) {
					if(datas[i].num ==num) {
						flag = true;
						datas[i].printInfo();
					}
				}
				if(!flag) {
					System.out.println("검색결과가 없습니다...");
				}






				//				int searchNum = sc.nextInt();
				//				if (searchNum <= 0 || searchNum > cnt) {
				//					System.out.println("잘못된 학생 번호입니다. 다시 입력해주세요.");
				//					continue;
				//				}
				//				System.out.println(datas[searchNum-1].num+"번 "+datas[searchNum-1].name+" "+datas[searchNum-1].score+"점 "+datas[searchNum-1].grade+"등급");


			}
			else if(menu==4) { // 이름검색
				// 이름
				if(isEmpty(cnt)) {
					continue;
				}
				System.out.print("검색할 학생 이름 입력 >> ");
				String searchName = sc.next();
				boolean flag = false;
				for(int i=0;i<cnt;i++) {
					if(datas[i].name.equals(searchName)) {
						datas[i].printInfo();
						flag = true;
						break;
					}
				}
				if(!flag) {
					System.out.println("해당 이름의 학생을 찾을 수 없습니다!");
				}

			}

			else if(menu==5) { // 1등출력 
				// 1등
				if(isEmpty(cnt)) {
					continue;
				}

				Student topStudent = datas[0];
				for (int i = 1; i < cnt; i++) {
					if (datas[i].score > topStudent.score) {
						topStudent = datas[i];
					}
				}
				System.out.print("1등 학생: ");
				topStudent.printInfo();
			}
			else if(menu==6) { // 등급검색
				// 등급
				if(isEmpty(cnt)) {
					continue;
				}

				System.out.print("검색할 등급 입력 (A, B, C) >> ");
				char grade = sc.next().charAt(0);

				boolean flag = false;
				for (int i = 0; i < cnt; i++) {
					if (datas[i].grade == grade) {
						datas[i].printInfo();
						flag = true;
					}
				}

				if (!flag) {
					System.out.println("해당 등급의 학생을 찾을 수 없습니다.");
				}
			}
			else if(menu==7) { // 재시험 - 10점 +

				if(isEmpty(cnt)) {
					continue;
				}
				for (int i = 0; i < cnt; i++) {
					if (datas[i].score < 60) {
						datas[i].retakeExam(); // 재시험 메서드 호출
//						System.out.println(datas[i].num + "번 " + datas[i].name + "의 재시험 결과: " + datas[i].score + "점 " + datas[i].grade + "등급");
						datas[i].printInfo();
					}
				}
			} else {
				System.out.println("잘못된 입력입니다!");
			}



		}

	}
}

 

막히는 부분은 내 소울메이트인 ChatGPT를 이용하였다.

아래는 강사님의 예시 답안이다.

package class01;

import java.util.Random;
import java.util.Scanner;

class Student {
   int num;
   String name;
   int score;
   char grade;
   Student(int num,String name){
      this(num,name,0);
   }
   Student(int num,String name,int score){
      this.num=num;
      this.name=name;
      this.score=score;
      this.setGrade();
   }
   void printInfo() {
      System.out.println(this.num+"번 "+this.name+" "+this.score+"점 "+this.grade+"등급");
   }
   
   // 학생 1명이 재시험을 봄 ==>>> 메서드
   // 60 -> 60~100 랜덤 점수로 변경됨 : 경계값 검사
   void test() {
      Random rand=new Random();
      /*
      10 >> 10~100 -> 91    랜덤정수의 개수=101-현재점수
      20 >> 20~100 -> 81
      90 >> 90~100 -> 11
      
      .nextInt(100) // 0~99
      .nextInt(100)+1 // 1~100
      */
      this.score=rand.nextInt(101-this.score)+this.score;
      
      this.setGrade();
   }
   void setGrade() {
      this.grade='C';
      if(this.score>=80) {
         this.grade='A';
      }
      else if(this.score>=60) {
         this.grade='B';
      }
   }
}

public class Test01 {

   public static boolean isEmpty(int cnt) {
      if(cnt<=0) {
         System.out.println("데이터가 없습니다!");
         return true;
      }
      return false;
   }
   public static boolean isFull(int cnt,Student[] datas) {
      if(cnt>=datas.length) {
         System.out.println("저장가능한 공간이 없습니다!");
         return true;
      }
      return false;
   }

   public static int firstScore(Student[] datas,int cnt) {
      int pivot = datas[0].score;
      for(int i=1;i<cnt;i++) {
         if(pivot < datas[i].score) {
            pivot = datas[i].score;
         }
      }
      return pivot;
   }

   public static boolean isRight(char grade) {
      if(grade=='A' || grade=='B' || grade=='C') {
         return true;
      }
      return false;
   }
   
   public static void main(String[] args) {

      Scanner sc=new Scanner(System.in);

      int PK=1001; // 시스템에서 부여하는 PK값
      int cnt=0; // 현재 배열에 저장된 데이터의 개수
      Student[] datas=new Student[3];
      datas[0]=new Student(PK++,"티모",50);
      cnt++;

      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. 1등출력");
         System.out.println("6. 등급검색");
         System.out.println("7. 재시험");
         System.out.println("0. 프로그램 종료");
         System.out.println("===============");
         System.out.print("메뉴 입력 >> ");
         int menu=sc.nextInt();      

         if(menu==0) {
            break;
         }
         else if(menu==1) { // 학생추가

            if(isFull(cnt,datas)) {
               continue;
            }

            String name;
            int score;
            while(true) {
               System.out.print("이름 입력 >> ");
               name=sc.next();
               System.out.print("정말로? (Y/N) >> ");
               String ans=sc.next();
               if(ans.equals("Y")) {
                  break;
               }
            }
            while(true) {
               System.out.print("성적 입력 >> ");
               score=sc.nextInt();
               if(0<=score && score<=100) {
                  break;
               }
            }
            datas[cnt++]=new Student(PK++,name,score);
         }
         else if(menu==2) { // 전체목록출력

            if(isEmpty(cnt)) {
               continue;
            }

            System.out.println("===============");
            for(int i=0;i<cnt;i++) {
               // datas == 배열 == 학생부
               // datas[i] == 배열의 요소 == 학생
               // datas[i].num == 학생.번호 == 학생의 번호
               datas[i].printInfo();
            }
            System.out.println("===============");

         }
         else if(menu==3) { // 번호검색

            if(isEmpty(cnt)) {
               continue;
            }

            int num;
            while(true) {
               System.out.print("검색할 학생의 번호 입력 >> ");
               num=sc.nextInt();
               if(1001<=num && num<2000) {
                  break;
               }
            }

            boolean flag=false;
            for(int i=0;i<cnt;i++) {
               if(datas[i].num == num) {
                  // 현재 살펴보고있는 학생.번호 == 사용자가 입력한 번호
                  flag=true;
                  datas[i].printInfo();
               }
            }
            if(!flag) {
               System.out.println("검색결과가 없습니다...");
            }

         }
         else if(menu==4) { // 이름검색
            if(isEmpty(cnt)) {
               continue;
            }

            System.out.print("검색어 입력 >> ");
            String searchKeyword=sc.next();
            // 검색어 : searchKeyword,searchContent,sk,sc
            // 유효성 검사 x

            boolean flag=false;
            for(int i=0;i<cnt;i++) {
               if(datas[i].name.contains(searchKeyword)) {
                  // 학생부에 저장되어있는 학생의 이름안에 검색어가 있어?
                  datas[i].printInfo();
                  flag=true;
               }
            }
            if(!flag) {
               System.out.println("검색결과가 없습니다...");
            }
         }
         else if(menu==5) { // 1등출력 -->>> selectAll
            if(isEmpty(cnt)) {
               continue;
            }            

            // 1등의 점수
            //  : 함수
            int score=firstScore(datas,cnt); // 1등의 점수를 함수로 찾아냄

            for(int i=0;i<cnt;i++) {
               if(score==datas[i].score) {
                  datas[i].printInfo();
               }
            }
            // 해당 점수인 학생을 모두 출력
            //  : 1명은 메서드 --->> .printInfo()
            //  : N명은 함수
         }
         else if(menu==6) { // 등급검색
            if(isEmpty(cnt)) {
               continue;
            }

            char grade;
            while(true) {
               System.out.print("등급 입력 >> ");
               grade=sc.next().charAt(0);
               if(isRight(grade)) {
                  break;
               }
            }
            
            boolean flag=false;
            for(int i=0;i<cnt;i++) {
               if(datas[i].grade==grade) {
                  datas[i].printInfo();
                  flag=true;
               }
            }
            if(!flag) {
               System.out.println("검색결과가 없습니다...");
            }
         }
         else if(menu==7) { // 재시험
            if(isEmpty(cnt)) {
               continue;
            }
            
            // 전체 학생들이 재시험을 봅니다.
            for(int i=0;i<cnt;i++) {
               datas[i].test();
            }
         }
         else {
            System.out.println("잘못된 입력입니다!");
         }
      }






















   }
}

 

예전에 비해서 많이 발전했지만, 중요한 부분을 조금 놓쳤다.

1. 주석을 통해 코드가독성을 늘리는 것이 부족했다.

2. 함수 이용이 아직은 덜 익숙하다.

3. '5번'메뉴에 다른 이름 같은 점수인 경우를 고려하지 않았다.

4. 요구사항 제대로 확인 안한 점.

 

메뉴 7번은 바로 위에 코드는 조금 응용을 해서 랜덤값을 올리는것으로 한 차이이다.

 

.contains() 와 .equals()의 차이, 함수 관련 지식 이해도를 위 코드를 통해 이해하게 되었다.

'JAVA' 카테고리의 다른 글

JAVA 오버라이딩 + 예제  (2) 2024.07.03
JAVA 상속, super() + 예제  (0) 2024.07.03
JAVA 오버로딩 실습  (0) 2024.07.02
JAVA - static, final 키워드  (0) 2024.07.02
JAVA 메서드 오버로딩  (0) 2024.07.02
'JAVA' 카테고리의 다른 글
  • JAVA 오버라이딩 + 예제
  • JAVA 상속, super() + 예제
  • JAVA 오버로딩 실습
  • JAVA - static, final 키워드
yn98
yn98
좌우명 : 여전할 것 인가, 역전할 것 인가? 백엔드 개발자가 되고싶은 역전하고 있는 개발자 꿈나무의 블로그입니다. 개발을 하면서 공부한 것들을 기록합니다. 24.06 ~
  • yn98
    개발 꿈나무
    yn98
  • 전체
    오늘
    어제
    • 분류 전체보기 (131)
      • Python (3)
      • 공부 (7)
      • DB (7)
      • JAVA (24)
      • JSP (9)
      • jQuery (2)
      • HTML (3)
      • Spring (20)
      • 웹 (4)
      • C (1)
      • Git (2)
      • 에러일기 (19)
      • 프로젝트 (6)
      • 책 (21)
        • 멘토씨리즈 자바 (14)
        • 2024 수제비 정보처리기사 (7)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
    • Notion
  • 공지사항

  • 인기 글

  • 태그

    티스토리챌린지
    MVC
    aop
    DispatcherServlet
    멘토씨리즈 자바
    Spring
    객체지향
    recoverabledataaccessexception
    정처기 실기
    어노테이션
    jsp
    정보처리기사
    Di
    정보처리기사 실기
    오버로딩
    2-layered 아키텍처
    수제비
    스프링 프레임워크
    이벤트 스케줄러
    codeup 4891 : 행복
    html
    java
    정처기
    생성자
    @Component
    @service
    ViewResolver
    @repository
    상속
    오블완
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
yn98
학생부 프로그램 만들기 (이어서)
상단으로

티스토리툴바