https://www.youtube.com/watch?v=WEm6Bhc3vOc&list=PLq8wAnVUcTFX4E2NplMvJfqlcgAeF_BxK&index=28
전체를 다시 오버라이드 하기에는 오버니까 아래처럼 해야함
추상메소드를 통해 새로 추가되는 부분만 자식에게 오버라이드 맡기고
부모는 기존에 가지고 있는 국어, 영어, 수학 부분만 책임지게함
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(kor, eng, math);
Exam exam = makeExam();
exam.setKor(kor);
exam.setEng(eng);
exam.setMath(math);
//추상화된 Exam에 접근하게됨 위 방식으로 저장
onInput(exam);// 어떤 사건이 일어날때 실행되는 함수(이벤트 함수)
//-----------add--------------------------
list.add(exam);
}
protected abstract void onInput(Exam exam);
//부모데이터도 받아야해서 Exam exam을 적음
protected abstract Exam makeExam();
// Exam이 추상클래스라 makeExam을 만들어서 Exam에 데이터들을 수정함
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);
onPrint(exam);// 부모의 데이터를 넘겨주기 위해 exam 넣어줌
System.out.printf("총점 : %3d\n", total);
System.out.printf("평균 : %6.2f\n", avg);
System.out.println("----------------------");
}
}
protected abstract void onPrint(Exam exam);
}
package Exam_1.추상화;
public abstract class Exam {
private int kor;
private int eng;
private 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 abstract int total(); //{
//return kor + eng + math; // this 생략
//} //자식에게 구현할 것을 강요
protected int onTotal() {
return kor + eng + math;
}// 자식에게만 보여지는 protected
public abstract float avg(); //{
//return total() / 3.0f; // this 생략
//} //자식에게 구현할 것을 강요
}
package Exam_1.추상화;
import java.util.Scanner;
public class NewlecExamConsole extends ExamConsole{
@Override // 자식이 반드시 오버라이드 해야함
protected Exam makeExam() {
return new NewlecExam();
}
//국어 영어 수학을 저장하고 newlecExam을 실행해서 컴퓨터까지 저장
@Override
protected void onInput(Exam exam) {
NewlecExam newlecExam = (NewlecExam)exam;
//부모 exam은 컴퓨터를 저장하지 못함 그래서 NewlecExam으로 형변환
Scanner scan = new Scanner(System.in);
int com;
do {
System.out.print("컴퓨터 : ");
com = scan.nextInt();
if(com<0||100<com) {
System.out.print("컴퓨터성적은 0~100까지 범위만 입력해주세요");
}
}while(com<0||100<com);
newlecExam.setCom(com);
}
@Override
protected void onPrint(Exam exam) {
NewlecExam newlecExam = (NewlecExam)exam;
//형식이 Exam이라 Exam의 내용만 보여서 com은 못가져옴 그래서 NewlecExam으로 형변환함
int com = newlecExam.getCom();
System.out.printf("컴퓨터 : %d\n", com);
}
}
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();
}
}
'Java 코드연습 > 팩토리 메소드' 카테고리의 다른 글
[뉴렉처] 팩토리 메소드 구현하기 (0) | 2021.10.31 |
---|---|
[뉴렉처] 팩토리 메소드(Factory Method) (0) | 2021.10.31 |