본문 바로가기

IT/개발

객체(object) 캐스팅(casting)

객체캐스팅이란 다형성을 구현하는 과정이라고 할 수 있습니다.

 

객체캐스팅을 설명하기 위해서는 다형성의 개념을 설명해야 한다고 생각합니다. 왜냐하면 다형성이 있기 때문에 객체캐스팅이 있다고 할 수 있기 때문입니다. 그래서 간단하게 설명하면 다형성은 다양한 형태를 나타내는 성질을 말하는데 객체지향에서는 논리적으로 하나의 객체를 다수의 객체타입으로 표현 가능하다는 의미입니다. 이러한 다형성을 자바에서는 객체캐스팅을 통해 구현 할 수 있습니다.

 

예를 들면 찌개는 끓여먹는 것입니다.

 

끓여먹는 것 중에는 라면, 찌개 등등 매우 많은 것들이 있고 그 중에 찌개가 포함됩니다. 즉 누군가가 "끓여먹는 것 좀 줘!" 할 때 라면을 줄 수도 있고 찌개를 줄 수도 있는 것이겠지요. 이렇게 현실세계의 객체는 다양한 특성을 가지고 있고 이러한 다형성을 나타내는 하나의 과정이 객체캐스팅입니다.

 

객체캐스팅은 크게 upcasting과 downcasting이 있습니다.

upcasting으로 객체를 캐스팅 할 때는 그 객체의 상위 타입으로만 캐스팅이 가능하며 auto-casting이 일어납니다. 기본적으로 설계시점에 일반화 과정에서 나오는 추상클래스를 통해서 parametric polymorphism을 구현하는데 사용이 됩니다.

L=R

위와 같이 대입이 일어날 경우 upcastingL이 중심일 때 R Lsub클래스타입만 가능하고, R을 중심으로 할 때 L Rsuper클래스와 직간접적인 인터페이스의 타입만이 가능합니다.

하지만 객체를 상위 타입으로 캐스팅을 하였을 때는 그 상위타입에 정의되어 있는 메소드들만이 접근이 가능합니다. 즉, 접근이 제한받습니다.

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에서 설명했듯이 aA클래스에서 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