WIL. 한주의 마무리 학점관리시스템 만들어보기

hyuko·2023년 1월 7일
0

Java

목록 보기
18/26

일주일을 돌아보며...

  • 산대특 과정을 시작한지 이제 일주일이 지났다.
    하루에 8시간을 강의를 듣다보니, 확실히 진도 자체가 빠른편이다.
    아예 처음으로 컴퓨터 언어 강의를 듣는다면 어려울 난이도와 과정인 건
    분명한 거같다.
    진도가 빠른 것도 사실이지만 그렇다고 해서 개념이나 정의등을 수박 겉핥기식으로 지나가지 않아서 좋은 면도 있다 .
    시간자체가 하루 8시간 강의이다보니 일반 강의 4시간 강의보다
    많은 개념의 내용을 깊이있게 보고 다룰 수 있는 시간이었다.

  • 그 이전에 자바를 들었을 때 몰랐던 조금 애매 했었던 개념들을
    확실하게 알 수 있는 계기였던거 같다(이 생각은 오로지 개인적인 판단이다, 다른 사람이 봤을 때 이해를 못했을수도 있다)

지금 6일 동안 배운 java 배열, 클래스, 메소드 등을 통해서
학점 관리 시스템이라는 거창하게 보이지만 별 것 없는 시스템을
만들어 보기로 생각을 했다.

