레퍼런스(참조형) 형변환
- 어떤 객체를 다른 타입으로 변환하는 것 (슈퍼클래스타입 <-> 서브클래스타입)
- 업캐스팅(Up Casting) 과 다운캐스팅 (Down Casting) 으로 구분됨
1. 업캐스팅(Up Casting)
- 슈퍼클래스 타입 레퍼런스로 서브클래스의 인스턴스를 참조하는 것
= 서브클래스의 인스턴스를 슈퍼클래스 타입으로 변환 하는것
- 컴파일러에 의해 자동 형변환 일어남(= 묵시적 형변환)
- 참조 가능한 영역이 축소됨
- 서브클래스 인스턴스의 멤버 중 공통 항목을 제외한 나머지에 대한 포기 선언을 하는 것
= 대신, 하나의 슈퍼클래스 타입으로 여러 서브클래스 인스턴스를 참조할 수 있다!
2. 다운캐스팅(Down Casting)
- 서브클래스 타입 레퍼런스로 슈퍼클래스의 인스턴스를 참조하는 것
= 슈퍼클래스의 인스턴스를 서브클래스 타입으로 변환하는 것
- 컴파일러에 의해 자동 형변환이 일어나지 않음
= 강제 형변환(명시적 형변환) 필수
- 참조 가능한 영역이 확대됨
= 존재하지 않는 영역에 대한 참조 위험성 때문에 명시적 형변환 후에도 오류가 발생할 수 있다
- 이전에 이미 업캐스팅 된 레퍼런스를 다시 다운캐스팅 하는 경우에만 안전하므로
객체간의 상속 관계를 고려하여 캐스팅해야 한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
HandPhone hp = new SmartPhone("갤럭시", "010-1234-4555", "안드로이드");
hp.call();
hp.sms();
// hp.kakoTalk(); 오류 발생
// hp.youtube(); 오류 발생
HandPhone 어머니폰 = new SmartPhone("갤럭시", "010-1234-4555", "안드로이드"); // 업캐스팅
SmartPhone 내폰 = (SmartPhone)어머니폰; //
내폰.call();
내폰.sms();
내폰.kakaoTalk();
내폰.youtube();
class HandPhone {
String modelName;
String number;
public HandPhone(String modelName, String number) { // Alt Shift S / O
super();
this.modelName = modelName;
this.number = numbe;
}
public void call() {
System.out.println("HandPhone의 전화 기능!");
}
public void sms() {
System.out.println("HandPhone의 문자 기능!");
}
}
class SmartPhone extends HandPhone {
String osName;
public SmartPhone(String modelName, String number, String osName) {
super(modelName, number);
this.osName = osName;
}
public void kakaoTalk() {
System.out.println("SmartPhone 의 카톡 기능!");
}
public void youtube() {
System.out.println("SmartPhone 의 유튜브 기능!");
}
}
|
cs |
'Language > Java' 카테고리의 다른 글
instanceof 연산자 (0) | 2020.06.09 |
---|---|
캐스팅 (0) | 2020.06.09 |
생성자 super() (0) | 2020.06.05 |
레퍼런스 super (0) | 2020.06.05 |
접근제한자 (0) | 2020.06.05 |