객체지향프로그래밍
캡슐화 -> 엮어내기(has A) -> 상속(Is A) / 추상화 : ->다형성(인터페이스).
캡슐화 :기능들을 서비스캡슐화
Has a : 여러캡슐들을 엮어서조립
Is a : 남의것을 상속받아서 고쳐쓰기
추상화 : 내것을 남이 쓸수있도록 골격을 만들어냄, 자식이 구현
추상화 : 일부분만 고쳐쓸때 (부모의 super.input()을 호출)가 있다.
public class YBMExamConsole extends ExamConsole : Is a 상속
YBMExamConsole은 구현안해도 내가 만든것처럼 보여줄수 있다. 또는 부모것을 고쳐 쓸 수 있다.
객체화하지않게 하려면 abstract class
자식이 꼭 구현하도록 강요하려면 abstract method()
호출 프로세스 (데이터가 확장되면 출력이 문제가 된다)
ExamConsole사용하다가 exam객체가 달라졌을 경우 ?
국영수가아닌 다른과목이 포함되어야할 경우?
기존의 Console을 확장해서 NewExam에 맞게 콘솔을 다시작성해야하는 상황이 발생한다.
→데이터확장 → 자식클래스도 확장 →다시다상속관계 =>해결 : 없음
- 상속받아서 고치는데, 최대한 부모것을 재사용하도록 재사용범위를 넓혀야한다.
- 부모가 확장을 염두해두지않고 만들어지면 재사용 불가능
- 함수하나만들어서 자식에게만 노출되는 함수 (onPrint() )
- onPrint()는 자식이 활용하기 위해 아무코드가 없다. 자식이 사용예정
- Frame에서 setVisible()과 같다.
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()를 가지고있되, 구현은 자식이 해서
- 자식객체가 바뀌었을경우 재정의해서 사용할 수있도록한다.
자식이 재정의하면 재정의한 것을 호출하도록했다.
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);
}
}
'2021 Newlecture > JAVA' 카테고리의 다른 글
(추가정리) 상속 (0) | 2021.04.10 |
---|---|
(추가정리)this키워드 (0) | 2021.04.10 |
(추가정리) 패키지와 static (0) | 2021.04.10 |
인터페이스 (0) | 2021.04.08 |
Constructor Dependency Injection 생성자 종속성 주입 / abstract / protected (0) | 2021.04.06 |
추상화 / abstract class/ abstract method (0) | 2021.04.05 |
Is a , has a 상속 정리 / 함수 호출 관계/ 동적바인딩 / 부모형식의 참조변수 (0) | 2021.04.02 |
오버로드/매개변수 있는 생성자/super(int value)/ Frame클래스 상속 후 오버라이딩 (0) | 2021.04.01 |