지금 현재 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의 코드는 쓸모없어짐
낭비되는 코드가 없게하는 방법은 다음 챕터에서..
'Java 코드연습 > 팩토리 메소드' 카테고리의 다른 글
[뉴렉처] 이벤트 메소드 구현하기(팩토리 메소드 구현하기 이어서) (0) | 2021.10.31 |
---|---|
[뉴렉처] 팩토리 메소드(Factory Method) (0) | 2021.10.31 |