본문 바로가기
Java

자바 중급 033. 다형성(polymorphism)- instanceof연산자- 예제2(부모클래스, 자식클래스 매개변수로 접근 가능여부)

by Smart Factory in 2020 2021. 9. 25.
728x90
반응형

안녕하세요. 스마트 팩토리입니다. 

자바 중급 033. 다형성(polymorphism)- instanceof연산자- 예제2(부모클래스, 자식클래스 매개변수로 접근 가능여부)에 대해 알아보겠습니다. 

1.instanceof연산자- 예제2

가. 상속관계시 
(1) 객체 선언시 해당 객체의 멤버 변수 값을 우선한다.
(2) 객체에서 메소드 소환시 상속관계로 접근하였다면 상속된 멤버의 메소드우선( 오보라이딩 된 경우)

 

<<Parent.java 클래스- 조상 클래스>>

상속계층도를 우선 보고 코드를 판단해야 합니다. 클래스 파일들이 따로 따로 작성되기 때문에 상속관계로 먼저 구조화를 한 다음에 코드를 보기 바랍니다. int x=100; 부모 클래스 멤버변수 값을 기억해 둡니다. 모두 같은 변수로 값을 다르게 설정하였습니다. 

 public void O_type(Object obj) {

조상 클래스에서 오브젝트 클래스(최고조상)을 접근하는 경우는 당연히 형변환이 되기 때문에 참이 됩니다. 

이때 매개변수로 Objtct 클래스 멤버를 가지고 있으면 그 아래 상속 받는 클래스 모두를 매개변수로 접근할 수 있습니다. 

public void show()  부모 클래스의 show  메소드 상속 관계에 있는 메소드로 자식 메소드로 오버라이딩을 되었습니다. 

package example04;

public class Parent {
 int x=100;
 public void O_type(Object obj) {
 if(obj instanceof Parent) {
 Parent papa=(Parent)obj;
 System.out.println(" 조상클래스 멤버  x: "+papa.x);}
 else System.out.println(" 상속관계가 아닙니다.");
 }
 public void show() {
 System.out.println(" Parent 메서드 호출");
 }
}

 

<<Child.java 자식클래스>>

Chilld 클래스입니다. 

역시 x =101로 설정하고 

show() 메서드는 부모 클래스 메소드와 메소드 명이 같은 오버라이딩 되었습니다. 

 

package example04;

public class Child extends Parent {
 int x=101;

 @Override
public void show() {
System.out.println(" child 메소드 호출");
}
}

 

<<Cousin.java 상속관계 없는 클래스>

Cousin 클래스로 기존 클래스와 상속관계가 없는 클래스입니다. 

독립적인 클래스로 다른 클래스에 영향을 받지 않습니다. 

x 값은 201 입니다. 

package example04;

public class Cousin {
int x=201;
 public void show() {
 System.out.println("cousin 메소드 호출");
 }
}

<< FamilhyEx. java 메인 클래스>>

실행 클래스로 왔습니다. 

멤버 변수의 값은 상속 받은 것고 상관없이 원래 객체 값으로 출력이 됩니다. 하지만 메소드의 경우 오버라이딩이 된 경우 해당 자손 클래스 값으로 출력되는 것을 알 수 있습니다. 

Parent pa1=new Child();

System.out.println(pa1.x); -->pa1 원래 클래스 멤버 변수 값을 출력 100

pa1. 멤버변수로 접근시 부모 클래스의 멤버값이 출력됩니다. 

하지만 

pa1.show();-->child 메소드 호출

메소드 접근시 자식 클래스의 메소드로 접근하여 값을 출력합니다. 

 


pa1.O_type(new Child());

다형성 포인트는 바로 이 부분입니다. 

public void O_type(Object obj)   

최고조상을 매개변수로 접근하기 때문에 자식 매소드는 당연해 매개변수로 접근할 수 있습니다.

그래서  

pa1.O_type(new Child()); 값은 

Parent 클래스의 O_type 메소드에 접근할 수 있습니다

같은 방식으로 

pa1.O_type(ch1);

ch1도 접근할 수 있습니다. 

하지만

pa1.O_type(co1);

상속관계가 아닌 경우는 접근할 수 없습니다.

package example04;

public class FamilyEx {

public static void main(String[] args) {
Parent pa1=new Child();  --> 다형성 포인트 
Child ch1=new Child();  --> 각자 자기 객체 생성
Cousin co1=new Cousin(); --> 각자 자기 객체 생성
System.out.println(pa1.x); -->pa1 원래 클래스 멤버 변수 값을 출력 100
System.out.println(ch1.x); -->Child 클래스 멤버변수 값 출력  101
System.out.println(co1.x); --> Cousini  클래스 멤버 변수 값출력 201
pa1.show();-->child메소드 호출
ch1.show(); -->child메소드 호출
pa1.O_type(new Child());
pa1.O_type(ch1);
pa1.O_type(co1);
}
}
728x90
반응형

댓글