학생의 이름과 점수를 입력하게 되면 , 그 정보를 배열에 저장을 하고 그 저장된 정보로 다른 선택지의 학생의 이름과 점수 출력, 학생의 이름과 학점 출력 의 버튼을 선택을 해서 입력을 하게 되면
그에 맞는 출력값이 출력되는 시스템이다.

  • 설계 예상

    1. Student라는 정보를 가지고 있는 클래스를 생성을 한다.
    2. Student라는 객체를 저장 할 수 있는 클래스를 생성한다.
    3. 저장한 정보를 토대로 로직을 담는 클래스를 생성한다.
    4. 서비스를 통해 실제로 실행할 클래스를 생성한다.
    • 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 void setName(String name) {
      		
      		this.name = name;
      	}
      
      	public int getScore() {
      		
      		return score;
      	}
      
      	public void setScore(int score) {
      		
      		this.score = score;
      	}
      
      	@Override
      	public String toString() {
      		
      		return "학생의 이름= " + name + ", 점수= " + score ;
      	}
      
    • 코드 설명

      기본적으로 우리가 받아올 정보가 있는 클래스이다.
      우리는 학생의 이름과 점수만 필요하기 때문에 name, score라는
      변수로 선언해 두었다.
      그리고 private를 주어서 정보은닉을 하고 생성자와 getter , setter에만 public을주어서 접근 가능하도록 하였다.

    • 객체를 저장하는 용도의 클래스

      private Student[] studentTable;
      	
      		public StudentRepository(Student[] student) {
      		
      			this.studentTable = student;
      		}
      	
      		public Student[] getStudent() {
      			return studentTable;
      		}
      
      		// 저장하기
      		public void saveStudent(Student student) {
      			extendArrayOne();
      			studentTable[studentTable.length - 1] = student;
      		}
      	
      		private Student[] extendArray(int length) {
      			Student[] newArray = new Student[studentTable.length + length];
      			transferArray(studentTable, newArray);
      			return newArray;
      		}
      	
      		//배열 길이 하나 늘리기
      		private void extendArrayOne() {
      			Student[] newArray = new Student[studentTable.length + 1];
      			transferArray(studentTable, newArray);
      			studentTable = newArray;
      		}
      	
      		private void transferArray(Student[] oldArray, Student[] newArray) {
      			System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);
      		}
      
      		@Override
      		public String toString() {
      		
      			return  Arrays.toString(studentTable) ;
      		}
      
    • 코드설명

      배열에 객체를 저장하기 위해 변수로 private로 주어서 선언만 해놓고 생성이 될 당시에 그 배열안에 student 값을 주입하는 용도이다.
      저장을 하기 위해서는 일반적으로 배열같은 경우에는 한번 인덱스 길이가 고정되면 바뀌지 않기 때문에 바뀔수 있게 해주는 코드가 필요했고
      그 코드가 extendArrayOne()이라는 메소드를 통해 새로운 배열을 만들고 그 배열에 본래 있던 값을 주입하는 transferArray() 메소드를 실행해 배열을 구성하게 되었다.

    • 로직을 담는 서비스 클래스

      private final Scanner scanner;
      		private final StudentRepository repository;
      	
      		private final Student[] studentTable;
      	
      		public StudentService() {
      			scanner = new Scanner(System.in);
      			studentTable = new Student[0];
      			repository = new StudentRepository(studentTable);
      
      		}
      	
      		// run 을 했을 때 학생의 이름, 학생의 점수를 입력받는다.
      		// 입력 받은 정보로 A,B,C,D,F 학점으로 나누어 출력하는 시스템
      	
      		public void run() {
      			boolean loopFlag = true;
      			char select = '\0';
      		
      			while(loopFlag) {
      				showGradeTransferSystemView();
      				select = inputSelected("학점 관리 시스템");
      				loopFlag = mainMenu(select);
      			}
      		}
      
      		public void stop() {
      			for(int i = 0; i < 10; i++) {
      				try {
      					Thread.sleep(500);
      					System.out.println("프로그램 종료중....(" + (i + 1) + "/10)");
      				} catch (InterruptedException e) {
      					// TODO Auto-generated catch block
      					e.printStackTrace();
      				}
      			}
      			System.out.println("프로그램 종료");
      		}
      	
      		private void showGradeTransferSystemView() {
      			System.out.println("======== << 학점 관리 시스템 >> ========");
      			System.out.println("1. 학생 이름, 점수 입력: ");
      			System.out.println("2. 학생 이름, 점수 확인: ");
      			System.out.println("3. 학생 이름, 학점 확인: ");
      			System.out.println("========================================");
      			System.out.println("q. 프로그램 종료");
      			System.out.println();
      		}
      	
      		private char inputSelected(String menuName) {
      			System.out.println(menuName + "메뉴 선택: ");
      			char select = scanner.next().charAt(0);
      			scanner.nextLine();
      			return select;
      		}
      
      		String name;
      		int score;
      		private void registerStudent() {
      			name = scanner.nextLine();
      			score = scanner.nextInt();
      			scanner.nextLine();
      			Student student = new Student(name, score);
      		
      			repository.saveStudent(student);
      
      		}
      	
      		private void scoreToGrade(String name, int score) {
      
      			if(score < 0 || score > 100) {
      				System.out.println("학점 변환이 어렵습니다.");
      			}else if(score > 89) {
      				System.out.println(name + "학생의 학점은 A학점입니다");
      			}else if(score > 79) {
      				System.out.println(name + "학생의 학점은 B학점입니다");
      			}else if(score > 69) {
      				System.out.println(name + "학생의 학점은 C학점입니다");
      			}else if(score > 59) {
      				System.out.println(name + "학생의 학점은 D학점입니다");
      			}else {
      				System.out.println(name + "학생의 학점은 F학점입니다");
      			}
      		}
      
      		private boolean mainMenu(char select) {
      			boolean flag = true;
      
      			if(isExit(select)) {
      				flag = false;
      			}else {
      				if(select == '1') {
      					registerStudent();
      
      				}else if(select == '2') {
      					System.out.println(repository.toString());
      				}else if(select == '3') {
      					scoreToGrade(name, score);
      				}
      				else {
      					System.out.println(errorMessage());
      				}
      				System.out.println();
      			}
      			return flag;
      		}
      
      		private boolean isExit(char select) {
      			return select == 'q' || select == 'Q';
      		}
      
      		private String errorMessage() {
      			return "### <<< 번호를 다시 입력해주세요. >>> ###";
      		}
      
    • 코드 설명

      지금 우리가 만드는 시스템은 학생의 이름과 점수를 받아내고
      그 받은 점수를 A,B,C,D,F 라는 학점으로 변환하여 출력할 수 있게 하는 것이 목표이다.
      각각의 메소드는 그 기능만을 담당하게 만들려고 노력을 하였다.
      예를 들어 run메소드는 정말 시작의 메소드이고, stop메소드는
      정지되었을 경우 나오는 메소드이다.
      showGradeTransferSystemView는 학점 변환 시스템 view를
      나타내는 메소드 이고 scoreToGrade는 점수를 정해놓은 기준에 따라서 학점으로 나누어주는 로직을 담고있다.
      그리고 mainMenu에서는 보여지는 view의 입력값에 따라 행동하는 로직을 담고있다.

    • main 클래스 (실행 클래스)

      public static void main(String[] args) {
      			StudentService service = new StudentService();
      		
      			service.run();
      			service.stop();
      		}
      

      정말 간단하게 서비스를 정의하고 그 서비스를 참조하여
      run()메소드와 stop메소드만 쳐주면 끝난다. 실행 했을 때
      어떻게 작동을 하는지 보도록하자.

    • 실행시 콘솔 화면과 결과






정리하기

한 주 동안 배운 개념을 통해 최대한 활용하여 매우 간단하지만
처음 생각하면 어려운 시스템을 한번 만들어 보았습니다.
확실히 강사님의 코드를 따라치다가 혼자 생각하며 코드를 치니
조금 더 발전한 기분을 느낄 수 있었네요
매주매주 배운 내용들을 오늘처럼 프로그램을 만드는 식으로 활용하여 진행을 해보겠습니다 이번주도 고생많았습니다!!!

profile
백엔드 개발자 준비중

0개의 댓글