본문 바로가기

BackEnd/Java

레퍼런스 형변환 (업캐스팅, 다운캐스팅)

레퍼런스 형변환이란?

- 참조형 변수끼리의 형변환

- 업캐스팅과 다운캐스팅으로 나뉨

- 참조형 변수로 다른 타입의 인스턴스를 참조하기 위해 변환하는 것

 

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