추상화 

1. 네모,세모,원,선을 만들다 보니 동일한 서비스들이 있다→ 동일한 기능을 일괄적으로 관리하기위해 추상화된 자료형 도형을 만들다.

2. 성적관리프로그램을 만들다 성적관리프로그램을 기반으로 만들어지는 제품을 위해 (다음에도 계속 사용하기위해) 공통분모화,추상화를하다.

 

DI (조립)

1. Constructor (생성자 종속성 조립)

2. Setter DI

 

  • 추상클래스는 추상메소드를 가지고 있다.
  • protected : 자식만 구현하도록 추상부모클래스에서 메소드에 제한거는것. 자식에게만 공
  •                같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능
  • 부모의 private 멤버변수는 자식에게도 안보인다.
  • 클래스가 상속할 (자식을 낳을) 준비가 되지않았다면 , 재사용하기 불가능할 수 있다.
  • 객체가 YBMExam일때 출력도구도 달라져야한다. 
  • YBMExam전용 콘솔도구를 만들어야한다. 그때 ExamConsole이 재사용할 준비가 안되었다면 자식이 재사용할수 없게된다.

 


 

고쳐쓰는 방법 1 : 추상화 

사용자를 위한  껍데기부분을 만들때 상속이 많아지는 문제가 발생한다.

 

Exam class에 abstract를 지우고 시작.

출력을 위한 ExamConsole class{ }를 만들고 Exam class에 getter, setter를 추가한다.

 

Exam은 아직 객체를 갖지않았다.

객체를 갖는방벙 2가지

1. 객체를 자기가 만들거나

2. 남이 객체를 만들어서 넘겨주는것

 

ExamConsole console = new ExamConsole(exam);

ExamConsole 은 exam없이는 살 수없다.

exam을 생성할때 한번 꽂으면 더이상 다른 exam으로 대체할 수 없다.

Constructor DI : Dependency(종속성) Injection(주입) 생성자 종속성 주입

부품을 껴넣다.

AssoAssociation Has A 관계를 Injection하는것 => DI라고 한다.

ExamConsole은 exam을 분리형태로 부품으로 쓴다. 조립형

 

console.setExam(exam); 

언제든지 다른 객체로 바꿀 수 있다.

 

다양한 객체를 부품으로 사용한다.

Dependency: 재료가 되는 객체를 말한다. (has a)

exam은 ExamConsole이 자기 부품으로 쓰는것

Random은 함수를 일시적으로 쓰는것.

 

객체를 부품으로 사용한 예

필드를 사용하는 초기화하는 생성자

마우스오른쪽 -> source -> Generate constructor using fields

 

ExamConsole()와 ExamConsole(Exam exam) 생성자 공존 할 수없다.

Exam exam은 null이고

객체를 꽂을 수 있는 방법은 ExamConsole(Exam exam) 를 통해서만 가능하다.

ExamConsole()를 지우면 사용자는 ExamConsole(Exam exam)을 통해서만 객체를 생성할 수있다.

(기본생성자를 지우면 exam을 넣어야하는상황이된다)

 

ExamConsole()를 가능하게 한다면 

사용자가 기본생성자를 쓸 수있고 출력시 null값이 나온다.

생성할때 exam을 껴놓는 이유  ?  (exma)

 

exam을 생성자를 통해서만 만들게 했을까 ?

ExamConsole의 모든기능은 exam없이는 사용할 수없다.

 

e.g 스캐너도 기본생성자가없다. 입력스트림객체를 넣어줘야한다. 꽂지않으면 오류발생

객체를 넘겨줘야만 사용할 수 있다.

 

ExamConsole은 exam없이 독단적으로 사용가능?

사용할 수 없다.

ExamConsole은 반드시 생성하자 마자 exam을 갖고있어야 한다.

 

만약 누군가가 기본생성자를 호출한다면 내가 만들어주는것으로

public ExameConsole(){ exam = new Exam(); }

기본생성자를 저렇게만들면 밖에서 ()으로만으로도 할수있음

만들기나름,기획하기나름,선택가능

일체형
밖에서 호출할때

Setter를 통해 객체전달

Exam에 set함수 만들기

 public abstract int total();

total은 국,영,수뿐만 아니라 다른과목도 추가할 수 있어야한다.

국,영,수 합계를 자식이 직접계산할 필요는 없다. YBM ,다른고등학교에서는 과목이 달라질것이므로 고쳐쓸 수 있게한다.

상속을 통해 고쳐쓴다.

Exam클래스의 total 수정
NewExam에서 오버라이드한 모습

protected 

baseTotal()이 public이면 상속받는 자식에게만 구현하도록 만든 서비스이다.

자식에게만 보이게하는 키워드

내가 공통분모고 abstact, 자식만 구현하록하고싶을때 사용 

 

 

고쳐쓰는방법 2 : 인터페이스

 

객체를 YBMExam으로 바꿨는데, 여전히 국,영,수만 출력이된다.

지금 이그젬에만 특화되어있다

기존코드를 고치는 방법에 대해 ..

콘솔: 사용자에게 출력하는코드

exam은 자식을 계속 낳을 수 있다.

examConsole은 어떤객체(어떤자식)이꽂아질지모른다.

프린트가 부모영역으로만 한정된출력을가지고 있다.

달라져야한다 프린트의 기능이 객체종류에 따라 달라질 필요가 있다

 

저안에 들어갈 국영수외에 확장될부분을 너가 책임져줘.

단 구현해놔. 구현하지않으면 안하는거고~

자바는 함수만 꽂는건불가능 클래스안에 넣어야한닫.

onPrint를 구현해줘

누군가가 함수를 구현해서 객체를 넣어주기만 하면 ExamConsole을 재사용할 수있다.

public interface PrintListener 

함수에대한 약속만 나열한것 (구현x)

함수내용을 구현해서 꽂아넣었다면 

+ Recent posts