본문 바로가기
JAVA

참조형식과 호출되는 메소드 관계

by 영카이브 2024. 1. 18.

어떤 참조형식이 가능한가

 

Product와 SaleProduct는 IS A 상속관계로 Product는 부모클래스 / SaleProduct는 자식클래스이다. 

둘 중 옳은 것은?

  • Product product = new SaleProduct(); (O)
  • SaleProduct product = new Product(); (X)

SaleProduct객체 안에는 Product객체와 SaleProduct 객체가 있기때문이다. 따라서 참조형식이 2개이다.

 

 

적용 

 

Product product = new SaleProduct(); 를 보고 호출되는 메서드관계를 알아보자 

1. 참조형식이 뭐냐에 따라서 호출 할 수 있는 메서드의 범위가 정해진다. >> Product에 있는 메서드만 호출가능하다.
2. 그 다음 new 한 객체에 Override한 메서드가 있다면 그 메서드가 부모객체의 기존 메서드보다 우선순위이다. 

왜냐하면 자바는 참조형식의 메서드보다 객체 형식의 메서드 호출을 우선으로 하기때문이다. 

"참조형식의 메서드보다 객체 형식의 메서드 호출을 우선으로 한다"는 말은, 자바에서는 메서드 호출 시에 객체의 실제 타입에 따라 메서드가 선택되므로, 참조 변수의 선언 타입이 아니라 객체의 타입이 우선하여 메서드가 호출된다는 것을 나타냅니다.

>> Product메서드를 SaleProduct에서  Override한 동일한 이름의 메서드가 있다면 SaleProduct클래스에 있는 메서드를 호출한다.

 

 

문제

 

A 클래스 : f1(), f2(), f3(), f4(), f5()

B 클래스  : f3(), f5(), f6(), f7()

부모가 가진 메서드 Override : f3(), f5()

새로 정의한 메서드 : f6(), f7()

 

문제 : A a = new B(); 이고 a.f6(); 는? 

답 : 에러 

이유 : a가 가지고 있는 참조 형식은 A객체이다. 따라서 불러올 수 있는 메서드 범위는 f1()~f5()이기때문이다.

 

문제 : A a = new B(); 이고 (B)a.f6(); 는? 

답 : 에러

이유 : 형변환이 먼저 일어나는 것이 아니라 우선순위가 '.'이 높아 A클래스의 f6()을 호출한다. 없으므로 에러가 난다.

 

문제 :   A a = new B(); 이고 ((B)a).f6();는? 

답 : B클래스의 f6() 호출

이유 : 소괄호를 한번 더 써줄 경우 형변환이 먼저 일어난다. 

 

문제 :   A a = new B(); 이고 a.f2()는? 

답 : B클래스의 f3() 호출

이유 : 1. 참조 형식이 A객체이므로 불러올 수 있는 범주는 A클래스의 메서드들이다.

2. A클래스에 f2()가 있다. 

3. f2()에서 f3()를 호출한다.

4. B클래스에서 f3()를 Override했으므로 A클래스가 아닌 B클래스의 f3() 호출

 

문제 :   B b = new B(); 이고 b.f2()는? 

답 : B클래스의 f3() 호출

이유 : 1. B클래스의 f2()가 없으므로 부모클래스 A에서 f2()를 호출한다.

2. f2()에서 f3()를 호출한다.

3. 자식클래스인 B클래스에서 f3()를 Override하므로 해당 메서드를 호출한다. 

 

문제 :   A a = new B(); 이고 a.f4()는? 

답 : 무한루프

이유 : 1. 참조 형식이 A객체이므로 불러올 수 있는 범주는 A클래스의 메서드들이다.

2. A클래스에 f4()가 있다. 

3. f4()에서 f5()를 호출한다.

4. B클래스에서 f5()를 Override했으므로 A클래스가 아닌 B클래스의 f5() 호출

5. f5()에서 f4()를 호출하고 있는데 현재 클래스에서 없기때문에 부모클래스의 f4() 호출

6. 다시 f4()에서 f5()를 호출한다. 

7. 이 과정들이 무한으로 반복된다.

 

 

 

 

 

 

참고 자료 출처 : https://www.youtube.com/watch?v=X1ZYZkSyi7g&list=PLq8wAnVUcTFV4ZjRbyGnw6T1tgmYDLM3P&index=71

https://www.youtube.com/watch?v=vlkOwD828yg&list=PLq8wAnVUcTFV4ZjRbyGnw6T1tgmYDLM3P&index=72

'JAVA' 카테고리의 다른 글

탬플릿 메서드 패턴 & 팩토리 메서드패턴  (0) 2024.01.24
메서드 동적 바인딩  (0) 2024.01.19
IS A 상속  (0) 2024.01.16
코드 재사용  (0) 2024.01.14
Has A 관계  (0) 2024.01.11