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

[뉴렉처] 이벤트 메소드 구현하기(팩토리 메소드 구현하기 이어서)

양상추상츄 2021. 10. 31. 19:57

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();
	}

}