본문 바로가기

Java/본격 Java 상속

[Java] InstanceOf 하위클래스 형변환

오버라이딩에서 선언된 클래스 인스턴스에 따라 접근할 수 있는 범위가 달랐다.

즉, 하위클래스 인스턴스에는 상위클래스 인스턴스가 접근할 수 있지만, 상위클래스 인스턴스에는 하위클래스 인스턴스가 접근할 수 없다.

그러면 오버라이딩 없이 상속받은 클래스들로 작업할 때는 무슨 일이 일어날까

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
반응형