Java 코드연습/팩토리 메소드

[뉴렉처] 팩토리 메소드 구현하기

양상추상츄 2021. 10. 31. 18:26

지금 현재 Exam이 추상클래스로 되어있기 때문에 ExamConsole에서 Exam을 객체로 생성하여 활용하는곳에서 오류가 발생하고 있다.

 

추상메소드를 가지려면 그 울타리인 클래스도 추상클래스로 변경해야함

package Exam_1.추상화;

import java.util.Scanner;

public abstract class ExamConsole {
	
	private ExamList list = new ExamList();
	
	void input() { //앞에 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);
		Exam exam = makeExam();
		exam.setKor(kor);
		exam.setEng(eng);
		exam.setMath(math);
			
		//-----------add--------------------------
		
		list.add(exam);
			
	}
	
	protected abstract Exam makeExam();
	
	
	void print() {//overloading

		this.print(list.size());//성적입력할때마다 list.current가 ++됨, 갯수만큼 출력
	}
	void print(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("----------------------");
		}
		
	}
}

//Exam exam = new Exam(kor, eng, math);
Exam exam = makeExam();
exam.setKor(kor);
exam.setEng(eng);
exam.setMath(math);

//-----------add--------------------------

list.add(exam);

}

protected abstract Exam makeExam();

 

protected abstract Exam makeExam(); 추상클래스인 Exam을 가져올 수 있게됨

input()으로 입력받은 자료를 exam.setKor .. 으로 set함

 


package Exam_1.추상화;//NewlecExam 프로젝트

public class NewlecExamConsole extends ExamConsole{

	@Override // 자식이 반드시 오버라이드 해야할 ExamConsole에 있는 makeExam 메소드
	protected Exam makeExam() {
		return new NewlecExam();
	}

}
package Exam_1.추상화;

public class NewlecExam extends Exam{
	private int com;
	
	public NewlecExam() {
		this(0,0,0,0);
	}
	
	public NewlecExam(int kor, int eng, int math, int com) {
		super(kor, eng, math);
		this.com = com;
	}
	
	public int getCom() {
		return com;
	}

	public void setCom(int com) {
		this.com = com;
	}

	@Override
	public int total() { // 상속받는 Exam 클래스에서 getKor등을 가져옴
		int total = onTotal() + com;
		return total;
	}
	
	@Override
	public float avg() {
		return total()/4.0f;
	}
}
package Exam_1.추상화;

public class Program {

	public static void main(String[] args) {
		ExamConsole console = new NewlecExamConsole();
		
		console.input();
		console.print();
	}

}

 

이대로 실행하면 국어 영어 수학만 입력받고

출력도 국어 영어 수학만 입력받게됨

그래서 ExamConsole의 모든내용을 재정의하게 된다면 ExamConsole의 코드는 쓸모없어짐

낭비되는 코드가 없게하는 방법은 다음 챕터에서..