객체캐스팅이란 다형성을 구현하는 과정이라고 할 수 있습니다.
객체캐스팅을 설명하기 위해서는 다형성의 개념을 설명해야 한다고 생각합니다. 왜냐하면 다형성이 있기 때문에 객체캐스팅이 있다고 할 수 있기 때문입니다. 그래서 간단하게 설명하면 다형성은 다양한 형태를 나타내는 성질을 말하는데 객체지향에서는 논리적으로 하나의 객체를 다수의 객체타입으로 표현 가능하다는 의미입니다. 이러한 다형성을 자바에서는 객체캐스팅을 통해 구현 할 수 있습니다.
예를 들면 찌개는 끓여먹는 것입니다.
끓여먹는 것 중에는 라면, 찌개 등등 매우 많은 것들이 있고 그 중에 찌개가 포함됩니다. 즉 누군가가 "끓여먹는 것 좀 줘!" 할 때 라면을 줄 수도 있고 찌개를 줄 수도 있는 것이겠지요. 이렇게 현실세계의 객체는 다양한 특성을 가지고 있고 이러한 다형성을 나타내는 하나의 과정이 객체캐스팅입니다.
객체캐스팅은 크게 upcasting과 downcasting이 있습니다.
upcasting으로 객체를 캐스팅 할 때는 그 객체의 상위 타입으로만 캐스팅이 가능하며 auto-casting이 일어납니다. 기본적으로 설계시점에 일반화 과정에서 나오는 추상클래스를 통해서 parametric polymorphism을 구현하는데 사용이 됩니다.
L=R
위와 같이 대입이 일어날 경우 upcasting은 L이 중심일 때 R은 L의 sub클래스타입만 가능하고, R을 중심으로 할 때 L은 R의 super클래스와 직간접적인 인터페이스의 타입만이 가능합니다.
하지만 객체를 상위 타입으로 캐스팅을 하였을 때는 그 상위타입에 정의되어 있는 메소드들만이 접근이 가능합니다. 즉, 접근이 제한받습니다.
A extends B로 상속 받고
A a=new B()로 캐스팅한다면
컴파일러는 A타입의 a로 인식을 하게 되고 메모리상에서 실질적으로 a가 인스턴스화 될 때 virtual invocation(this우선)이 heap영역에 B클래스로 메모리가 잡습니다. 그리고 실제로 프로그램 수행시에는 B클래스의 메소드를 호출하게 됩니다.
하지만 a는 A클래스타입으로 선언되어 있기 때문에 a는 A클래스에서 B클레스로 오버라이딩된 메소드만 접근이 가능합니다.
결론적으로 a는 A클래스타입의 객체이지만 a의 참조값을 가보면 B클래스가 heap메모리에 인스턴스화되어 있고 실질적으로 접근가능한 메소드는 A클래스에서 B클래스로 오버라이딩된 메소드만이 접근가능합니다.
downcasting은 자동형변환이 안되고 강제형변환을 해야합니다.
A extends B 관계이고
A a=new B();이면
이 경우 upcasting에서 설명했듯이 a는 A클래스에서 B클레스로 오버라이딩된 메소드 말고는 접근이 불가능 합니다. 하지만 a는 메모리상으로는 B클래스로 인스턴스화 되어 있기 때문에 a를 B클래스로 downcasting을 한다면 a는 B클래스에 있는 모든 메소드에 접근 할 수 있게 됩니다.
(B)a
위와 같이 일반 primitive데이터를 캐스팅 하듯이 하면 됩니다. 하지만 downcasting 시에는 a인스턴스에 실제로 인스턴스화되어 있는 B클레스의 부모만이 가능하며 A클레스의 sub클래스만이 가능합니다.
downcasting은 강제로 하는 만큼 형반환의 가능성을 확인해주는 instanceof라는 연산자가 있습니다.
a instanceof B
위와 같이 사용하였을 때 캐스팅이 가능하면 true를 반환하고 불가능하면 false를 반환하는 연산자입니다.
Parametric polymorphism을 구현했을 때 특정 인스턴스에만 추가기능을 사용하고 싶을 때 instanceof연산자를 통해 수행할 수 있습니다.
'IT > 개발' 카테고리의 다른 글
enum type & static final (0) | 2013.08.18 |
---|---|
오버라이딩(overriding) (0) | 2013.08.17 |
인터페이스(interface) (0) | 2013.08.16 |
추상클래스(abstract class) (0) | 2013.08.16 |
다형성(polymorphism) (0) | 2013.08.15 |