본문 바로가기

프로그래밍/Java

Java_객체지향언어(6)_다형성, 참조변수의 형변환

반응형

① 다형성

: 다형성이란 조상타입 참조변수로 자손 타입 객체를 다루는 것이다. 

class Tv{
    boolean power;
    int channel;
    
    void power() {power=!power;}
    void channelUp() {++channel;}
    void channelDown() {--channel;}
}

class SmartTv extends Tv{
    String text;
    void caption() {//내용생략}
}

Tv t= new Tv();	//Tv인스턴스를 다루기 위한 참조변수 t 사용. 
SmartTv stv= new SmartTv();	//SmartTv인스턴스를 다루기 위한 참조변수 stv 사용.

Tv t= new SmartTv();	//타입 불일치! 조상 타입의 참조변수로 자손 인스턴스 참조. 가능!

SmartTv stv= new Tv();	//자손 타입의 참조변수로 조상 인스턴스 참조는 불가능! 에러

→ 둘 다 같은 타입의 인스턴스지만 참조변수의 타입에 따라 사용할 수 있는 멤버의 개수가 달라진다. 

→ Tv t= new Tv(); 는 Tv클래스에 있는 인스턴스만 사용 가능하고 SmartTv클래스의 인스턴스는 사용할 수 없다. 

Tv t=new SmartTv(); 는 Tv클래스뿐만 아니라 SmartTv클래스의 인스턴스(text, caption())도 사용 가능하다. 

 

② 참조변수의 형변환

: 사용할 수 있는 멤버의 갯수를 조절하는 것이다. (상속 관계의 참조변수는 서로 형변환이 가능하다.)

class Car { }
class FireEngine extends Car { }
class Ambulance extends Car { }

→ FireEngine과 Ambulance는 상속관계가 아니므로 형변환이 불가능하다. 

class Ex7_7 {
    public static voidd main(String args[]){
        Car car=null;
        FireEngine fe=new FireEngine();
        FireEngine fe2=null;
    
        fe.water();
        car=fe;		//car={Car)fe;에서 형변환이 생략됨.
//      car.water(); car타입의 참조변수로 water()를 호출할 수 없음.
        fe2=(FireEngine)car;	//조상타입 → 자손타입 형변환 생략 불가. 
        fe2.water();
    }
}

class Car{
    String color;
    int door;
    
    void drive(){
        System.out.println("Brrr");
    }
    void stop(){
        System.out.println("stop");
    }
}

class FireEngine extends Car{
    void water(){
        System.out.println("water");
    }
}
FireEngine f= new FireEngine();	//인스턴스 개수: 5개

Car c=(Car)f;	//인스턴스 개수: 4개 (생략가능)
FireEngine f2=(FireEngine)c;	//인스턴스 개수: 5개 (생략불가)

Ambulance a=(Ambulance)f;	//에러, 상속관계가 아닌 클래스 간의 형변환 불가.

→ 인스턴스 개수가 형변환을 함으로써 감소하면 안전하기에 형변환이 생략이 가능하다.

반대로 인스턴스 개수가 형변환을 함으로써 증가하면 안전하지 않기 때문에 형변환을 해줘야 한다. 

 

 

<내용정리> 

Q. 참조변수의 타입은 인스턴스의 타입과 반드시 일치해야 하나요?

A. 아니요.

Q. 참조변수가 조상타입일 때와 자손타입일 때의 차이는 무엇인가요?

A. 참조변수로 사용할 수 있는 멤버의 갯수가 달라집니다.

Q. 자손타입의 참조변수로 조상 타입의 객체를 가리킬 수 있나요?

A. 아니요. 

반응형