안녕하세요. 스마트 팩토리입니다.
자바 중급 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);
}
}
'Java' 카테고리의 다른 글
자바 중급 035. 다형성 예제 2)- 부모 객체 의 참조변수로 자식의 객체 접근 (0) | 2021.09.27 |
---|---|
자바 중급 034. 매개변수 다형성 : 이용하는 이유 예제)- 조상클래스 매개변수를 작성하고 자식 클래스 매개변수로 접근 (0) | 2021.09.26 |
자바 중급 032. 다형성(polymorphism)- instanceof연산자- 형변환 가능 여부 확인,Ctrl+T- 상속관계 확인 (0) | 2021.09.24 |
자바 중급 031. 다형성(polymorphism)- 형 변환, 다운 캐스팅, 업캐스팅 에러 ClassCastException 해결 방법 (0) | 2021.09.23 |
자바 중급 030. 다형성(polymorphism)- 부모클래스 참조변수로 자식클래스 접근 (0) | 2021.09.22 |
댓글