자바 미니 프로젝트 - 성적 조회 프로그램

업데이트:

성적조회 프로그램

24시간 미니 해커톤을 진행하며 간단한 성적조회 프로그램을 만들었다.

간단하지만 아직 프로그래밍 레벨1인 나에겐 어려웠던 CRUD구현.. 그리고 내가 구상했던 3가지 새로운 기능(1등출력, 꼴찌출력, 선생님 코멘트) 중 1가지는 구현하지 못했지만 나름대로 최선을 다했다. 몸이 아프지 않았다면 좀 더 집중력있게 만들 수 있을텐데 하는 아쉬움도 남지만.. 앞으로도 내게 남은 기회가 많으니까! 적당히 만족하기로 했다.

App클래스

프로그램을 시작하면 가장 먼저 보이는 화면. 1번을 누르면 선생님 로그인 창으로 이동한다.

public class App {
  public static void main(String[] args) {


    Member member = new Member();

    loop:
      while(true) {
        System.out.println("[고등학교 성적관리시스템 메인]");
        System.out.printf("[1] 선생님 로그인    [0] 종료\n");
        int command = Prompt.inputInt("명령> ");

        switch(command) {
          case 1: member.System(); break;

          case 0 : 
            System.out.println("프로그램 종료");
            break loop;
          default : System.out.println("잘못된 명령입니다."); 
        }
        System.out.println();
      }
  }
}

TeacherLogin 클래스

필드는 private로 막고 게터세터를 썼다. add()메서드로 회원가입을 할 수 있게 구현했다.

package mini.project;

public class TeacherLogin {
	private String Id;
	private String Password;
	private String Name;

	public TeacherLogin(String Id, String Password, String Name) {
		super();
		this.Id = Id;
		this.Password = Password;
		this.Name = Name;
	}
	public String getId() {
		return Id;
	}
	public void setId(String Id) {
		this.Id = Id;
	}
	public String getPassword() {
		return Password;
	}
	public void setPassword(String Password) {
		this.Password = Password;
	}
	public String getName() {
		return Name;
	}
	public void setName(String Name) {
		this.Name = Name;
	}
	@Override
	public String toString() {
		return "ID : " + Id + " Password : " + Password + " Name : " + Name;
	}
	public void add() {
		TeacherLogin t = new TeacherLogin(Id, Password, Name);
		t.Id = Prompt.inputString("Id : ");
		t.Password = Prompt.inputString("Password : ");
		t.Name = Prompt.inputString("Name : ");
	}
}

Teacher 클래스

기본 관리자를 생성자로 만들어놓았다. 그리고 회원가입을 통해 로그인하여 학생정보 관리시스템에 접속할 수 있도록 구현했다.

package mini.project;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;


public class Teacher {

	List<TeacherLogin> teachers = new ArrayList<>();
	Scanner scanner = new Scanner(System.in);

	public Teacher() {
		teachers.add(new TeacherLogin("admin", "1234", "Kim"));
	}

	public void System() {
		int num = 0;
		while ((num = menu()) != 0) {
			switch (num) {
			case 1:
				TeacherLogin();
				break;
			case 2:
				TeacherJoin();
				break;
			case 3:
				TeacherList();
			}
		}
	}

	private void TeacherJoin() {
		String Id = Prompt.inputString("ID : ");
		String Password = Prompt.inputString("Password : ");
		String Password2 = Prompt.inputString("Password Confirm : ");
		String Name = Prompt.inputString("Name : ");

		if(TestId(Id)) {
			System.out.println("중복된 ID입니다.");
		} else if(Password.equals(Password2)) {
			teachers.add(new TeacherLogin(Id, Password, Name));
			System.out.println("회원가입이 완료되었습니다.");
		} else {
			System.out.println("비밀번호를 다시 입력하시오.");
		}
	}

	private void TeacherLogin() {
		while (true) {
			String Id = Prompt.inputString("ID : ");

			String Password = Prompt.inputString("Password : ");

			TeacherLogin member = FindId(Id);
			StudentHandler stu = new StudentHandler();

			if (member == null) {
				System.out.println("입력하신 아이디가 일치하지 않습니다.");
				System.out.println("다시 입력하시오.");
			} else if(member.getPassword().equals(Password)) {
				System.out.println("학생정보관리시스템에 접속하였습니다.");
				stu.StudentSystem();
				break;
			} else {
				System.out.println("입력하신 패스워드가 일치하지 않습니다.");
				System.out.println("다시 입력하시오.");
			}
		}
	}

