파란하늘의 지식창고
article thumbnail
반응형

백견이 불여일타.
예제를 통해 이해를 하는 것이 좋은 것 같다.

예제 소스는 다음과 같다.
package bluesky.test;

public class ClassA {
	String strA = "strA";
	String strA2 = "strA2";
	
	public void methodA() {
		System.out.println("methodA");
	}
	public void methodA2() {
		System.out.println("methodA2");
	}
}
상위 클래스
package bluesky.test;

public class ClassExtendA extends ClassA {
	String strA = "strExA";
	String strA3 = "strExA3";
	
	public void methodA() {
		System.out.println("methodExA");
	}
	public void methodA3() {
		System.out.println("methodExA3");
	}

}
하위 클래스
package bluesky.test;

public class TestExtend {

	public static void main(String[] args) {
		ClassA ca = new ClassA();
		ClassExtendA cea = new ClassExtendA();
		ClassA cea2 = new ClassExtendA();
		//ClassExtendA ca2 = new ClassA();	//Compile Error

		System.out.println("----------기본호출-----------------------------------------");
		//변수 호출
		System.out.println("ca.strA					= " + ca.strA);
		System.out.println("cea.strA				= " + cea.strA);
		System.out.println("cea2.strA				= " + cea2.strA);
		
		//메소드 호출
		System.out.print("ca.methodA()				= ");
		ca.methodA();
		System.out.print("cea.methodA()				= ");
		cea.methodA();
		System.out.print("cea2.methodA()				= ");
		cea2.methodA();

		System.out.println("-----------------------------------------------------------");
		System.out.println("----------형변환호출---------------------------------------");
		//형변환 변수 호출
		//System.out.println("((ClassExtendA) ca).strA		= " + ((ClassExtendA) ca).strA);	//Runtime Error
		System.out.println("((ClassA) cea).strA			= " + ((ClassA) cea).strA);	// 형변환을 상위의 값으로는 변환 가능.
		System.out.println("((ClassExtendA) cea2).strA		= " + ((ClassExtendA) cea2).strA);

		//형변환 메소드 호출
		//((ClassExtendA) ca).methodA();	// Runtime Error
		System.out.print("((ClassA) cea).methodA()		= ");
		((ClassA) cea).methodA();
		System.out.print("((ClassA) cea2).methodA()		= ");
		((ClassA) cea2).methodA();
		
		System.out.println("-----------------------------------------------------------");
		System.out.println("-----상위 클래스에만 존재하는 변수, 메소드 호출--------------");
		//상위 클래스에만 존재하는 변수 호출
		System.out.println("ca.strA2				= " + ca.strA2);
		System.out.println("cea.strA2				= " + cea.strA2);
		System.out.println("cea2.strA2				= " + cea2.strA2);
		
		//상위 클래스에만 존재하는 메소드 호출
		System.out.print("ca.methodA2()				= ");
		ca.methodA2();
		System.out.print("cea.methodA2()				= ");
		cea.methodA2();
		System.out.print("cea2.methodA2()				= ");
		cea2.methodA2();


		System.out.println("----캐스트 형변환시 상위 클래스에만 존재하는 변수, 메소드 호출-");
		//형변환시 상위 클래스에만 존재하는 변수 호출
		//System.out.println("((ClassExtendA) ca).strA2		= " + ((ClassExtendA) ca).strA2);	//Runtime Error
		System.out.println("((ClassA) cea).strA2			= " + ((ClassA) cea).strA2);	// 형변환을 상위의 값으로는 변환 가능.
		System.out.println("((ClassExtendA) cea2).strA2		= " + ((ClassExtendA) cea2).strA2);
		//형변환시 상위 클래스에만 존재하는 메소드 호출
		//((ClassExtendA) ca).methodA2();	// Runtime Error
		System.out.print("((ClassA) cea).methodA2()		= ");
		((ClassA) cea).methodA2();
		System.out.print("((ClassA) cea2).methodA2()		= ");
		((ClassA) cea2).methodA2();
		System.out.println("-----------------------------------------------------------");
		
		System.out.println("----형변환 시 하위 클래스에만 존재하는 변수, 메소드 호출-");
		//형변환시 하위 클래스에만 존재하는 변수 호출
		//System.out.println("((ClassExtendA) ca).strA3		= " + ((ClassExtendA) ca).strA3);	//Runtime Error
		//System.out.println("((ClassA) cea).strA3			= " + ((ClassA) cea).strA3);	//Compile Error
		//System.out.println("((ClassExtendA) ceA3).strA3	= " + ((ClassExtendA) ceA3).strA3);	//Compile Error
		//형변시 하위 클래스에만 존재하는 메소드 호출
		//((ClassExtendA) ca).methodA3();	// Runtime Error
		//((ClassA) cea).methodA3();	//Compile Error
		//((ClassA) ceA3).methodA3();	//Compile Error
		System.out.println("-----------------------------------------------------------");
		
	}
}
테스트 클래스

주석으로 된 곳은 한 줄씩 풀고 실행하면서 에러를 체크해보는 것이 좋다.
실제 위와 같이 생성한 자바 객체에는 다음과 같이 객체 변수가 할당된다.


논리적으로 상위 클래스의 형선언에 하위 클래스의 객체를 생성하는 것은 오류가 있기 때문에 compile error가 발생하며 그 반대의 경우에는 compile 하는 시점에서 논리적으로는 문제가 없지만 실제 객체의 정확한 상태를 알 수 없기 때문에 상위형선언된 객체를 하위형으로 변환할 경우는 runtime 시에 에러가 발생하게 된다.

strA라는 이름의 변수가 상속받는다하여 메소드처럼 override가 되지 않으며 엄연히 상위클래스와 하위클래스의 변수는 각각의 클래스에 대한 멤버 변수로서 구분되어 존재하게 된다. (이 부분이 동일 이름의 경우 override되는 메소드와 구분되는 차이점이다.)

반면 메소드의 경우 override가 되면 더이상 상위 메소드를 호출하는 것은 불가능하다는 것을 알 수 있다.

위의 테스트를 진행한 결과는 아래와 같다.
----------기본호출-----------------------------------------
ca.strA					= strA
cea.strA				= strExA
cea2.strA				= strA
ca.methodA()				= methodA
cea.methodA()				= methodExA
cea2.methodA()				= methodExA
-----------------------------------------------------------
----------형변환호출---------------------------------------
((ClassA) cea).strA			= strA
((ClassExtendA) cea2).strA		= strExA
((ClassA) cea).methodA()		= methodExA
((ClassA) cea2).methodA()		= methodExA
-----------------------------------------------------------
-----상위 클래스에만 존재하는 변수, 메소드 호출--------------
ca.strA2				= strA2
cea.strA2				= strA2
cea2.strA2				= strA2
ca.methodA2()				= methodA2
cea.methodA2()				= methodA2
cea2.methodA2()				= methodA2
----캐스트 형변환시 상위 클래스에만 존재하는 변수, 메소드 호출-
((ClassA) cea).strA2			= strA2
((ClassExtendA) cea2).strA2		= strA2
((ClassA) cea).methodA2()		= methodA2
((ClassA) cea2).methodA2()		= methodA2
-----------------------------------------------------------
----형변환 시 하위 클래스에만 존재하는 변수, 메소드 호출-
-----------------------------------------------------------
반응형
profile

파란하늘의 지식창고

@Bluesky_

도움이 되었다면 광고를 클릭해주세요