본문 바로가기

develop/Java

레퍼런스 형변환

앞에서 기본형타입끼리의 형변환을 배웠고

이번엔 참조형 데이터타입끼리의 형변환을 배워보고자 한다. 

 

이 형변환은 상속 관계에서만 가능함.

그리고 1. 업캐스팅 2.다운캐스팅으로 나뉨

 

이 형변환은 참조형 변수로 다른 타입 인스턴스(객체)를 참조하기 위해 변환하는 것

 

 

1. 업캐스팅

서브클래스(down)의 인스턴스를 슈퍼클래스(up) 타입으로 변환하는 것으로 아래에서 위로 변환되기에

업캐스팅이라고 한다. 업캐스팅을 통해 슈퍼클래스의 레퍼런스가 서브클래스의 인스턴스를 가리킬 수 있다.

작은 곳에서 큰 곳으로 이동하기 때문에 별도의 처리 없이 컴파일러가 자동으로 형변환을 처리한다. 

 

참조 가능한 영역이 축소된다.

이유는 슈퍼클래스로부터 상속된 멤버에는 접근 가능하고, 서브클래스에서 추가적으로 생성된 멤버에는 접근이 불가능함.

따라서 참조 가능한 영역이 축소되는 것.

//서브클래스 인스턴스 생성
Child c = new Child();
//슈퍼클래스의 메서드가 1개, 서브클래스는 1개가 있다고 가정하면, c로 접근 가능한 메서드는 2개

Parent P;
p = c;

혹은

Parent p = c;
//서브클래스 인스턴스 주소를 슈퍼클래스 타입 p에 저장
//슈퍼클래스 타입 변수가 서브클래스 인스턴스를 가리킴
//=>자식타입을 부모타입으로 변환 = 업캐스팅 = 자동형변환
//p로 접근 가능한 메서드 1개
p.parentPrn();

 

 

2. 다운캐스팅

슈퍼클래스(up)의 인스턴스를 서브클래스(down) 타입으로 변환하는 것으로 위에서 아래로 변환되기에

다운캐스팅이라고 한다. 다운캐스팅을 통해 서브클래스의 레퍼런스가 슈퍼클래스의 인스턴스를 가리킬 수 있다.

큰 곳에서 작은 곳으로 이동하기 때문에 자동 형변환이 일어나지 않고 강제로 형변환을 시켜줘야 한다. 

 

//서브클래스의 레퍼런스가 슈퍼클래스의 인스턴스를 가리키는 것
//= 슈퍼클래스의 인스턴스를 서브클래스 타입으로 변환하는 것
//묵시적 형변환이 일어나지 않음 = 자동 형변환 불가
//반드시 형변환 연산자 사용

//child -> parent 업캐스팅(자동형변환)
Parent p2 = new Child();

p2... 접근 가능한 메서드 1개


Child c = (Child)p2;
다운캐스팅에 의해 참조가능한 영역이 확대되므로

c... 접근 가능한 메서드 2개

이전에 이미 업캐스팅 된 인스턴스의 레퍼런스를 다시

다운캐스팅하는 경우에만 안전하다!

 

 

이해하기 쉽게 

 

부모님이 피처폰(기능 2개)을 사용하고

나는 스마트폰(기능 100개)을 사용할 때

 

부모님폰 -> 내 폰

부모님께 내 휴대폰을 빌려드리면 부모님은 전화,문자 기능 2개밖에 사용하지 못하셔서

스마트폰을 들고계서도 스마트폰의 기능을 활용하지 못한다 => 업캐스팅

 

내 폰 -> 부모님폰

내가 부모님의 피처폰을 사용하게 되면 스마트폰의 여러 기능을 이용할 줄 알지만

피처폰에는 그에 맞는 기능들이 존재하지 않기 때문에 활용하지 못한다 => 다운캐스팅

 

 

 

 

 

'develop > Java' 카테고리의 다른 글

final 키워드, 상수  (0) 2021.03.11
instanceof 연산자,동적바인딩  (0) 2021.03.08
생성자 super  (0) 2021.03.06
메서드 오버라이딩(Method Overriding)  (0) 2021.03.03
접근 제한자(Access Modifier)  (0) 2021.03.01