가톨릭대학교 프로그래밍언어론 수업에서 제출한 자료 및 코드입니다.
프로그램 개요
학생 점수를 관리하는 프로그램입니다. 관리자가 학생들의 이름과 점수를 저장하면, 학생의 이름이나
번호를 통해서 해당 점수를 검색할 수 있습니다.
유즈케이스
예외사항
NullPointerException은 생성되지 않은 배열 객체의 원소를 접근하려는 경우에도 발생합니다.
클래스 다이어그램
커맨드 패턴을 사용하였습니다.
클래스 다이어그램 설명은 pdf를 이용해주시기 바랍니다.
코드
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Scanner; // 사용자 정의 예외 (음수 점수 감지) class NegativeScoreException extends Exception{ public NegativeScoreException(){ System.out.println("\n[ERROR] 점수는 음수일 수 없습니다! 초기화면으로 돌아갑니다!"); } } //해시 클래스 class SHA256 { public String encrypt(String text) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-256"); md.update(text.getBytes()); return bytesToHex(md.digest()); } private String bytesToHex(byte[] bytes) { StringBuilder builder = new StringBuilder(); for (byte b : bytes) { builder.append(String.format("%02x", b)); } return builder.toString(); } } // 학생 점수 클래스 class student{ private String name; private int score; public student(String name, int score) { this.name=name; this.score=score; } public String getName() { return name; } public int getScore() { return score; } } // 학생 점수 관리 클래스 (Receiver) class studentManager{ private student students[]; private int student_count; private Scanner sc=new Scanner(System.in); private int num; private String name; private int score; // 학생들 점수 저장 public void save() throws NegativeScoreException { System.out.print("\n저장할 학생 수를 입력하시오:"); num=sc.nextInt(); try { students=new student[num]; student_count=0; for(int i=0; i<num; i++) { System.out.print((i+1)+"번째 학생 이름을 입력하시오:"); name=sc.next(); System.out.print((i+1)+"번째 학생 점수를 입력하시오:"); score=sc.nextInt(); // 점수가 음수면 NegativeInputException if(score<0) { throw new NegativeScoreException(); } else { students[student_count++]=new student(name,score); } // 저장 완료 if(i==num-1) { System.out.println("저장 완료!"); } } } // 학생 수가 음수면 NegativeInputException catch(NegativeArraySizeException e) { System.out.println("\n[ERROR] 학생 수는 음수일 수 없습니다! 초기화면으로 돌아갑니다!"); } } // 이름으로 학생 점수 확인 public void findWithName() { System.out.print("\n검색할 학생 이름을 입력하시오:"); name=sc.next(); try { int i=0; do { student s=students[i]; String currentName=s.getName(); if(name.equals(currentName)) { System.out.println(currentName+" 학생은 "+s.getScore()+"점입니다!\n"); break; } else if(i==students.length-1) { System.out.println("존재하지 않는 학생입니다! 초기화면으로 돌아갑니다!"); } i++; }while(i<students.length); } // 저장된 학생이 없으면 NullPointerException catch(NullPointerException e){ System.out.println("\n[ERROR] 저장된 학생이 없습니다! 초기화면으로 돌아갑니다!"); } } // 번호로 학생 점수 확인 public void findWithNumber() { System.out.print("\n검색할 학생 번호를 입력하시오:"); num=sc.nextInt(); try { student s=students[num-1]; System.out.println(s.getName()+" 학생은 "+s.getScore()+"점입니다!\n"); } // 저장된 학생이 없으면 NullPointerException catch(NullPointerException e){ System.out.println("\n[ERROR] 저장된 학생이 없습니다! 초기화면으로 돌아갑니다!"); } // 존재하지 않는 번호면 ArrayIndexOutOfBoundsException catch(ArrayIndexOutOfBoundsException e) { System.out.println("\n[ERROR] 존재하지 않는 번호입니다! 초기화면으로 돌아갑니다!"); } } } // 커맨드 interface Command{ public void execute(); } // 저장 커맨드 class saveCommand implements Command{ private studentManager manager; public saveCommand(studentManager manager) { this.manager=manager; } public void execute(){ try { manager.save();} catch (NegativeScoreException e) {} } } // 이름으로 점수 확인 커맨드 class findScoreWithNameCommand implements Command{ private studentManager manager; public findScoreWithNameCommand(studentManager manager) { this.manager=manager; } public void execute(){ manager.findWithName(); } } // 번호로 점수 확인 커맨드 class findScoreWithNumberCommand implements Command{ private studentManager manager; public findScoreWithNumberCommand(studentManager manager) { this.manager=manager; } public void execute(){ manager.findWithNumber(); } } // 메뉴 클래스 (Invoker) class ThreeButtonMenu{ private ArrayList<Command> commands=new ArrayList<>(3); public void addCommand(Command command) { commands.add(command); } public void button1pressed() { commands.get(0).execute(); } public void button2pressed() { commands.get(1).execute(); } public void button3pressed() { commands.get(2).execute(); } } // 로그인 처리 클래스 class Login{ private int M=7; private int id,pw; private String answer="f5efb6e05e55f7eda6e88bec2eec69e6e2919cce997d7da9e6723e71b3021a87"; private SHA256 sha256 = new SHA256(); public Login(int id,int pw) { this.id=id; this.pw=pw; } public boolean process() throws NoSuchAlgorithmException { try { int C=1; for(int i=0; i<id; i++) { C=(C*M)%pw; } String output=sha256.encrypt(String.valueOf(C)); // 로그인 성공 if(answer.equals(output)) { return true; } // 로그인 실패 else { return false; } } // 0으로 나누면 ArithmeticException catch(ArithmeticException e){ System.out.println("\n[ERROR] 비밀번호는 0이 될 수 없습니다!"); return false; } } } public class admin { public static void main(String[] args) throws NoSuchAlgorithmException{ // Invoker와 Receiver 객체 생성 ThreeButtonMenu menu=new ThreeButtonMenu(); studentManager mgr=new studentManager(); // 커맨드 설정 menu.addCommand(new saveCommand(mgr)); menu.addCommand(new findScoreWithNameCommand(mgr)); menu.addCommand(new findScoreWithNumberCommand(mgr)); // 로그인 System.out.println("== 로그인 =="); Scanner sc=new Scanner(System.in); System.out.print("\n* ID:"); int id=sc.nextInt(); System.out.print("* Password:"); int pw=sc.nextInt(); Login login=new Login(id,pw); boolean connect=login.process(); // 로그인 성공 -> 점수 관리 while(connect) { System.out.println("\n== 학생 점수 관리 프로그램 =="); System.out.println("\n1. 점수 저장\n2. 이름으로 점수 확인\n3. 번호로 점수 확인\n"); System.out.print("* 선택해주세요:"); int select=sc.nextInt(); switch(select) { case 1: menu.button1pressed(); break; case 2: menu.button2pressed(); break; case 3: menu.button3pressed(); break; default: System.out.println("잘못된 입력입니다."); break; } } // 로그인 실패 System.out.println("\n로그인에 실패하였습니다!\n프로그램을 종료합니다!"); } }
정리 파일