본문 바로가기
Java/Java

[Java]타입 변환과 다형성

by 전재경 2022. 11. 30.

다형성

여러 가지 형태를 가질 수 있는 능력, 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함으로써

다형성을 프로그램 적으로 구현.

부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 한다.

 

ex)타이어 사용법은 모두 같지만 자동차에 어떤 타이어(객체)를 사용하느냐에 따라 성능이 달라짐.

 

다형성을 구현하려면 메소드 재정의와 타입 변환이 필요

 

메소드 재정의 + 타입변환 => 다형성

 

자동 타입 변환

다른 타입으로 변환하는 행위

클래스도 마찬가지로 타입 변환이 있는데, 클래스의 변환은 상속관계에 있는 클래스 사이에서 발생

자식은 부모타입으로 자동 타입 변환이 가능

 

B b = new B();
C c = new C();
D d = new D();
E e = new E();
A a1 = b;	//가능
A a2 = c;	//가능
A a3 = d;	//가능
A a4 = e;	//가능

B b1 = d;	//가능
C c1 = e;	//가능

B b3 = e;	//불가능
C c2 = d;	//불가능

모두 타입변환이 가능하지만 D객체는 C 타입으로 변환할 수 없고, E 객체는 B타입으로 변환될 수 없다.

이유는 상속 관계가 아니기 때문이다.

 

 

필드의 다형성

 

자동타입이 필요한 이유는 다형성을 구현하기 위해서이다.

필드의 타입을 부모 타입으로 선언하면 다양한 자식 객체들이 저장될 수 있기 때문에 필드 사용 결과가 달라질 수 있다.

이것이 필드의 다형성이다.

자동차를 예로 들어보자. 자동차를 구성하는 부품은 언제든 교체할 수 있다.

고장이 날수도 있고, 성능이 더 좋은 부품으로 교체될 수도 있다.

프로그램은 수많은 객체들이 서로 연결되고 각자의 역할을 하게 되는데, 이 객체들은 다른 객체로

교체될 수 있어야 한다.

 

public class Car {

    Tire frontLeftTire = new Tire();
    Tire frontRightTire = new Tire();
    Tire backLeftTire = new Tire();
    Tire backRightTire = new Tire();
    
}

public class Driver{
    public static void main(String[] args){
        Car Qm6 = new Car();
        Qm6.frontLeftTire = new KumhoTire();
        Qm6.backRightTire = new HankookTire();
        
        //Car 타입의 Qm6 객체를 정의 하였으며 앞 2바퀴를 한국,금호 타이어 객체를 사용하여 대입
        //한국, 금호 클래스 객체를 넣어도 문제가 없는 이유는 Car클래스에서 각각 타입이
        //Tire(부모)라 자동형변환이 되었다.
    }
}

public class HankookTire extends Tire{      //Tire 클래스를 상속받은 한국타이어
    public void changetire(){
        System.out.println("한국타이어");
    }
}

public class KumhoTire extends Tire{        //Tire 클래스를 상속받은 금호타이어
    public void changetire(){
        System.out.println("금호타이어");
    }
}

 

매개 변수의 다형성

자동 타입 변환은 필드의 값을 대입할 때에도 발생하지만 주로 메소드를 호출할 때 많이 발생

메소드를 호출할 때에는 매개 변수의 타입과 동일한 매개값을 지정하는 것이 정석,

매개값을 다양화 하기 위해 매개 변수에 자식 객체를 지정할 수도 있다.

 

public class Driver1{               //Driver 클래스는 설계시 driver메소드 파라미터로 vehicle타입을 가지고 왔다.
    public void driver1 (Vehicle vehicle){
        vehicle.run();
    }
}

public class Vehicle{
    public void run(){
        System.out.println("차량이 달립니다.");
    }
}

public class Bus extends Vehicle{       //Vehicle를 상속받은 Bus는 Run 메소드를 오버라이드
    @Override
    public void run(){
        System.out.println("버스가 달립니다.");
    }
}

public class Taxi extends Vehicle{       //Vehicle를 상속받은 Taxi는 Run 메소드를 오버라이드
    @Override
    public void run(){
        System.out.println("택시가 달립니다.");
    }
}

public DriverEx{
    public static void main(String[] args){
        Driver1 sungman = new Driver1();
        
        Bus mybus = new Bus();
        Taxi mytaxi = new Taxi();
        
        sungman.driver1(mytaxi);
        sungman.driver1(mybus);
    }
}
//sungnama 객체에서 driver1함수 호출 파라미터로 Bus, Taxi객체를 대입
// 대입이 가능한 이유는 Driver1 클래스 설계 시 부모 타입의 Vehicle로 설계 되었기 때문

필드,매개변수 다형성에 대한 공통점은 

부모타입을 상속받은 자식타입 객체가 부모타입에 대입도 문제가 없다는것을 보여준다.(자동형변환)

'Java > Java' 카테고리의 다른 글

[Java] 인터페이스(Interface)  (0) 2022.12.05
[Java] 추상 클래스, 메소드  (0) 2022.12.02
[Java] 상속  (0) 2022.11.30
[Java]public static void  (0) 2022.11.27
[Java]오버라이딩 (Override)  (0) 2022.11.27

댓글