JAVA/코드

학생부 프로그램 마무리와 코드리뷰 - 객체배열

record2080 2025. 1. 14. 10:01

package class06;

import java.util.Scanner;

//객체 배열
class Student {
   static int studentNum=1001;
   int num; // PK 값은 사용자가 부여 xxx
   String name;
   int score;
   char grade;

   Student(String name){
      this(name,0);
   }

   Student(String name,int score){
      this.num=Student.studentNum++;
      this.name=name;
      this.score=score;
      this.setGrade();
      System.out.println("학생 정보 생성 완료!");
   }

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

   void changeScore(int score) {
      this.score=score;
      this.setGrade();
      System.out.println("학생 정보 변경 완료!");
   }

   void setGrade() {
      this.grade='C';
      if(60<=this.score && this.score<80) {
         this.grade='B';
      }
      else if(80<=this.score) {
         this.grade='A';
      }
   }
}

public class Test01 {
   // '학생(객체)'와 무관한 기능 --->> 함수
   public static boolean isFull(int cnt,Student[] datas) {
      if( cnt>=datas.length ) {
         return true;
      }
      return false;
   }


   // 성적 입력 유효성 검사 --->> 함수 ===>> VIEW

   public static void printMenu() {
      System.out.println("1. 전체출력");
      System.out.println("2. 번호로 학생 검색");
      System.out.println("3. 학생추가");
      System.out.println("4. 성적변경");

      System.out.println("5. 등급으로 학생 검색");
      System.out.println("6. 이름으로 학생 검색");
      System.out.println("0. 프로그램 종료");
      System.out.print(">> ");
   }


   public static char inputGrade() {
      Scanner sc=new Scanner(System.in); 
      System.out.print("검색할 학생의 등급을 입력하세요>>");
      char grade=sc.next().charAt(0);
      return grade;
   }
   public static void hasGrade(int cnt, Student[] datas, char grade) {
      int i; //scope 이슈
      boolean flag=false;
      for(i=0;i<cnt;i++) {
         if(grade==datas[i].grade) {
            datas[i].printInfo();               
            flag=true;
         }
      }
      if(!flag) {
         printErr();
      }

   }
   public static void hasName(Student[] datas, int cnt, String name) {
      boolean flag = false;

      int i;
      for(i = 0; i < cnt; i++) {
         if(datas[i].name.contains(name)) {
            System.out.println("해당하는 학생 정보 출력");
            datas[i].printInfo();
            flag = true;
         }
      }
      if(!flag) {
         printErr();
      }
   }
   public static String inputName() {
      Scanner sc=new Scanner(System.in);
      System.out.print("이름으로 학생을 검색합니다. 이름을 입력해주세요!>>");
      String name = sc.next();
      return name;
   }
   public static void printErr() {
      System.out.println("해당하는 학생이 없습니다");
   }
   public static int inputNum() {
      Scanner sc=new Scanner(System.in);
      System.out.print("번호입력 >> ");
      int num=sc.nextInt();
      return num;
   }
   public static void hasNum(int cnt,int num, Student[] datas) {
      boolean flag=false;

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

      if(!flag) {
         printErr();
      }
   }



   public static void main(String[] args) {

      Student[] datas=new Student[3];

      datas[0]=new Student("티모");
      datas[1]=new Student("모르가나",68);
      // 샘플 데이터

      int cnt=2;

      Scanner sc=new Scanner(System.in);
      while(true) {
         printMenu();

         int menu=sc.nextInt();
         if(menu==0) {
            break;
         }
         else if(menu==1) {
            for(int i=0;i<cnt;i++) {
               datas[i].printInfo();
            }
         }
         else if(menu==2) {
            int num=inputNum();

            // datas == 배열 == 학생부
            // datas[i] == 배열[인덱스번호] == 배열의 요소 == 학생 == 학생 객체
            // datas[i].num == 학생.번호 == 학생 객체.멤버변수

            hasNum(cnt, num, datas);
         }
         else if(menu==3) {
            if(isFull(cnt,datas)) {
               System.out.println("학생부 데이터에 저장공간이 없습니다!");
               continue;
            }

            System.out.print("이름 입력 >> ");
            String name=sc.next();
            System.out.print("성적을 입력하시겠습니까? Y/N >> ");
            String ans=sc.next();
            if(ans.equals("Y")) {
               System.out.print("성적 입력 >> ");
               int score=sc.nextInt();
               datas[cnt++]=new Student(name,score);
            }
            else {
               datas[cnt++]=new Student(name);
            }
         }
         else if(menu==4) { // 성적변경 R -> U // 누구를 바꿀지, 뭐로 바꿀지 결정
            int num=inputNum();

            // datas == 배열 == 학생부
            // datas[i] == 배열[인덱스번호] == 배열의 요소 == 학생 == 학생 객체
            // datas[i].num == 학생.번호 == 학생 객체.멤버변수
            boolean flag=false;

            int i; // scope 이슈 해결
            for(i=0;i<cnt;i++) {
               if(num == datas[i].num) {
                  datas[i].printInfo();
                  flag=true;
                  break;
               }
            }
            if(!flag) {
               printErr();
               continue;
            }

            System.out.print("변경할 점수입력 >> ");
            int score=sc.nextInt();

            datas[i].changeScore(score);

         } else if(menu == 5) { // 등급으로 학생 검색
            char grade=inputGrade();

            grade = Character.toUpperCase(grade);

            hasGrade(cnt, datas, grade);
         }
         else if(menu == 6) { // 이름으로 학생 검색
            /*이름 검색 >> 출력
             * 이름 문자열로 입력받음
             * 
             * 해당 글자가 들어가는 학생들을 모두 출력합니다! 출력
             * 해당 글자 들어가는 모든 학생 출력
             * */
            String name=inputName();

            hasName(datas,cnt, name);
         }
      }
   }
}


<코드리뷰>

 ※ inputGrade() :유효성 검사 필요    // uppercase가 이 안에 있으면 좋을듯
      inputName()   : 유효성 검사 !!            
     grade = Character.toUpperCase(grade); 가 char grade=inputGrade(); 안에 들어가는게 좋음.

- 함수이름도 has~~면 반환값이 boolean임(T?f?)
- 함수명 변경하기 : printGrade()/ printName()

'JAVA > 코드' 카테고리의 다른 글

TEAM과제 -삼중상속  (0) 2025.01.18
포켓몬을 잡아라- 객체배열  (0) 2025.01.16
객체 배열- 학생부 프로그램  (0) 2025.01.13
코드리뷰 ②- 학생부 프로그램 함수화 -V&M  (0) 2025.01.10
코드리뷰 ①- 선택정렬  (0) 2025.01.09