	public boolean TestId(String Id) {
		boolean check = true;
		TeacherLogin member = FindId(Id);
		if (member == null)
			check = false;
		return check;

	}

	private TeacherLogin FindId(String Id) {
		for(TeacherLogin memberLogin : teachers) {
			if(memberLogin.getId().equals(Id)) {
				return memberLogin;
			}
		}
		return null;
	}

	public int menu() {
		return Prompt.inputInt("[1]로그인 [2]회원가입 [3]전체회원 [0]종료");
	}

	public void TeacherList() {
		System.out.println("[관리자 목록]");

		Iterator<TeacherLogin> ite = teachers.iterator();

		while(ite.hasNext()) {
			System.out.println(ite.next() + " ");
		}
	}
}

Student클래스

필드를 private로 막고 게터세터를 사용한 것은 위 Teacher클래스와 동일하다.

다만 Student클래스에서 국영수 점수의 총합인 sum과 평균인 aver은 메서드를 용도에 맞게 수정해 주었다.

package mini.project;

import java.sql.Date;

public class Student {

  private int no;
  private String name;
  private int gender;
  private String grade;
  private int kor;
  private int eng;
  private int math;
  private int sum;
  private float aver;
  private String comment;

  private Date registeredDate;

  private static final int LENGTH = 5;

  public String getComment() {
    return comment;
  }

  public void setComment(String comment) {
    this.comment = comment;
  }

  public int getSum() {
    return sum;
  }

  public void setSum(int kor, int eng, int math) {
    sum = kor+eng+math;
    aver = sum/3.f;
  }

  public void setAver(float aver) {
    this.aver = aver;
  }

  public float getAver() {
    return aver;
  }

  public int getNo() {
    return no;
  }

  public void setNo(int no) {
    this.no = no;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public int getGender() {
    return gender;
  }

  public void setGender(int gender) {
    this.gender = gender;
  }

  public String getGrade() {
    return grade;
  }

  public void setGrade(String grade) {
    this.grade = grade;
  }

  public int getKor() {
    return kor;
  }

  public void setKor(int kor) {
    this.kor = kor;
  }

  public int getEng() {
    return eng;
  }

  public void setEng(int eng) {
    this.eng = eng;
  }

  public int getMath() {
    return math;
  }

  public void setMath(int math) {
    this.math = math;
  }

  public Date getRegisteredDate() {
    return registeredDate;
  }

  public void setRegisteredDate(Date registeredDate) {
    this.registeredDate = registeredDate;
  }

  public static int getLength() {
    return LENGTH;
  }
}

StudentHandler 클래스

학생 정보와 성적을 입력받고 목록조회, 상세조회, 정보수정, 정보삭제와 같은 기본적인 CRUD를 구현했다. 그리고 이 프로그램만의 특징인 1등과 꼴찌, 선생님 코멘트 기능을 추가했다.

