자바 중급 033. 다형성(polymorphism)- instanceof연산자- 예제2(부모...

자바 중급 033. 다형성(polymorphism)- instanceof연산자- 예제2(부모...

반응형

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

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

1.instanceof연산자- 예제2

가. 상속관계시

(1) 객체 선언시 해당 객체의 멤버 변수 값을 우선한다.

(2) 객체에서 메소드 소환시 상속관계로 접근하였다면 상속된 멤버의 메소드우선( 오보라이딩 된 경우)

<>

상속계층도를 우선 보고 코드를 판단해야 합니다. 클래스 파일들이 따로 따로 작성되기 때문에 상속관계로 먼저 구조화를 한 다음에 코드를 보기 바랍니다. 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 메서드 호출");

}

}

<>

Chilld 클래스입니다.

역시 x =101로 설정하고

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

package example04;

public class Child extends Parent {

int x=101;

@Override

public void show() {

System.out.println(" child 메소드 호출");

}

}

<

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);

}

}

반응형

from http://sf2020.tistory.com/94 by ccl(A) rewrite - 2021-09-25 13:01:40