😵 ~23.11.10

0707 | 객체의 상속관계 is a

unikue 2023. 7. 7. 16:05

✅ 조상을 이어받는 상속관계

🟩 is a 상속

: 조립, 결합 과정이 아닌, 틀(frame)과 틀에서 찍어낸 관계. ▶ framework

: 재사용할때 <틀>이 있는지를 보고 (프레임워크 라이브러리 확인), 없으면 <부품>을 가져다가 만든다.

 

 

🟩 확장 클래스의 객체와 참조형식

: 부모를 가지는 클래스는 두개의 객체를 생성한다

NewlecExam(자식클래스)은 super와 this 두개를 가지고 있다

👉 오버라이드 된 자식클래스는 평소 자신의 인스턴스를 지칭하는 this와 조상을 호출하는 super를 가지고 있다.

super = 상속받은 객체만 지명할 수 있는 이름

 

오버라이딩 할 때에는 부모가 가진 kor, eng, math만 가져온다

▼ 내가 필요한 형태로 가공

내가 쓰고자 하는 com을 붙여서 생성자를 완성한다

 

 

 

🟩 is a 관계의 특징 ▶ 고쳐쓴다 ▶ 메소드재정의 (override)
: 자식클래스가 구현될때 부모형태를 일부 가져다가 구현. 그때 부모의 부분을 따로 명칭하기 위해 super라는 지시어를 쓴다

(*생성자를 호출할때는 해당 형식의 + (괄호) + 갓 생성된 + 사용된적이 없어야 한다)

public class NewExam extends Exam{
	Exam exam = new NewExam(); // NewExam()안에 Exam()객체가 있으므로 참조할 수 있다
	NewExam exam1= (NewExam) new Exam();
}

 

 

▼ 내가 필요한 형태로 가공

super를 통해 조상클래스의 total()을 호출하고 내가 필요한 com을 붙인다

 

 

 

백날 정리하는거보다 강의한번 더 듣는게 이해가 잘 간다 ▼

 

 


 

 

 

🟩 참조형식과 호출되는 메소드의 관계 (*자바는 참조형식이 아닌 객체형식의 함수를 우선호출한다)

▲ Exam타입에는 국영수만 있으니 생성자로 3이 출력되어야 할것같은데,4가 나온다...?

 

👉 자바는 참조형식이 중요하지 않다. 참조형식의 함수보다 객체 형식에 있는 함수를 호출한다.

(* 단 참조형식이 가지고 있는 함수내에서만 가능)

👉 객체가 우선순위를 갖고 해당 메서드가 있는지 확인하고, 없으면 부모 메서드를 호출한다.

부모메서드 안에서도 연결된 함수로 넘어가기전에 객체가 해당 함수를 갖고있는지 확인해서 그 함수를 호출한다.

 

따라서 단순히 부모가 가진걸 고쳐쓰는게 아니라 흐름이 바뀐다.

부모의 코드를 이어가는 와중에 내 코드를 거쳐서 가게 되는 상황. (내 코드를 꽂아넣게 됨)

 

 

 

 

다형성 정리본 ▼

 

 

 

 

 

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

: 함수가 있는 쪽으로 점프한다 = 바인딩한다

 

상속 받았을때 자식 객체 하나가 만들어지고 그 안에 부모의 영역이 있다.

함수는 공간이 아니라서 고정된 자리에 존재한다.

따라서 호출되는 다음 함수의 위치를 알아내는 작업을 해야한다

 

정적바인딩 - 컴파일시점에 번역기가 바인딩을 결정. 형식에 따라 가야 할 메서드가 고정된다.

동적바인딩 - 번역기가 바인딩을 정하지 않는다 (실행 중에 호출 될 때 전달된 객체에 따라서 결정된다)

자바에서 정적 바인딩(Static Binding)은 컴파일 시간에 수행되는 바인딩 방식입니다. 정적 바인딩은 메서드 호출이나 변수 참조 시에 어떤 메서드나 변수가 실제로 호출 또는 참조될지를 컴파일 시점에서 결정하는 것을 의미합니다.
정적 바인딩은 다음과 같은 특징을 가지고 있습니다:
  1. 컴파일 시간에 결정: 정적 바인딩은 컴파일러가 메서드나 변수에 대한 타입을 기반으로 결정됩니다. 즉, 컴파일 시간에 어떤 메서드나 변수가 호출 또는 참조될지가 결정됩니다.
  2. 오버로딩에 적용: 정적 바인딩은 메서드 오버로딩에 사용됩니다. 오버로딩은 동일한 메서드 이름을 가진 여러 메서드를 정의하는 것을 의미하며, 컴파일러는 오버로딩된 메서드 중에서 호출 시점에 정적으로 타입이 일치하는 메서드를 선택합니다.
  3. 초기화 시점에 결정: 정적 바인딩은 클래스의 정의 단계에서 초기화되며, 프로그램 실행 중에는 바뀌지 않습니다. 따라서, 정적 바인딩은 클래스의 정적 멤버(static member)인 정적 메서드나 정적 변수에 적용됩니다.
정적 바인딩은 컴파일 시간에 결정되기 때문에 실행 시간에 실제 객체의 타입에 따라 다른 메서드가 호출되지 않습니다. 이는 프로그램의 성능을 향상시킬 수 있지만, 다형성과 같은 동적인 특성을 제한할 수 있습니다.
반면에 동적 바인딩(Dynamic Binding)은 실행 시간에 실제 객체의 타입에 따라 메서드가 동적으로 결정되는 바인딩 방식입니다. 동적 바인딩은 다형성을 지원하며, 메서드 오버라이딩과 같은 동적인 특성을 가능하게 합니다.