본문 바로가기
Language/Java

레퍼런스(참조형) 형변환

by 태윤2 2020. 6. 5.

레퍼런스(참조형) 형변환

- 어떤 객체를 다른 타입으로 변환하는 것 (슈퍼클래스타입 <-> 서브클래스타입)

- 업캐스팅(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