on
자바 중급 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