오버라이딩에서 선언된 클래스 인스턴스에 따라 접근할 수 있는 범위가 달랐다.
즉, 하위클래스 인스턴스에는 상위클래스 인스턴스가 접근할 수 있지만, 상위클래스 인스턴스에는 하위클래스 인스턴스가 접근할 수 없다.
그러면 오버라이딩 없이 상속받은 클래스들로 작업할 때는 무슨 일이 일어날까
class BasicBox
{
public void basicWrap(){ System.out.println("Basic Wrap"); }
}
class PaperBox extends BasicBox{
public void paperWrap(){ System.out.println("Paper Wrap"); }
}
class GoldBox extends PaperBox{
public void goldWrap(){ System.out.println("Gold Wrap"); }
}
class InstanceOf
{
public static void main(String[] args)
{
BasicBox box1 = new BasicBox();
PaperBox box2 = new PaperBox();
GoldBox box3 = new GoldBox();
wrapBox(box1);
wrapBox(box2);
wrapBox(box3);
}
public static void wrapBox(BasicBox box){
// 매개변수를 BasicBox형으로 받을 수 있는 이유는 상위 클래스이므로 받을 수 있음
// BasicBox로 받았기 때문에 box로는 BasicBox의 멤버만 사용가능
// 하위클래스의 멤버를 사용하려면 box를 하위클래스형으로 형변환한 후 사용해야 함.
if(box instanceof GoldBox){
// box가 GoldBox형으로 형변환이 가능하면
((GoldBox)box).goldWrap();
}else if (box instanceof PaperBox)
// box가 PaperBox형으로 형변환이 가능하면
{
((PaperBox)box).paperWrap();
}else{
box.basicWrap();
}
// 형변환 가능여부를 위한 if문을 사용할 대에는 반드시 최하위 클래스부터 가능여부를 검사해야 함.
// 상위클래스가 먼저 나오면 형변환이 가능하므로 상위클래스로 변환이 됨.
}
}
.
.
그러면 상위클래스가 하위클래스에 접근할 수 있는 것을 이용하여, 각각의 클래스들을 비교후에(instanceOf) 상위클래스로 형변환하여 메소드가 실행될 수 있도록 한다.
이렇게 하나씩 비교할 때는 형변환에 어려움이 있다.
그러면 오버라이딩을 이용해보자.
.
.
예제
class BasicBox
{
public void basicWrap(){ System.out.println("Basic Wrap"); }
public void wrap(){ basicWrap(); }
}
class PaperBox extends BasicBox{
public void paperWrap(){ System.out.println("Paper Wrap"); }
public void wrap(){ paperWrap(); }
}
class GoldBox extends PaperBox{
public void goldWrap(){ System.out.println("Gold Wrap"); }
public void wrap(){ goldWrap(); }
}
class InstanceOf2
{
public static void main(String[] args)
{
BasicBox box1 = new BasicBox();
PaperBox box2 = new PaperBox();
GoldBox box3 = new GoldBox();
wrapBox(box1);
wrapBox(box2);
wrapBox(box3);
}
public static void wrapBox(BasicBox box){
box.wrap();
// 각 클래스별로 오버라이딩하여 받아오는 인스턴스별 최하위클래스의 메소드를 실행
}
}
상위클래스에 메소드를 정의하여 각각의 하위클래스들이 오버라이딩할 수 있게 한다면 더 깔끔하게 코딩할 수 있다.
728x90
반응형
'Java > 본격 Java 상속' 카테고리의 다른 글
[Java] 실습 - 전화번호부 만들기 - 2 (0) | 2020.06.30 |
---|---|
[Java] 실습 - 전화번호부 만들기 - 1 (0) | 2020.06.30 |
[Java] 오버라이딩(overriding)과 오버로딩(overloading) (0) | 2020.06.30 |
[Java] 오버라이딩(overriding) (0) | 2020.06.30 |
[Java] 상속 has-a관계 (0) | 2020.06.29 |