정리

1. 부모자식관계에서 자식클래스 객체는 부모클래스형식으로 참조가가능
2. 부모형식으로 참조할경우 : 객체가 자식이면 자식이 갖고있는 오버라이드가 우선이다.
부모형식의 정의된 함수목록으로만 함수호출이 한정된다
3. 벗어나고싶다면 형변환해야한다


캡슐():개체->실체,객체,인스턴스

캡슐 함수를 포장 : 메소드(스태틱,인스턴스) -> 차이점 ?

스태틱은 인스턴스를 넘겨받지않는다.

인스턴스메소드는 객체를넘겨받는 메소드다.

인스턴스를통해서 사용. this사용가능

 

캡슐이 객체지향에서 가장 기본 모듈 단위이다.

캡슐과 캡슐을 엮어서 프로그램을 만든다.

 

조립관계 : has A 관계 (부모가 부품)

틀로 사용하는 관계 : Is a 관계 (부모가 틀) , 일반적인 상속

->틀에 덧붙이거나 메소드 수정하거나, 사용자에게는 마치 내가 제공하는것처럼 보임,ㅠ 고쳐사용하는 메소드 : 오버라이드

 

오버로드 메소드: 기존메소드보다 인자를 확장 또는 추가 또는 수정된 메소드

                       (기존메소드에  인자가 추가된, 형식이 다른메소드, 새로운 메소드)

 

생성자:초기화하는 함수 init()

두가지 초기화조건이있어야 한다

1. 객체가 생성되자 마자 초기화 되어야한다. (new Eaxm(); 수동으로 우리가 객체를 생성하며 호출한것)

2. 한번만 초기화가 되어야한다.

 

B extends A처럼 두 클래스가 Is A상속관계에 있을때는 생성자가 두 번 호출된다.

New B()에서 A의 기본생성자를 호출하는 방법은 ? super(); //부모객체 ,자식에 의해 만들어진 객체

 

B extends A처럼 두 클래스가 Is A상속관계에 있을때는 new B()객체를 참조할 수 있는 참조형식은 두가지가 가능하다. 어떤형식인가 ? BA (B안에있는 A도 참조할 수 있다)


함수 호출 관계

오버라이드우선

 

부모안에 total()이 없어서 오류 /      부모안에 f6()없어서 오류

