Question 5 : 클래스의 형변환

Given:
10. interface Foo {}
11. class Alpha implements Foo { }
12. class Beta extends Alpha {}
13. class Delta extends Beta {
14.      public static void main( String[] args) {
15.           Beta x = new Beta();
16.           // insert code here
17.      }
18. }

Which code, inserted at line 16, will cause a java.lang.ClassCastException?

A. Alpha a = x;
B. Foo f= (Delta)x;
C. Foo f= (Alpha)x;
D. Beta b = (Beta)(Alpha)x;

[Head First Java - p.263]
# 클래스를 만들 때 인스턴스를 만들 수 없게 하고 싶다면(즉, 그 클래스 유형의 객체를 만들 수 없게 하고 싶다면) abstract 키워드를 사용하면 됩니다.
# 추상 클래스에는 추상 메소드와 추상 메소드가 아닌 메소드를 모두 집어넣을 수 있습니다.
# 클래스에 추상 메소드가 하나라도 있으면 그 클래스는 추상 클래스로 지정해야 합니다.
# 추상 메소드에는 본체가 없으며 선언 부분은 세미콜론으로 끝납니다(중괄호를 쓰지 않습니다).
# 상속 트리에서 처음으로 나오는 구상 클래스에서는 반드시 모든 추상 메소드를 구현해야 합니다.
# 자바에 들어있는 모든 클래스는 직접 또는 간접적으로 Object(java.lang.Object)의 하위클래스입니다.
# 메소드를 선언할 때 인자, 리턴 유형을 Object로 지정해도 됩니다.
# 어떤 객체에 대해서 메소드를 호출하려면 그 객체를 참조하는 레퍼런스 변수 유형의 클래스(또는 인터페이스)에 그 메소드가 있어야만 합니다. 객체의 실제 유형하고는 무관합니다. 따라서 Object 유형의 레퍼런스 변수로는 Object 클래스에 정의되어 있는 메소드만 호출할 수 있습니다. (레퍼런스가 참조하는 객체의 유형과는 무관합니다.)
# Object 유형의 레퍼런스 변수는 캐스팅을 하지 않고는 다른 유형의 레페런스에 대입할 수 없습니다. 한 유형의 레퍼런스 변수를 하위 유형의 레퍼런스 변수에 대입하고 싶다면 캐스팅을 이용할 수 있습니다. 하지만 힙에 들어있는 객체가 캐스팅 호환 가능한 유형이 아니라면 실행 중에 캐스팅에 실패할 수도 있습니다.

[Internet]
http://blog.naver.com/sjmpropose?Redirect=Log&logNo=44466628
객체 형변환, 상속 관계에서의 생성자

http://raoo.tistory.com/entry/추상클래스와-클래스-형변환에-대한-간단한-예제
추상클래스와 클래스 형변환에 대한 예제

Answer: B
반응형

'잘난놈되기 > SCJP' 카테고리의 다른 글

Q007. 접근제어자  (0) 2008.03.25
Q006. Format 클래스  (0) 2008.03.24
Q004. 예외처리  (0) 2008.03.23
Q003. 실행문  (0) 2008.03.23
Q002. 실행문  (0) 2008.03.23

+ Recent posts