언어/Java

업캐스팅 , 다운캐스팅이란?

DH_PARK 2024. 9. 25. 00:38

아마 자바 기본 문법을 배우면서 가장 이해가 안되고 어려운 부분인것 같다.

어렵다기보다는 머리로는 이해하겠는데 자꾸 왜?? 라는 질문이 생긴다.

대체 왜 이걸 사용해야 하는가 , 이걸 사용하면 어떤 면에서 좋은건가.

그래도 머리 좋은 사람들이 만든 것이니 분명 무슨 이유가 있겠지.

 

그럼 한번 알아보자.

 


 

우선 클래스도 자료형이라는 사실을 알고있어야 한다.

그렇기 때문에 우리는 자료형을 바꿀 때 형변환(캐스팅)이라는 것을 한다.

 

하나의 데이터 타입을 다른 타입으로 바꾸는 것을 타입 변환 혹은 형변환(캐스팅) 이라고 한다.

출처: https://inpa.tistory.com/entry/JAVA-☕-업캐스팅-다운캐스팅-한방-이해하기 [Inpa Dev 👨‍💻:티스토리]

 

 

업캐스팅(Upcasting) : 하위클래스 객체를 상위클래스 타입으로 변환 하는것

 

업캐스팅 하는 이유

이처럼 업캐스팅 하는 방법과 특징과 주의점은 알겠지만 정작 왜 하는지는 모호할 것이다.

결론부터 말하자면, 업캐스팅을 사용하는 이유는 공통적으로 할 수 있는 부분을 만들어 간단하게 다루기 위해서이다. 

상속 관계에서 상속 받은 서브 클래스가 몇 개이든 하나의 인스턴스로 묶어서 관리할 수 있기 때문이다.

출처: https://inpa.tistory.com/entry/JAVA-☕-업캐스팅-다운캐스팅-한방-이해하기 [Inpa Dev 👨‍💻:티스토리]

 

Rectangle[] r = new Rectangle[];
r[0] = new Rectangle();
r[1] = new Rectangle();

Triangle[] t = new Triangle[];
t[0] = new Triangle();
t[1] = new Triangle();

Circle[] c = new Circle[];
c[0] = new Circle();
c[1] = new Circle();

본래 Rectangle , Triangle , Circle 은 서로 다른 타입이기 때문에 각각 타입을 정의해서 사용해야 한다.

Shape[] s = new Shape[];
s[0] = new Rectangle();
s[1] = new Rectangle();
s[2] = new Triangle();
s[3] = new Triangle();
s[4] = new Circle();
s[5] = new Circle();

하지만 업캐스팅이 사용가능하다면 이렇게 하나의 타입으로 묶어서 관리할 수 있게 된다.


 

다운캐스팅(Downcasting) : 상위클래스 타입으로 캐스팅된 객체를 다시 하위클래스로 변환 시키는 것.

 

다운 캐스팅의 진정한 의미는 부모 클래스로 업 캐스팅된 자식 클래스를 복구하여, 본인의 필드와 기능을 회복하기 위해 있는 것이다. 즉, 원래 있던 기능을 회복하기 위해 다운캐스팅을 하는 것이다. 

출처: https://inpa.tistory.com/entry/JAVA-☕-업캐스팅-다운캐스팅-한방-이해하기 [Inpa Dev 👨‍💻:티스토리]

 

다운캐스팅을 사용하는 이유 : 업캐스팅된 자식객체에서 원래 자식 객체에만 있는 특별한 메소드를 사용하려고 할 때 다운캐스팅을 사용해서 메소드를 실행한다.

이 때 캐스팅 연산자를 업캐스팅과는 다르게 생략할 수 없는데, 이것에는 이유가 있다.

다운캐스팅은 사용할 수 있는 객체 멤버 증가를 의미하는데 , 멤버의 증가는 불안전하다.

왜냐하면 실제 참조변수가 가리키는 객체가 무엇인지 모르기 때문에 어떠한 멤버가 추가 되는지 알수가 없다.

그래서 반드시 형변환 괄호를 써줌으로써 증가된 클래스의 멤버가 무엇인지 알게 하도록 개발자한테 알려줘야 하기 때문이다.

 

 

다운캐스팅을 할 시에 주의점 : 다운캐스팅은 업캐스팅된 객체를 다시 되돌리기 위해 사용하는 것이다.

하지만 업캐스팅된 객체가 아니라 처음부터 타입이 부모 타입으로 생성된 객체라면 다운캐스팅을 사용하는 것이 불가능하다.

 

이 때 좀 더 안전하게 다운캐스팅을 하기 위해 사용하는 연산자가 있는데 이것이 instanceof 연산자이다.

이 연산자는 어느 객체 변수가 어느 클래스 타입인지 판별해 true/false를 반환해준다.

이 연산자는 어느 객체 변수가 어느 클래스 타입인지 판별해 true/false를 반환해준다.

출처: https://inpa.tistory.com/entry/JAVA-☕-업캐스팅-다운캐스팅-한방-이해하기 [Inpa Dev 👨‍💻:티스토리]

 

추가로 유의할 점 :

형제클래스끼리는 아예 타입이 다르기 때문에 형변환이 불가능하다.

'언어 > Java' 카테고리의 다른 글

Java 제네릭이란?  (0) 2024.09.30
접근한정자란?  (0) 2024.09.30
추상클래스와 interface 의 차이?  (0) 2024.09.23
생성자란?  (0) 2024.09.23
Java 의 기본 . Class  (0) 2024.09.23