형변환: ((B)a).f6();

  • A형을 B형식으로 먼저바꾼 뒤 f6()을 호출해야한다.
  • (B)a.f6() 오류 : a.f6(을 호출하고나서 형식을바꿈

문제1 . 오버라이드우선

부모함수가 f3()을 호출했고 객체가 B객체고 오버라이드되었다면 자식의 f3()이 호출된다. 

두 그림의 결과 f3()으로 동일

오버라이드되서 자식의 f3()이호출된다.

 

문제2 . 무한루프

 

문제3. 오버라이드함수의 우선권 : F4는 오버라이드되서 먼저 불려와진다.

  • 형식이 A이더라도 객체가 B면 B의 메소드를 호출한다.
  • 함수호출이 번역이되면 어셈블리어로 바뀐것을 보면 JUMP 주소 으로 바뀐다.

함수가있는 위치의 주소로 맵핑된다. 함수이름이 결국 주소로되서 주소로 가게된다.

함수가 주소가 맵핑될때 , 주소를 결정짓는 과정에서 컴파일러가 A가 자식이 여럿이 있다면 

자식이 B,C 등 있을 수 있는데, 그 동작은 어떻게되는가 ? 

  • 어떤것을 기준으로 주소를 바인딩하는가 ?
  • A형식에 맞춰서 A안에있는 f3()를 주소로 바인딩한다.
  • 함수라는게 호출될떄 함수주소로 번역하는것 : 바인딩 

메소드 동적 바인딩 (함수 호출 위치 결정 방식 이해하기)

C++와 자바의 차이점

NewlecExam을 호출하려면 virtual를 써줘야한다.
virtual를 붙이면 바인딩을 미룬다.
함수의 위치를 객체가 가진다. 객체가 갖고있는 상자를 열어서 점프하게한다.
전달되는 객체에따라 달라진다.

컴파일 : static 바인딩 (virtual 아닌것)
실행 : dynamic 바인딩 
다이나믹바인딩, 동적바인딩 : 컴파일할때 바인딩하지않도록하고 실행할때 (자바는없음)
객체가 가지고오는 주소로가라. 실행되어야만 알 수 있다.

 

자바는 모든 메소드가 virtual이다.
자바는 모두 동적바인딩

 

자바의 함수 호출

자바는 동적바인딩만 지원하므로 모든 함수호출이 점프하는곳이 결정을 미룬다.


점프할곳을 어떻게찾는가 ? 
클래스가 만들어지면 점프번지를 기록하는 virtual 테이블이존재. 위치정보를 가지고있음
객체가만들어질때 추가적으로 4바이트씩 더 가진다.
그 4바이트가 자기가 가지는 메소드의 위치를 기록하는곳을 가리킨다. 
객체가전달될때 전달된 객체의 앞머리를통해 그쪽 total()로가게된다.
전달된 내용의 앞머리를 통해 virtual 테이블의 주소로 간다.
전달되는 객체가 뭐냐에따라 달라지게된다. 전달된 객체가 뭐냐에따라서 전달된 객체의 함수로 가게된다.
동적으로 실행해봐야 아는, 실행중에 주소가 결정되는 시스템


함수호출시 항상 자료형보다는 전달되는 객체가 뭐냐가 중요하다.
자료형: 형식은 한정만 시킨다.

 

A형식이라는것의 의미 : A가 가지고있지않은 멤버를 호출할 수없다.
e.g : a.f6();

 

자바는 컴파일할때 함수위치를 알려주지않고 객체가 위치를가지고있고 그 함수를 우선으로 호출된다.

int total = jump [    ];

함수주소가 A가 가지고있는 주소를 벗어나 자식이 전달될 수 있다고 생각하고 비워놓은상태 , A 범주내에서 호출되게끔하되 자식이 재정의한것을 넘겼을경우 자식이 호출될 수 있도록 잠깐비워둔 상태, 동적바인딩이라고한다.

나중에바인딩-다이나믹바인딩
A의 자식들의 객체가 전달될 수 있게금 비워두는것
나중에 전달된 객체를 찾고 실행중에 찾아서실행 (동적)

 

new Exam객체 : 12바이트 + 4바이트(virtual)

new NewlecExam객체 : 16바이트 +4바이트(virtual)

자바는 데이터공간 외에 4바이트를 더 갖는데. 그 4바이트는 메서드의 위치를 가리킨다.

객체가가진 앞머리를 통해 virtual 테이블에있는 주소로 가게된다.

Exam이 전달되면 앞머리(4바이트)를 통해 초록색 total 주소 로 가게되고

NewlecExam이 전달되면 앞머리(4바이트)를 통해 오렌지total주소로 가게된다.

전달되는 객체에따라 전달되는것이 다르다.


자료형을 자신의 개체보다 부모개체로 하면 다양한 객체를 넘겨 받을 수 있다.

print(B b)일경우
B로 참조를 한정할경우
b에 new C, new D를 전달할수없다.
B로 한정해버리면 다양한 객체를 넘겨받을 수 없게된다.

부모자료형으로  쓰면 넘겨받은 객체의 범위가 넓어진다.

super의 범위 (this 전체, super는 A~B)

A라는 클래스는 여러 자식을 갖을 수 있다.

자식C, B, D는 A부모형을 참조할 수 있다.

자식객체는 자기 개체를 참조할 수있고, 부모개체를 참조할 수있다.

A a = new C();

C가 아무것도 구현하지않았어도 A의기능을 구현할 수있다.

C가 f()를 재정의하면 f는 C의것이다.

A a = new C();

a.f()일지라도 C의 것이 호출된다. 

My2Frame가 repaint()를 오버라이드함


다음 수업순서 :

  • 자바 객체지향 → 서블릿(Back End) 오라클 Restful API JSP
  •                    →자바스크립트 AJAX (DOM:event) 화면갱신 HTML5 API
  • CSS PC페이지 모바일viewpoint  
  • 모바일 고정길이 dp(안드로이드) / pt(iso)

 

+ Recent posts