객체지향프로그래밍

캡슐화 -> 엮어내기(has A) -> 상속(Is A) / 추상화 : ->다형성(인터페이스).

 

캡슐화 :기능들을 서비스캡슐화

Has a : 여러캡슐들을 엮어서조립

Is a : 남의것을 상속받아서 고쳐쓰기

추상화 : 내것을 남이 쓸수있도록 골격을 만들어냄, 자식이 구현

 

추상화 : 일부분만 고쳐쓸때 (부모의 super.input()을  호출)가 있다.

 

public class YBMExamConsole extends ExamConsole : Is a 상속

YBMExamConsole은 구현안해도 내가 만든것처럼 보여줄수 있다. 또는 부모것을 고쳐 쓸 수 있다.

 

객체화하지않게 하려면  abstract class 

자식이 꼭 구현하도록 강요하려면 abstract method()

 


호출 프로세스 (데이터가 확장되면 출력이 문제가 된다)

순서: console.print() -> 부모의 print() -> 부모 print()안의 onPrint() -> 오버라이딩된 onPrint() -> onPrint()호출된곳으로돌아감->print()호출된곳으로 돌아감

ExamConsole사용하다가 exam객체가 달라졌을 경우 ?

국영수가아닌 다른과목이 포함되어야할 경우?

 

기존의 Console을 확장해서 NewExam에 맞게 콘솔을 다시작성해야하는 상황이 발생한다.

→데이터확장 → 자식클래스도 확장 →다시다상속관계 =>해결 : 없음

 

  • 상속받아서 고치는데, 최대한 부모것을 재사용하도록 재사용범위를 넓혀야한다.
  • 부모가 확장을 염두해두지않고 만들어지면 재사용 불가능
  • 함수하나만들어서 자식에게만 노출되는 함수 (onPrint() )
  • onPrint()는 자식이 활용하기 위해 아무코드가 없다. 자식이 사용예정
  • Frame에서 setVisible()과 같다.

 

Exam형인 getExam을 NewlecExam으로 형변환 해준다.

 

getExam()을 사용하면 자료형이 Exam이다.

Exam객체는 getCom()을 가지고있지않으므로 형변환 해줘야한다. 

 

YBMExam exam = (YBMExam)getExam();

자식YBMExam은 getExam()(객체가져오는메소드)가 없고, 부모Exam은 setToeic()이없다.

부모에게있는 getExam()을 자식으로 형변환해서 가져온 후

자식YBMExam에있는 setToeic(), getToeic()을 호출한다.

 

각 참조변수자료형에 따라 어떤 메소드가 없는지 알 수있다.


protected void onPrint()

다음에 클래스를 재사용한다면 추상화 ->공통분모제공.최대한 공통분모를 재사용할수록해야한다

모든자식은 ExamConsole을 틀로쓰겠다는거잖아요

  • 자식입장에서 부모로 뒀을 경우 자식은 print()기능을 내가 구현하지않고 부모기능을쓰는게더좋겠죠.
  • 부모ExamConsole이 protected void onPrint()를 가지고있되, 구현은 자식이 해서
  • 자식객체가 바뀌었을경우 재정의해서 사용할 수있도록한다.

부모 ExamConsole클래스의 print()함수 내에 onPrint()넣음

자식이 재정의하면 재정의한 것을 호출하도록했다.

ybmConsole은 마치 자기가 구현한것처럼 실행한다. 


Protected Exam getExam() // 자식이 부모의 멤버변수에 접근하도록 getter메소드생성

자식 ybmConsole에서 Exam exam을 사용할 수없음

내가 가지고있는 데이터가 자식에게 사용할가능성이있다면 , 자식이 사용할수있게끔 기능을 제공해야겠죠

이게없으면 다른애들이 exam사용불가, 자식이만 사용하도록 protected

 

부모가갖고있는 private Exam exam은 자식도 못쓴다. 일정한서비스를통해 넘겨사용(getter)

exam이 다른자식들이 이용하게끔 최대한서비스를 해주는 것 ->추상화클래스역할

최대한쉽게 재사용할수있게해주고 데이터제공.

YBMExamConsole이 부모의 onPrint()를 재정의하기위해 부모객체가 필요하다.


오버라이드비교

onPrint()는 부모것 불러올게없다.

input()은 부모의 input()을 받은 후 진행해야한다. 즉 국,영,수를 받고 토익,a를 받도록 해야한다.(출력순서에따라)

 

package ex8.추상화.재사용;

import java.awt.Frame;

public class Program {

	public static void main(String[] args) {
		
		Exam exam = new YBMExam(1,1,1,1,1);
		
		YBMExamConsole ybmConsole = new YBMExamConsole();
		ybmConsole.setExam(exam);
		
		ybmConsole.input();
		ybmConsole.print();
   }
}
package ex8.추상화.재사용;

import java.util.Scanner;

public class ExamConsole {
	private Exam exam; //부품으로씀
	private PrintListener printListener;
	


	public PrintListener getPrintListener() {
		return printListener;
	}

	public ExamConsole() {

	}		

	public ExamConsole(Exam exam) {//오버로드생성자만들때 기본생성자만들어야함
		super();
		this.exam = exam;
	}

	public void setExam(Exam exam) {
		this.exam = exam;
	}
	
	public void setPrintListener(PrintListener printListener) {
		this.printListener = printListener;
	}
	
	protected Exam getExam() {
		return exam;
	}
	
	protected void onPrint() {
		
	}

	public void print() {
		System.out.println("-----------------------------");
		System.out.println("            성적 출력          ");
		System.out.println("-----------------------------");
		System.out.printf("kor:%d\n",exam.getKor());
		System.out.printf("eng:%d\n",exam.getEng());
		System.out.printf("math:%d\n",exam.getMath());
//		if(printListener != null)
//		printListener.onPrint();
		onPrint();//호출
		System.out.printf("total:%d\n",exam.total());
		System.out.printf("avg:%f\n",exam.avg());
		System.out.println("-----------------------------");
	}
	public void input() {
		Scanner scan = new Scanner(System.in);

		int kor;
		int eng;
		int math;
		System.out.print("kor:");
		kor = Integer.parseInt(scan.nextLine());
		System.out.print("eng:");
		eng = Integer.parseInt(scan.nextLine());
		System.out.print("math:");
		math = Integer.parseInt(scan.nextLine());
		
		exam.setKor(kor);
		exam.setEng(eng);
		exam.setMath(math);
		
	}

}
package ex8.추상화.재사용;

import java.util.Scanner;

public class YBMExamConsole extends ExamConsole{
	@Override
	protected void onPrint() {
		YBMExam exam = (YBMExam)getExam();
		System.out.printf("Toeic:%d\n",exam.getToeic());
		System.out.printf("aa::%d\n",exam.getAa());
	}

	@Override
	public void input() {
		super.input(); //국영수먼저 받고
		
		Scanner scan = new Scanner(System.in);
		
		int toeic;
		int aa;
		
		System.out.print("toeic:");
		toeic = Integer.parseInt(scan.nextLine());
		System.out.print("aa:");
		aa = Integer.parseInt(scan.nextLine());
		
		YBMExam exam = (YBMExam)getExam();//부모형은 자식형으로바로안
		exam.setToeic(toeic);
		exam.setToeic(aa);
		
	}
}

+ Recent posts