  • 1등 출력은 학년 상관 없이 국영수 총합으로만 따져서 출력하도록 했다.
  • 꼴찌 출력은 기능이 제대로 구현이 되지 않았다. 추측을 해보자면 정보를 추가하지 않은 인덱스의 값이 다 0으로 초기화 되었기에 무조건 최소값이 0으로 출력되는 듯 하다. 아직은 해결 방법을 찾지 못했다.
  • 선생님 코멘트는 학생 번호를 통해 입력하고, 학생 상세 조회에서 볼 수 있도록 구현했다.
package mini.project;

import java.sql.Date;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class StudentHandler {
  List<Student> studentList = new ArrayList<Student>();


  public void StudentSystem() {
    int num = 0;
    loop:
      while((num = StudentMenu()) != 0) {
        switch (num) {
          case 1: add(); break;
          case 2: scoreAdd(); break;
          case 3: studentList(); break;
          case 4: StudentDetail(); break;
          case 5: studentUpdate(); break;
          case 6: studentDelete(); break;
          case 7: FirstPlace(); break;
          case 8: BottomPlace(); break;
          case 9: teacherComment(); break;

          case 0: System.out.println("학생등록시스템 종료"); break loop;
          default : System.out.println("잘못된 명령입니다."); 
        }
        System.out.println();
      }
  }

  public int StudentMenu() {
    System.out.println("**0번을 누르면 메인 창으로 이동됩니다.**");
    return Prompt.inputInt(
        "[1]학생 정보 입력"
            + " [2]학생 성적 입력"
            + " [3]학생 목록"
            + " [4]학생 상세 조회\n"
            + "[5]학생 정보 수정"
            + " [6]학생 정보 삭제"
            + " [7]1등은? "
            + " [8]꼴찌는? "
            + " [9]선생님 코멘트");
  }

  private void scoreAdd() {
    System.out.println("[학생 성적 입력]");
    int no = Prompt.inputInt("학생 번호? ");
    Student student = findByNo(no);

    if(student == null) {
      System.out.println("해당 번호의 학생이 없습니다.");
      return;
    }

    student.setKor(Prompt.inputInt("국어성적? "));
    student.setEng(Prompt.inputInt("영어성적? "));
    student.setMath(Prompt.inputInt("수학성적? "));
    student.setSum(student.getKor(), student.getEng(), student.getMath());
  }

  private void add() {
    System.out.println("[학생 정보 입력]");

    Student student = new Student();

    while(true) {
      int number = Prompt.inputInt("학생 번호?(0 : 등록취소) ");
      if (number == 0) {
        System.out.println("학생 등록을 취소합니다.");
        return;
      } else if(this.indexOf(number) != 0) {
        student.setNo(number);
        break;
      } else {
        System.out.println("이미 등록된 학생번호입니다.");
      }
    }

    student.setName(Prompt.inputString("학생 이름? "));
    student.setGender(Prompt.inputInt("학생 성별? (1: 남자 / 2 : 여자)"));

    String grade = Prompt.inputString("학생 학년? ");
    int num = Integer.parseInt(grade);
    if(num < 0 || num > 4) {
      System.out.println("잘못된 입력값입니다.");
      return;
    } else {
      student.setGrade(grade);
    }

    student.setRegisteredDate(new Date(System.currentTimeMillis()));

    studentList.add(student);
  }

  public void studentList() {
    System.out.println("[학생 목록]");
    String grade = Prompt.inputString("**학년을 입력해주세요.**");
    Iterator<Student> iterator = studentList.iterator();


    while(iterator.hasNext()) {
      Student student = iterator.next();
      if(student.getGrade().equals(grade)) {

        String genderLabel = null;
        switch(student.getGender()) {
          case 1: genderLabel = "남자"; break;
          case 2: genderLabel = "여자"; break;
        }

        System.out.printf("이름 : %s\n성별 : %s\n학년 : %s\n국어 : %d\n영어 : %d\n"
            + "수학 : %d\n합계 : %d\n평균 : %.1f\n등록일 : %s\n\n",
            student.getName(),
            genderLabel,
            student.getGrade(),
            student.getKor(),
            student.getEng(),
            student.getMath(),
            student.getSum(),
            student.getAver(),
            student.getRegisteredDate());
      }
    }
  }

  public void StudentDetail() {
    System.out.println("[학생 상세 조회]");
    int no = Prompt.inputInt("학생 번호? ");
    Student student = findByNo(no);

    if(student == null) {
      System.out.println("해당 번호의 학생이 없습니다.");
      return;
    }

    System.out.printf("번호 : %s\n", student.getNo());
    System.out.printf("이름 : %s\n", student.getName());
    String genderLabel = null;
    switch(student.getGender()) {
      case 1: genderLabel = "남자"; break;
      case 2: genderLabel = "여자"; break;
    }
    System.out.printf("성별 : %s\n", genderLabel);
    System.out.printf("학년 : %s\n", student.getGrade());
    System.out.printf("국어 : %s\n", student.getKor());
    System.out.printf("영어 : %s\n", student.getEng());
    System.out.printf("수학 : %s\n", student.getMath());
    System.out.printf("총합 : %s\n", student.getSum());
    System.out.printf("평균 : %s\n", student.getAver());

    if(student.getComment() != null) {
      System.out.printf("코멘트 : %s\n", student.getComment());
    }
  }

  public void studentUpdate() {
    System.out.println("[학생 정보 변경]");
    int no = Prompt.inputInt("학생 번호? ");
    Student student = findByNo(no);

    if(student == null) {
      System.out.println("해당 번호의 학생이 없습니다.");
      return;
    }
    String name = Prompt.inputString(
        String.format("이름(%s)? ", student.getName()));
    String grade = Prompt.inputString(
        String.format("학년(%s)? ", student.getGrade()));
    int kor = Prompt.inputInt(
        String.format("국어(%s)? ", student.getKor()));
    int eng = Prompt.inputInt(
        String.format("영어(%s)? ", student.getEng()));
    int math = Prompt.inputInt(
        String.format("수학(%s)? ", student.getMath()));

    student.setSum(kor, eng, math);

    String response = Prompt.inputString("정말 변경하시겠습니까?(y/N) ");
    if (!response.equalsIgnoreCase("y")) {
      System.out.println("변경을 취소하였습니다.");
      return;
    }
    student.setName(name);
    student.setGrade(grade);
    student.setKor(kor);
    student.setEng(eng);
    student.setMath(math);
    student.getSum();

    System.out.println("학생 정보를 변경하였습니다.");
    System.out.println();
  }

  public void studentDelete() {
    System.out.println("[학생 정보 삭제]");
    int no = Prompt.inputInt("번호? ");
    int index = indexOf(no);

    if(index == -1) {
      System.out.println("해당 번호의 학생이 없습니다.");
      return;
    }

    String response = Prompt.inputString("정말 삭제하시겠습니까?(y/N) ");
    if(!response.equalsIgnoreCase("y")) {
      System.out.println("삭제 취소.");
      return;
    }

    studentList.remove(index);
    System.out.println("삭제 완료.");
    System.out.println();
  }

  public void FirstPlace() {
    System.out.println("[1등 출력]");
    Iterator<Student> iterator = studentList.iterator();

    int[] first = new int[studentList.size()];
    int max = first[0];
    String name = null;
    while(iterator.hasNext()) {
      Student student = iterator.next();
      if(student.getSum() > max) {
        max = student.getSum();
        name = student.getName();
      }
    }

    System.out.printf("1등은? ==> %s : %d점\n",name, max);
    System.out.println("와우! 대단해요!");
    System.out.println();
  }

// 제대로 구현되지 못한 메서드
  public void BottomPlace() {
    System.out.println("[꼴지 출력]");

    int[] bottom = new int[studentList.size()];
    int min = bottom[0];
    String name = null;
    for(int i = 1; i < studentList.size(); i++) {
      Student student = studentList.get(i);

      if(student.getSum() < min) {
        min = student.getSum();
        name = student.getName();
      }
    }
    System.out.printf("꼴지 ==> %s : %d\n", name, min);
    System.out.println("이 학생은 격려가 필요합니다.");
    System.out.println();
  }

  private void teacherComment() {
    System.out.println("[선생님 코멘트]");
    int no = Prompt.inputInt("코멘트 입력할 학생 번호? ");
    Student student = findByNo(no);

    if(student == null) {
      System.out.println("해당 번호의 학생이 없습니다.");
      return;
    }
    student.setComment(Prompt.inputString("한줄 코멘트를 입력하세요.\n"));
  }

  private Student findByNo(int no) {
    for(int i = 0; i < studentList.size(); i++) {
      Student student = studentList.get(i);
      if(student.getNo() == no) {
        return student;
      }
    }
    return null;
  }

  private int indexOf(int no) {
    for (int i = 0; i < studentList.size(); i++) {
      Student student = studentList.get(i);
      if (student.getNo() == no) {
        return i;
      }
    }
    return -1;
  }
}

Prompt클래스

입출력 관련한 Prompt명령을 모아두었다.

package mini.project;

import java.util.Scanner;

public class Prompt {
	static Scanner keyboardScan = new Scanner(System.in);

	public static String inputString(String title) {
		System.out.print(title);
		return keyboardScan.nextLine();
	}

	public static int inputInt(String title) {
		return Integer.parseInt(inputString(title));
	}

	public static void close() {
		keyboardScan.close();
	}
}


후기

이렇게 24시간, 정확히는 잠자고 밥먹는 시간을 제외한 14시간만에 팀원 한명과 태그를 이뤄 성적조회 프로그램을 만들었다.

미니 해커톤이지만 긴장감을 가지고 처음으로 누군가와 협업을 하며 프로그램을 어떻게 구현할지 고민하는 시간을 가질 수 있었다.

특히 간단하게만 생각했던 CRUD조차도 막상 처음부터 만들자니 자잘한 버그가 많이 발생했고, 그런 버그들을 고치는데 시간이 많이 들었다. 기능을 만드는 것 보다 유효성 검사를 꼼꼼히 해주며 프로그램이 단단해지도록(?) 하는게 더 어려웠다.

미숙하지만 결과물을 내고 나니 한층 더 자신감이 붙는걸 느낄 수 있었다. 재밌었음!

태그: ,

카테고리:

업데이트:

댓글남기기