Java 코드연습

[뉴렉처] ExamConsole 클래스 구현하기

양상추상츄 2021. 10. 22. 12:24

 (UI 코드는 분리하는 것이 기본) 이전편을 이어서 완성

 

https://www.youtube.com/watch?v=ao3AiA26rJ4&list=PLq8wAnVUcTFX4E2NplMvJfqlcgAeF_BxK&index=11 

 

 

ExamConsole에 사용자 입력, 출력 기능들을 모두 옮겼고 그에 따른 내부적 오류가 발생되는 부분을 처리함

Exam_1에서는 ExamList에서 입력과 출력을 받았던 것을 ExamConsole로 변경

ExamConsole list = new ExamConsole();

package Exam_1.UI코드분리하기;

import java.util.Scanner;

public class Exam_1 {

	public static void main(String[] args) {
		ExamConsole list = new ExamConsole();
		//ExamList.init();
		
		int menu;
		boolean keepLoop = true;
		
		while(keepLoop) {
			
			menu = inputMenu();
			
			switch(menu) {
			case 1:
				//ExamList.inputList(list);
				list.inputList();
				break;
			case 2:
				//ExamList.printList(list);
				list.printList();
				break;
			case 3:
				System.out.println("bye~");
				
				keepLoop = false;
				break;
			default:
				System.out.println("잘못된 값을 입력하셨습니다.");
			}
		}
	}

	private static int inputMenu() {
		Scanner scan = new Scanner(System.in);
		int num;
		
		System.out.println("--------------------");
		System.out.println("메인메뉴");
		System.out.println("메뉴를 선택해주세요");
		System.out.println("\t1. 성적입력");
		System.out.println("\t2. 성적출력");
		System.out.println("\t3. 나가기");
		System.out.print("\t>>>");
		
		num = scan.nextInt();
		if(num<1||3<num) {
			System.out.println("1~3의 숫자만 입력해주세요");
		}
		return num;
	}

}

 

ExamConsole this로 호출 했던것을

private ExamList list = new ExamList(); 을 만들어 list 로변경

package Exam_1.UI코드분리하기;

import java.util.Scanner;

public class ExamConsole {
	
	private ExamList list = new ExamList();
	
	void inputList() { //앞에 private 있으면 호출 안됨 다른 클래스에서 못씀
		Scanner scan = new Scanner(System.in);
		System.out.println("--------------------");
		System.out.println("성적입력");
		
		int kor, eng, math;
		
		do {
			System.out.print("국어 : ");
			kor = scan.nextInt();
			
			if(kor<0||100<kor) {
				System.out.print("국어성적은 0~100까지 범위만 입력해주세요");
			}
		}while(kor<0||100<kor);
		
		do {
			System.out.print("영어 : ");
			eng = scan.nextInt();
			
			if(eng<0||100<eng) {
				System.out.println("영어성적은 0~100까지 범위만 입력해주세요");
			}
		}while(eng<0||100<eng);
		
		do {
			System.out.print("수학 : ");
			math = scan.nextInt();
			
			if(math<0||100<math) {
				System.out.println("수학성적은 0~100까지 범위만 입력해주세요");
			}
		}while(math<0||100<math);
		
//		Exam exam = new Exam();
//		exam.setKor(kor);
//		exam.setEng(eng);//exam.eng = eng;
//		exam.setMath(math);//exam.math = math;
		
		Exam exam1 = new Exam();
		
		Exam exam = new Exam(kor, eng, math);
		
		//-----------add--------------------------
		
		list.add(exam);
			
	}
	

	void printList() {//overloading

		this.printList(list.size());//성적입력할때마다 list.current가 ++됨, 갯수만큼 출력
	}
	void printList(int size) { //size를 지정하면 size만큼만 출력
		System.out.println("---------------------");
		System.out.println("성적출력");
		
		//int size = list.current;//성적입력할때마다 list.current가 ++됨, 갯수만큼 출력
		
		for(int i=0; i<size; i++) {
			Exam exam = list.get(i);
			int kor = exam.getKor();
			int eng = exam.getEng();//exam.eng;
			int math = exam.getMath();//exam.math;
			
			int total = exam.total();//kor+eng+math;
			float avg = exam.avg(); // 3.0f;
			
			System.out.printf("국어%d : %d\n", i+1, kor);
			System.out.printf("영어%d : %d\n", i+1, eng);
			System.out.printf("수학%d : %d\n", i+1, math);
			
			System.out.printf("총점 : %3d\n", total);
			System.out.printf("평균 : %6.2f\n", avg);
			System.out.println("----------------------");
		}
		
	}
}

 

package Exam_1.UI코드분리하기;

public class ExamList {

	private int current;
	private Exam[] exams;
	
	public ExamList() { // 생성자 : 객체 생성시 단한번만 실행 되게됨
		this.exams = new Exam[3];
		this.current = 0;
	}
	
	public void add(Exam exam) {
		Exam[] exams = this.exams;
		int size = this.current;
		
		if(exams.length == size) {
			//1. 크기가 5개정도 더 큰 새로운 배열 생성
			Exam[] temp = new Exam[size+5];
			//2. 값을 이주시키기
			for(int i=0; i<size; i++) {
				temp[i] = exams[i];
			//3. list.exams가 새로만든 temp 배열을 참조하도록함
			//exams = temp 하고는 다름 이거는 틀림
			this.exams = temp;	
			}
		}
		
		this.exams[this.current] = exam; // 이부분이 좀 이해가 안되지만 값이 여기서 들어간듯함
		this.current++;
		
	}

	public Exam get(int i) {
		return this.exams[i];
	}
	

	public int size() {
		return current;
	}

}

 

package Exam_1.UI코드분리하기;

public class Exam {
	int kor;
	int eng;
	int math;
	
	public Exam() {
		this(0, 0, 0);
	}
	
	public Exam(int kor, int eng, int math) { 
		// 다른 생성자가 있으면 자동적으로 기본생성자가 생성이 안되기 때문에 
		// 따로 기본생성자를 생성해줘야함
		this.kor = kor;
		this.eng = eng;
		this.math = math;
	}

	public int getKor() {
		return kor;
	}

	public int getEng() {
		return eng;
	}

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

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

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

	public int total() {
		return kor + eng + math; // this 생략
	}

	public float avg() {
		return total() / 3.0f; // this 생략
	}

	
}