레퍼런스 형변환이란?
- 참조형 변수끼리의 형변환
- 업캐스팅과 다운캐스팅으로 나뉨
- 참조형 변수로 다른 타입의 인스턴스를 참조하기 위해 변환하는 것
1. 업캐스팅 (UpCasting)
- 슈퍼클래스의 레퍼런스가 서브클래스의 인스턴스를 가리키는 것
- 묵시적 형변환(자동)이 일어남
- 참조 가능한 영역의 축소 발생 (슈퍼클래스로부터 상속된 멤버에만 접근 가능하고, 서브클래스 멤버 접근 불가)
아래 예문을 기준으로 설명 스타트!!
class Parent {
public void parentPrn() {
System.out.println("슈퍼클래스의 parentPrn()");
}
}
class Child extends Parent {
public void childPrn() {
System.out.println("서브클래스의 childPrn()");
}
}
Child c = new Child(); // 서브클래스 Child의 인스턴스 생성
c.parentPrn();
c.childPrn();
// 서브클래스 Child는 슈퍼클래스 Parent로 부터 상속 받았으므로 사용 가능한 메서드는 2개이다
/* 업캐스팅 */
Parent p; // 슈퍼클래스 타입 레퍼런스 변수 선언
p = c; // 서브클래스의 인스턴스 주소를 슈퍼클래스 타입 변수에 저장 => 업캐스팅
즉, 슈퍼클래스 타입 변수(p)가 서브클래스 인스턴스(c)를 참조하게 되는 것을 업캐스팅이라고 한다
그렇다면 업캐스팅 된 이후 상속된 멤버에만 접근 가능하게 범위가 축소 되었으므로
슈퍼클래스 타입 변수(p)가 사용할 수 있는 메서드는 하나뿐이다 ( parentPrn() )
2. 다운캐스팅 (DownCasting)
- 서브클래스의 레퍼런스가 슈퍼클래스의 인스턴스를 가리키는 것
- 참조 가능한 영역의 확대 발생
- 명시적 형변환(강제) 필요
- 명시적 형변환을 통해 구문 오류가 해결되더라도 실제 실행 시점에서 오류가 발생함 (존재하지 않는 영역의 참조 위험성 때문)
결론
- 이전에 이미 업캐스팅 된 레퍼런스를 다시 다운캐스팅하는 경우에만 안전하다
- 업캐스팅을 반대로 하면 다운캐스팅이 되는 것이다
'BackEnd > Java' 카테고리의 다른 글
동적바인딩과 다형성(polymorphism) (0) | 2020.03.16 |
---|---|
같은 참조 타입인지 확인하는 instanceof 연산자 (0) | 2020.03.16 |
메서드 오버라이딩 (Overriding) (0) | 2020.03.16 |
접근제한자 (0) | 2020.03.16 |
상속 (Inheritance) (0) | 2020.03.16 |